1. Обзор
В этом уроке мы рассмотрим шаги, необходимые для отправки электронных писем как из простого приложения vanilla Spring, так и из приложения Spring Boot. Для первого мы будем использовать библиотеку JavaMail , а для второго-зависимость spring-boot-starter-mail .
Дальнейшее чтение:
Регистрация – Активация Новой учетной записи по электронной почте
Привод Пружинного ботинка
2. Зависимости Maven
Во-первых, нам нужно добавить зависимости к вашему pom.xml .
2.1. Весна
Вот что мы добавим для использования в простом фреймворке vanilla Spring:
org.springframework spring-context-support 5.2.8.RELEASE
Последнюю версию можно найти здесь .
2.2. Пружинный Ботинок
И для Пружинного ботинка:
org.springframework.boot spring-boot-starter-mail 2.3.4.RELEASE
Последняя версия доступна в репозитории Maven Central .
3. Свойства Почтового сервера
Интерфейсы и классы для поддержки почты Java в Spring framework организованы следующим образом:
- MailSender interface : интерфейс верхнего уровня, обеспечивающий базовую функциональность для отправки простых электронных писем
- JavaMailSender interface : подинтерфейс вышеприведенного Почтового отправителя . Он поддерживает MIME-сообщения и в основном используется в сочетании с классом MimeMessageHelper для создания MimeMessage . С этим интерфейсом рекомендуется использовать механизм MimeMessagePreparator .
- JavaMailSenderImpl class предоставляет реализацию интерфейса JavaMailSender . Он поддерживает MimeMessage и SimpleMailMessage .
- SimpleMailMessage class : используется для создания простого почтового сообщения, включающего поля from, to, cc, subject и text
- 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.properties уже настроен на использование SMTP Gmail (см. Предыдущий раздел).
Обратите внимание, что пароль для нашей учетной записи должен быть не обычным паролем, а паролем приложения, сгенерированным для нашей учетной записи Google. Перейдите по этой ссылке, чтобы узнать подробности и сгенерировать пароль для приложения Google.
3.2.2. Свойства SES SMTP
Чтобы отправлять электронные письма с помощью Amazon SES, мы устанавливаем наш 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 требует от нас проверки наших учетных данных перед их использованием. Перейдите по ссылке , чтобы подтвердить свое имя пользователя и пароль.
4. Отправка электронной почты
Как только управление зависимостями и конфигурация будут установлены, мы можем использовать вышеупомянутый JavaMailSender для отправки электронной почты.
Поскольку как простой фреймворк vanilla Spring, так и его загрузочная версия обрабатывают составление и отправку электронных писем аналогичным образом, нам не придется различать их в нижеприведенных подразделах.
4.1. Отправка Простых Электронных Писем
Давайте сначала составим и отправим простое электронное сообщение без каких-либо вложений:
@Component public class EmailServiceImpl implements EmailService { @Autowired private JavaMailSender emailSender; public void sendSimpleMessage( String to, String subject, String text) { ... SimpleMailMessage message = new SimpleMailMessage(); message.setFrom("[email protected]"); message.setTo(to); message.setSubject(subject); message.setText(text); emailSender.send(message); ... } }
Обратите внимание, что даже если не обязательно указывать адрес from , многие SMTP-серверы будут отклонять такие сообщения. Вот почему мы используем адрес электронной почты [email protected] в нашей реализации EmailService .
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.setFrom("[email protected]"); 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 .