Руководство по электронной почте Spring

Руководство по электронной почте Spring

1. обзор

В этой статье мы рассмотрим шаги, необходимые для отправки электронных писем как из простого приложения Spring, так и из приложения Spring Boot, первое использует библиотекуJavaMail, а второе -spring-boot-starter-mail зависимость.

Дальнейшее чтение:

Регистрация - активировать новую учетную запись по электронной почте

Проверьте новых зарегистрированных пользователей, отправив им токен подтверждения по электронной почте, прежде чем разрешить им войти в систему - с помощью Spring Security.

Read more

Привод пружинной загрузки

Краткое введение в Spring Boot Actuators - использование и расширение существующих, настройка и развертывание ваших собственных.

Read more

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 организованы следующим образом:

  1. MailSender interface: интерфейс верхнего уровня, обеспечивающий базовые функции для отправки простых электронных писем.

  2. JavaMailSender interface: подинтерфейс указанного вышеMailSender. Он поддерживает сообщения MIME и в основном используется вместе с классомMimeMessageHelper для созданияMimeMessage. С этим интерфейсом рекомендуется использовать механизмMimeMessagePreparator.

  3. JavaMailSenderImpl class: предоставляет реализацию интерфейсаJavaMailSender. Он поддерживаетMimeMessage иSimpleMailMessage

  4. SimpleMailMessage class: используется для создания простого почтового сообщения, включающего поля «от», «кому», «cc», «тема» и «текст»

  5. MimeMessagePreparator interface: предоставляет интерфейс обратного вызова для подготовки сообщений MIME

  6. 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 отправляет сообщение «сбой доставки». И вы не получите никаких исключений в своей программе.

Итак, есть несколько вариантов, которые вы можете пройти, чтобы справиться с этим делом:

  1. ПоймайSendFailedException, которого нельзя бросить

  2. Проверьте почтовый ящик отправителя на сообщение «сбой доставки» в течение некоторого периода времени. Это не просто, и период времени не определен

  3. Если ваш почтовый сервер не дает никакой обратной связи, вы ничего не можете сделать

6. Заключение

В этой быстрой статье мы показали, как настроить и отправить электронную почту из приложения Spring Boot.

Реализацию всех этих примеров и фрагментов кода можно найти вGitHub project; это проект на основе Maven, поэтому его будет легко импортировать и запускать как есть.