#java #email
Вопрос:
После регистрации я отправляю приветственное письмо пользователю с помощью org.springframework.mail.javamail.JavaMailSender. Когда два пользователя зарегистрировались одновременно, произошло это исключение:
ОШИБКА [i-0930a9116e073d9f4] [app-async-4] p.i.c. core.mail.MailerService — _ _org.springframework.mail.MailSendException: Сообщение об ошибке: com.sun.mail.smtp.SMTPSendFailedException: 432 4.3.2 STOREDRV.Клиентская отправка; превышен лимит потока отправителя. Посещение aka.ms/concurrent_sending для получения дополнительной информации.
Как я могу это решить? Будет ли отправка электронной почты в потоках выполнять эту работу?
Вот мои способы отправки электронной почты:
@Async(AsyncConfiguration.ASYNC_EXECUTOR)
public void sendAfterSignupEmail(String token) {
String subject = utilsBean.getMessage(utilsBean.getCurrentLocale(), "mail.after_activation.title");
User user = userRepo.findByActivationToken(token).orElse(null);
MailDto mailDto = new MailDto()
.withBodyTemplate("welcome_email.html")
.asHtml(true)
.withSubject(subject)
.withRecipient(user.getEmail())
.withNoTemplate()
.withModel("username", user.getUserName());
mailerService.sendMailMessage(mailDto);
}
public void sendMailMessage(MailDto mail) {
logger.info("Sending e-mail [{}] to {} ({})", mail.getSubject(), mail.getRecipients().get(0), mail.getRecipients().size());
if (!mailerEnabled) {
logger.warn("Sending e-mail cancelled due to 'app.mail.enabled' = {}.", mailerEnabled);
return;
}
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
message.setSubject(mail.getSubject());
helper.setFrom(mailFrom);
for (String rcpt : mail.getRecipients()) {
helper.addTo(rcpt);
}
for (String bcc : mail.getBcc()) {
helper.addBcc(bcc);
}
helper.setText(getBodyFromTemplate(mail), mail.isHtml());
for (Attachment a : mail.getAttachments()) {
helper.addAttachment(a.getAttachmentFilename(), a.getInputStreamSource(), a.getContentType());
}
if (mail.getLogo() != null) {
try {
InputStream is = getClass().getResourceAsStream(mail.getLogo());
helper.addInline("logo", new ByteArrayResource(IOUtils.toByteArray(is)), "image/png");
} catch (IOException e) {
logger.error("Could not attach inline logo in email", e);
}
}
for (Inline i : mail.getInlines()) {
helper.addInline(i.getContendId(), i.getInputStreamSource(), i.getContentType());
}
mailSender.send(message);
} catch (Exception e) {
logger.error("", e);
}
}