Руководство по электронной почте Spring
1. обзор
В этой статье мы рассмотрим шаги, необходимые для отправки электронных писем как из простого приложения Spring, так и из приложения Spring Boot, первое использует библиотекуJavaMail, а второе -spring-boot-starter-mail зависимость.
Дальнейшее чтение:
Регистрация - активировать новую учетную запись по электронной почте
Проверьте новых зарегистрированных пользователей, отправив им токен подтверждения по электронной почте, прежде чем разрешить им войти в систему - с помощью Spring Security.
Привод пружинной загрузки
Краткое введение в Spring Boot Actuators - использование и расширение существующих, настройка и развертывание ваших собственных.
2. Maven Зависимости
Во-первых, нам нужно добавить зависимости к нашемуpom.xml.
2.1. весна
Для использования в обычном фреймворке vanilla Spring мы добавим:
org.springframework
spring-context-support
5.0.1.RELEASE
Последнюю версию можно найтиhere.
2.2. Весенний ботинок
А для Spring Boot:
org.springframework.boot
spring-boot-starter-mail
2.0.1.RELEASE
Последняя версия доступна в репозиторииMaven Central.
3. Свойства почтового сервера
Интерфейсы и классы для поддержки почты Java в среде Spring организованы следующим образом:
-
MailSender interface: интерфейс верхнего уровня, обеспечивающий базовые функции для отправки простых электронных писем.
-
JavaMailSender interface: подинтерфейс указанного вышеMailSender. Он поддерживает сообщения MIME и в основном используется вместе с классомMimeMessageHelper для созданияMimeMessage. С этим интерфейсом рекомендуется использовать механизмMimeMessagePreparator.
-
JavaMailSenderImpl class: предоставляет реализацию интерфейсаJavaMailSender. Он поддерживаетMimeMessage иSimpleMailMessage
-
SimpleMailMessage class: используется для создания простого почтового сообщения, включающего поля «от», «кому», «cc», «тема» и «текст»
-
MimeMessagePreparator interface: предоставляет интерфейс обратного вызова для подготовки сообщений MIME
-
MimeMessageHelper class: вспомогательный класс для создания сообщений MIME. Он предлагает поддержку изображений, типичных почтовых вложений и текстового содержимого в макете HTML.
В следующих разделах мы покажем, как используются эти интерфейсы и классы.
3.1. Свойства почтового сервера Spring
Свойства почты, которые необходимы для указания, например, SMTP-сервер может быть определен с помощьюJavaMailSenderImpl.
Например, для Gmail это можно настроить, как показано ниже:
@Bean
public JavaMailSender getJavaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost("smtp.gmail.com");
mailSender.setPort(587);
mailSender.setUsername("[email protected]");
mailSender.setPassword("password");
Properties props = mailSender.getJavaMailProperties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.debug", "true");
return mailSender;
}
3.2. Свойства почтового сервера Spring Boot
После того, как зависимость установлена, следующим шагом будет определение свойств почтового сервера в файлеapplication.properties с использованием пространства именspring.mail.*.
Например, свойства SMTP-сервера Gmail могут быть указаны как:
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=
spring.mail.password=
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
Некоторым SMTP-серверам требуется соединение TLS, поэтому свойствоspring.mail.properties.mail.smtp.starttls.enable используется для включения соединения, защищенного TLS.
3.2.1. Свойства SMTP Gmail
Мы можем отправить письмо через SMTP-сервер Gmail. Взгляните наdocumentation, чтобы увидеть свойства SMTP-сервера исходящей почты Gmail.
Наш файлapplication.the properties уже настроен для использования Gmail SMTP (см. Предыдущий раздел).
Обратите внимание, что пароль для вашей учетной записи должен быть не обычным паролем, а паролем приложения, созданным для вашей учетной записи Google. Следуйте этомуlink, чтобы просмотреть подробности и сгенерировать пароль приложения Google.
3.2.2. Свойства SES SMTP
Чтобы отправлять электронные письма с помощью Amazon SES Service, установитеapplication.properties, как показано ниже:
spring.mail.host=email-smtp.us-west-2.amazonaws.com
spring.mail.username=username
spring.mail.password=password
spring.mail.properties.mail.transport.protocol=smtp
spring.mail.properties.mail.smtp.port=25
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
Имейте в виду, что Amazon требует от вас подтверждения ваших учетных данных перед их использованием. Следуйтеlink, чтобы подтвердить свое имя пользователя и пароль.
4. Отправка электронной почты
Как только управление зависимостями и конфигурация созданы, мы можем использовать вышеупомянутыйJavaMailSender для отправки электронного письма.
Поскольку как обычная ванильная среда Spring, так и ее версия для загрузки обрабатывают составление и отправку электронных писем одинаковым образом, нам не нужно проводить различие между ними в подразделах ниже.
4.1. Отправка простых писем
Давайте сначала составим и отправим простое сообщение электронной почты без вложений:
@Component
public class EmailServiceImpl implements EmailService {
@Autowired
public JavaMailSender emailSender;
public void sendSimpleMessage(
String to, String subject, String text) {
...
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(to);
message.setSubject(subject);
message.setText(text);
emailSender.send(message);
...
}
}
4.2. Отправка писем с вложениями
Иногда простого обмена сообщениями Spring недостаточно для наших сценариев использования.
Например, мы хотим отправить электронное письмо с подтверждением заказа с приложенным счетом. В этом случае мы должны использовать составное сообщениеMIME из библиотекиJavaMail вместоSimpleMailMessage. Spring поддерживает обмен сообщениямиJavaMail с классомorg.springframework.mail.javamail.MimeMessageHelper.
Прежде всего, мы добавим вEmailServiceImpl метод для отправки писем с вложениями:
@Override
public void sendMessageWithAttachment(
String to, String subject, String text, String pathToAttachment) {
// ...
MimeMessage message = emailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(text);
FileSystemResource file
= new FileSystemResource(new File(pathToAttachment));
helper.addAttachment("Invoice", file);
emailSender.send(message);
// ...
}
4.3. Простой шаблон электронного письма
КлассSimpleMailMessage поддерживает форматирование текста. Мы можем создать шаблон для электронной почты, определив bean-компонент шаблона в нашей конфигурации:
@Bean
public SimpleMailMessage templateSimpleMessage() {
SimpleMailMessage message = new SimpleMailMessage();
message.setText(
"This is the test email template for your email:\n%s\n");
return message;
}
Теперь мы можем использовать этот компонент в качестве шаблона для электронной почты, и нам нужно только предоставить необходимые параметры для шаблона:
@Autowired
public SimpleMailMessage template;
...
String text = String.format(template.getText(), templateArgs);
sendSimpleMessage(to, subject, text);
5. Обработка ошибок отправки
JavaMail предоставляетSendFailedException для обработки ситуаций, когда сообщение не может быть отправлено. Но возможно, что вы не получите этого исключения при отправке электронного письма на неправильный адрес. Причина в следующем:
В спецификации протокола SMTP в RFC 821 указан код возврата 550, который SMTP-сервер должен возвращать при попытке отправить электронное письмо на неправильный адрес. Но большинство общедоступных SMTP-серверов этого не делают. Вместо этого они отправляют электронное письмо с сообщением «не удалось доставить» на ваш ящик или вообще не оставляют отзывов.
Например, SMTP-сервер Gmail отправляет сообщение «сбой доставки». И вы не получите никаких исключений в своей программе.
Итак, есть несколько вариантов, которые вы можете пройти, чтобы справиться с этим делом:
-
ПоймайSendFailedException, которого нельзя бросить
-
Проверьте почтовый ящик отправителя на сообщение «сбой доставки» в течение некоторого периода времени. Это не просто, и период времени не определен
-
Если ваш почтовый сервер не дает никакой обратной связи, вы ничего не можете сделать
6. Заключение
В этой быстрой статье мы показали, как настроить и отправить электронную почту из приложения Spring Boot.
Реализацию всех этих примеров и фрагментов кода можно найти вGitHub project; это проект на основе Maven, поэтому его будет легко импортировать и запускать как есть.