При попытке отправить электронное письмо с вложениями в новой теме я получаю java.io.FileNotFoundException
Эта функция является частью Java 8, Spring boot 2.1.5 приложения со встроенным Tomcat.Я получаю некоторые входные данные из формы интерфейса, иногда с вложениями.В какой-то момент в бизнес-логике электронное письмо отправляется с данными формы и приложениями, если они были.
Я хотел отправить электронное письмо без блокировки, поэтому я запускаю подготовку и отправку метода электронной почты в новой теме, нотогда метод JavaMailSender.send () не может найти вложенные файлы.Файлы, полученные из внешнего интерфейса REST Api, сохраняются Tomcat как временные файлы во временной папке и, вероятно, удаляются перед отправкой электронной почты.
Само сообщение электронной почты представляет собой MimeMessage с Multipart, содержащим текст электронной почты и от одного до трехвложения размером не более 10 МБ.
Основная логика с отправкой mial в новом потоке:
public FormConfirmation productReturn(FormDataInput formData, List<MultipartFile> attachments) {
try {
FormConfirmation formConfirmation = formSendingService.prepareAndSendFormData(formData);
return complaintConfirmation;
} catch (Exception e) {
new Thread(() -> notificationSendingService.notifyAboutUnhandledForm(formData, attachments)).start();
throw new ErrorSendingFormException(e);
}
}
Исключение корневого хранилища:
Caused by: org.springframework.mail.MailSendException: Failed messages: javax.mail.MessagingException: IOException while sending message;
nested exception is:
java.io.FileNotFoundException: C:\Users\pawelk\AppData\Local\Temp\tomcat.2114838244298062234.8080\work\Tomcat\localhost\ROOT\upload_1e03fce2_e99b_459c_87b0_b79bbe9eb7ca_00000001.tmp (The system cannot find the file specified);
Способ отправки почты :
public void notifyAboutUnhandledForm(FormDataInput formData, List<MultipartFile> attachments) {
try {
MimeMessage message = emailPreparer.prepareNotificationEmail(formData, attachments);
emailSender.send(message);
} catch (MessagingException | MailException | IOException ex) {
logger.error(EMAIL_SENDING_EXCEPTION_MESSAGE + ex);
throw new ErrorSendingFormException(EMAIL_SENDING_EXCEPTION_MESSAGE, ex);
}
}
Полный класс подготовки электронной почты:
@Service
public class EmailMessagePreparer {
public static final String EMAIL_TITLE = "Email title";
@Value("${spring.mail.username}")
private String senderAddress;
@Value("#{'${email.notification.recipients}'.split(',')}")
private String[] emailRecipients;
@Inject
private EmailTemplateProvider templateProvider;
@Inject
private JavaMailSender emailSender;
MimeMessage prepareNotificationEmail(FormDataInput formData, List<MultipartFile> attachments) throws MessagingException, IOException {
MimeMessage message = emailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo(emailRecipients);
helper.setSubject(EMAIL_TITLE);
helper.setFrom(senderAddress);
helper.setText(templateProvider.provideEmailContentFromHTMLTemplate(formData), true);
for (MultipartFile multipart : attachments) {
addAttachmentToTheEmailMessage(helper, multipart);
}
return message;
}
private void addAttachmentToTheEmailMessage(MimeMessageHelper helper, MultipartFile multipart) throws IOException, MessagingException {
helper.addAttachment(multipart.getOriginalFilename(), multipart);
}
private String extractAndWriteFileExtension(MultipartFile multipart) {
return multipart.getOriginalFilename().substring(multipart.getOriginalFilename().lastIndexOf("."));
}
}
Когда я отправляюэлектронная почта в том же главном потоке, временный файл всегда доступен, и его выполнение корректно.Я ожидаю, что при запуске метода отправки почты в отдельном потоке должен быть одинаковый доступ к временным файлам, которые не будут удалены до тех пор, пока они не будут использованы программой.
При отправке электронного письма без вложений или с вложениями в одномОсновной поток все работает нормально.
У кого-нибудь есть идеи, что может вызвать проблему и как ее решить?