Метод MimeMessageHelper.addAttachment() не добавляет вложение к MimeMessage.JAVA

Программисты JAVA общаются здесь
Anonymous
Метод MimeMessageHelper.addAttachment() не добавляет вложение к MimeMessage.

Сообщение Anonymous »

Я пытаюсь создать mailSender, способный отправлять электронные письма с вложениями, используя библиотеки jakarta.mail и org.springframework.mail.
Я использую public void addAttachment(String AttachmentFilename, DataSource dataSource ) из объекта MimeMessageHelper, чтобы добавить вложение к MimeMessage. К сожалению, это не работает — никаких исключений не выдается, но MimeMessage не содержит никаких вложений после этой операции, и отправленное электронное письмо также не имеет назначенных вложений. По крайней мере, я не нашел данных вложения внутри MimeMessage с помощью отладчика + я получаю электронное письмо без вложения в свой почтовый ящик.
Это может быть важно - я углубился в addAttachment во время отладки, и я обнаружил, что внутри метода создан новый экземпляр DataHandler с ByteArrayDataSource (мое вложение). Затем этот обработчик добавляется в MimeBodyPart, который затем добавляется в корневой элемент MimeMultipart внутри MimeMessageHelper. Я не уверен, но думаю, что этот MimeMultipart должен присутствовать внутри MimeMessage, переданного конструктору messageHelper в моем useCase. К сожалению, я вижу в своем экземпляре MimeMessage после операции addAttachment, что существует экземпляр DataHandler с нулевым полем dataSource вместо этого нового созданного. Похоже, что операция addAttachment просто игнорируется. Но, может быть, я что-то не так понял?
Вот код используемых в процессе юзекейсов:

Код: Выделить всё

public interface SendEmailUseCase {
EmailSendingResult execute(Command command);

record Command(
String sendToAddress,
String replyToAddress,
String ccAddress,
String bccAddress,
String fromAddress,
String subject,
String contentText,
List attachments
) {}
}

Код: Выделить всё

@CustomLog
@Service
@RequiredArgsConstructor
public class SendEmailUseCaseHandler implements SendEmailUseCase {

private final JavaMailSender emailSender;
private final DecodeBase64FileIntoDataSourceUseCase decodeBase64FileIntoDataSourceUseCase;

@Override
public EmailSendingResult execute(Command command) {
try {
if (!MailConfig.IS_SENDING_ACTIVE)
return EmailSendingResult.emailNotSentWithoutError();

final MimeMessage messageToSent = prepareEmail(command);
log.info("Sending Email...");
emailSender.send(messageToSent);
log.info("Email with subject: " + messageToSent.getSubject() + " has been sent to: " +
Arrays.toString(messageToSent.getRecipients(Message.RecipientType.TO)));
return EmailSendingResult.emailSent();
} catch (CommonServicesException | MessagingException ex) {
log.info("Email with subject: " + command.subject() + " has not been sent");
log.catching(Level.ERROR, ex);
return EmailSendingResult.emailNotSentWithError(ex);
}
}

private MimeMessage prepareEmail(Command command) {
try {
log.info("Preparing email to send...");
final String mailFrom = command.fromAddress().isBlank() ? MailConfig.MAIL_FROM : command.fromAddress();

final MimeMessage message = emailSender.createMimeMessage();
final MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo(splitAddresses(command.sendToAddress()));
message.setReplyTo(splitAddresses(command.replyToAddress()));
helper.setCc(splitAddresses(command.ccAddress()));
helper.setBcc(splitAddresses(command.bccAddress()));
helper.setFrom(mailFrom);
helper.setSubject(MimeUtility.encodeText(command.subject(), "utf-8", "B"));
message.setText(command.contentText(), "windows-1250","html");

if (command.attachments() == null)
return message;

for (EmailAttachment att : command.attachments()) {
final DataSource processedAtt = decodeBase64FileIntoDataSourceUseCase.execute(
new DecodeBase64FileIntoDataSourceUseCase.Command(att.fileName(), att.fileBase64())
);
helper.addAttachment(att.fileName(), processedAtt);
}
return message;
} catch (MessagingException | UnsupportedEncodingException ex) {
throw new CommonServicesException("Preparation of email message before sending failed", ex);
}
}

private InternetAddress[] splitAddresses(String addresses) throws AddressException {
return (addresses != null)
? InternetAddress.parse(addresses)
: new InternetAddress[0];
}
}

Код: Выделить всё

public interface DecodeBase64FileIntoDataSourceUseCase {

DataSource execute(Command command);

record Command(
String fileName,
String base64File
) {}
}

Код: Выделить всё

@Service
public class DecodeBase64FileIntoDataSourceUseCaseHandler implements DecodeBase64FileIntoDataSourceUseCase {

@Override
public DataSource execute(Command command) {
final byte[] fileSourceBytes = Base64.getDecoder().decode(command.base64File());
final ContentType type = getPartType(command.fileName());
return new ByteArrayDataSource(fileSourceBytes, type.getValue());
}

private ContentType getPartType(String fileName) {
final String fileExtension = FilenameUtils.getExtension(fileName);
return switch (fileExtension) {
case "pdf" -> ContentType.PDF;
default ->  ContentType.TEXT_PLAIN;
};
}
}
Я ценю любую помощь, потому что понятия не имею, что здесь может быть не так.
Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/788 ... e-mimemess

Вернуться в «JAVA»