Серия Springboot (тринадцать) с использованием почтового сервиса

Spring Boot

Пишите статьи серьезно и не будьте участником заголовков.

Статьи были включены вGitHub.com/Ниу Мух/Java…иБлог программиста Аранга, обратите внимание, не потеряйтесь.

В нашу эпоху почтовая служба – это очень важное существование, будь то для общения на работе или для различных уведомлений по электронной почте в мирное время. Java поддерживает почтовые службы через почту Java с самого начала. Spring дополнительно инкапсулирует почту Java, абстрагируяJavaMailSenderПозже, с появлением Springboot, появилось конечноspring-boot-starter-mailВ любом случае, каждый пакет упрощает и упрощает использование.

Почтовые зависимости Springboot

Не говоря уже о создании проекта Springboot, давайте взглянем на общую структуру каталогов.项目结构

Непосредственно импортируйте зависимости, необходимые для почтовой службы Springboot.

   <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 邮件服务 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <!-- Thymeleaf 模版,用于发送模版邮件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Настройка почты Springboot

Чтобы использовать почтовый сервис, вам необходимо настроить информацию о почтовом ящике, которую вы можете использовать.Как правило, вам необходимо настроить протокол отправки SMTP, учетную запись почтового ящика (на этот раз в качестве примера используется почтовый ящик 126), пароль почтового ящика и формат кодировки.

spring.mail.host=smtp.126.com
spring.mail.port=25
# 你的邮箱地址
spring.mail.username=niumoo@126.com 
# 你的授权码(126 和 163 以及 qq 邮箱 都需要授权码登录,没有授权码的直接登录网页版邮箱设置里设置)
spring.mail.password=password
spring.mail.default-encoding=UTF-8

Текстовая почта Springboot

Текстовая почта - самая простая и основная почта, инкапсулированная веснойJavaMailSenderПросто отправьте его напрямую.

СоздайтеMailServiceкласс, впрыснутьJavaMailSenderДля отправки почты используйте@Value("${spring.mail.username}")Параметры в файле конфигурации привязки используются для установки входящего почтового ящика для отправки электронных писем. использовать@ServiceАннотацияMailServiceВнедрить в контейнер Spring, используяLombokиз@Slf4jИмпорт журналов.

/**
 * <p>
 * 邮件服务
 *
 * @Author niujinpeng
 * @Date 2019/3/10 21:45
 */
@Service
@Slf4j
public class MailService {

    @Value("${spring.mail.username}")
    private String from;

    @Autowired
    private JavaMailSender mailSender;

    /**
     * 发送简单文本邮件
     * 
     * @param to
     * @param subject
     * @param content
     */
    public void sendSimpleTextMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        message.setFrom(from);
        mailSender.send(message);
        log.info("【文本邮件】成功发送!to={}", to);
    }
}

Создайте тестовую текстовую почту класса модульного тестирования Springboot.Получателям в эксперименте для удобства назначены собственные почтовые ящики.

@RunWith(SpringRunner.class)
@SpringBootTest
public class MailServiceTest {

    @Autowired
    private MailService mailService;
    @Autowired
    private TemplateEngine templateEngine;

    @Test
    public void sendSimpleTextMailTest() {
        String to = "niumoo@126.com";
        String subject = "Springboot 发送简单文本邮件";
        String content = "<p>第一封 Springboot 简单文本邮件</p>";
        mailService.sendSimpleTextMail(to, subject, content);
    }
}

Запустите модульные тесты, чтобы проверить отправку текстовых электронных писем.

PS: если операция сообщает об исключенииAuthenticationFailedException: 535 Error, Обычно имя пользователя и пароль неверны.

Caused by: javax.mail.AuthenticationFailedException: 535 Error: authentication failed

	at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:965)
	at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:876)
	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:780)
	at javax.mail.Service.connect(Service.java:366)
	at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:517)
	at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:436)
	... 34 more

Работает нормально, выводит лог успешной отправки.

2019-03-11 23:35:14.743  INFO 13608 --- [           main] n.codingme.boot.service.MailServiceTest  : Started MailServiceTest in 3.964 seconds (JVM running for 5.749)
2019-03-11 23:35:24.718  INFO 13608 --- [           main] net.codingme.boot.service.MailService    : 【文本邮件】成功发送!to=niumoo@126.com

Проверяйте входящую почту в почтовом ящике.在这里插入图片描述Текстовые электронные письма принимаются нормально, а HTML-теги в электронных письмах с видимым текстом не анализируются.

Почта Springboot HTML-почта

вышеMailServiceДобавить новый метод в классsendHtmlMail, для тестирования HTML-почты.

    /**
     * 发送 HTML 邮件
     * 
     * @param to
     * @param subject
     * @param content
     * @throws MessagingException
     */
    public void sendHtmlMail(String to, String subject, String content) throws MessagingException {
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
        messageHelper.setFrom(from);
        messageHelper.setTo(to);
        messageHelper.setSubject(subject);
        // true 为 HTML 邮件
        messageHelper.setText(content, true);
        mailSender.send(message);
        log.info("【HTML 邮件】成功发送!to={}", to);
    }

В метод тестирования добавлен метод проверки почты HTML.

    @Test
    public void sendHtmlMailTest() throws MessagingException {
        String to = "niumoo@126.com";
        String subject = "Springboot 发送 HTML 邮件";
        String content = "<h2>Hi~</h2><p>第一封 Springboot HTML 邮件</p>";
        mailService.sendHtmlMail(to, subject, content);
    }

Запустите модульный тест, чтобы увидеть квитанцию.HTML邮件Электронные письма в формате HTML принимаются нормально, а теги HTML анализируются в соответствующие стили.

Письмо с вложением электронной почты Springboot

вышеMailServiceДобавить новый метод в классsendAttachmentMail, который используется для проверки вложенных сообщений.

    /**
     * 发送带附件的邮件
     * 
     * @param to
     * @param subject
     * @param content
     * @param fileArr
     */
    public void sendAttachmentMail(String to, String subject, String content, String... fileArr)
        throws MessagingException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
        messageHelper.setFrom(from);
        messageHelper.setTo(to);
        messageHelper.setSubject(subject);
        messageHelper.setText(content, true);

        // 添加附件
        for (String filePath : fileArr) {
            FileSystemResource fileResource = new FileSystemResource(new File(filePath));
            if (fileResource.exists()) {
                String filename = fileResource.getFilename();
                messageHelper.addAttachment(filename, fileResource);
            }
        }
        mailSender.send(mimeMessage);
        log.info("【附件邮件】成功发送!to={}", to);
    }

Добавьте тестовый метод электронной почты с вложением в тестовый метод.

    @Test
    public void sendAttachmentTest() throws MessagingException {
        String to = "niumoo@126.com";
        String subject = "Springboot 发送 HTML 附件邮件";
        String content = "<h2>Hi~</h2><p>第一封 Springboot HTML 附件邮件</p>";
        String filePath = "pom.xml";
        mailService.sendAttachmentMail(to, subject, content, filePath, filePath);
    }

Запустите модульный тест, чтобы увидеть квитанцию.附件邮件

Письма с привязанными связями принимаются нормально, и несколько вложений реализованы таким же образом.

Почта с изображением почты Springboot

Электронные письма с изображениями немного отличаются от других электронных писем.В электронных письмах с изображениями необходимо определить местоположение изображения в содержимом и указать идентификатор записи, а затем добавить изображение к соответствующему идентификатору в электронном письме.

вышеMailServiceДобавить новый метод в классsendImgMail, который используется для проверки вложенных сообщений.

   /**
     * 发送带图片的邮件
     *
     * @param to
     * @param subject
     * @param content
     * @param imgMap
     */
    public void sendImgMail(String to, String subject, String content, Map<String, String> imgMap)
        throws MessagingException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
        messageHelper.setFrom(from);
        messageHelper.setTo(to);
        messageHelper.setSubject(subject);
        messageHelper.setText(content, true);
        // 添加图片
        for (Map.Entry<String, String> entry : imgMap.entrySet()) {
            FileSystemResource fileResource = new FileSystemResource(new File(entry.getValue()));
            if (fileResource.exists()) {
                String filename = fileResource.getFilename();
                messageHelper.addInline(entry.getKey(), fileResource);
            }
        }
        mailSender.send(mimeMessage);
        log.info("【图片邮件】成功发送!to={}", to);
    }

Добавьте тестовый метод почты с изображением в тестовый метод Apple.png, используемый в тестовом методе, является изображением в проекте. Вы можете увидеть структуру проекта выше.

    @Test
    public void sendImgTest() throws MessagingException {
        String to = "niumoo@126.com";
        String subject = "Springboot 发送 HTML 图片邮件";
        String content =
            "<h2>Hi~</h2><p>第一封 Springboot HTML 图片邮件</p><br/><img src=\"cid:img01\" /><img src=\"cid:img02\" />";
        String imgPath = "apple.png";
        Map<String, String> imgMap = new HashMap<>();
        imgMap.put("img01", imgPath);
        imgMap.put("img02", imgPath);
        mailService.sendImgMail(to, subject, content, imgMap);
    }

Запустите модульный тест, чтобы увидеть квитанцию.图片邮件Оба изображения нормально отображаются в электронной почте.

Почтовый шаблон Springboot

Использование шаблонов электронных писем очень широко, например, часто получаемые электронные письма об успешной регистрации или электронные письма с уведомлением об операции и т. д. являются шаблонными электронными письмами, а в шаблонных электронных письмах часто требуется изменить только несколько переменных. Первый выбор для шаблонной почты в Springboot должен выбрать механизм шаблонов, и механизм шаблонов был добавлен при введении зависимостей.Thymeleaf.

Шаблон электронной почты сначала нуждается в шаблоне электронной почты, мы находимся вTemplatesсоздать новыйHTMLдокументRegisterSuccess.html, Имя пользователя настроено для нас.

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>注册成功通知</title>
</head>
<body>
<p>[[${username}]],您好!
</p>
<p>
    新的公钥已添加到你的账户:<br/>
    标题: HP-WIN10 <br/>
    如果公钥无法使用,你可以在这里重新添加: SSH Keys
</p>
</body>
</html>

в почтовом сервисеMailServiceВнедрите механизм шаблонов в механизм шаблонов, а затем напишите код отправки шаблона электронной почты.

    @Autowired
    private TemplateEngine templateEngine;

    /**
     * 发送模版邮件
     * 
     * @param to
     * @param subject
     * @param paramMap
     * @param template
     * @throws MessagingException
     */
    public void sendTemplateMail(String to, String subject, Map<String, Object> paramMap, String template)
        throws MessagingException {
        Context context = new Context();
        // 设置变量的值
        context.setVariables(paramMap);
        String emailContent = templateEngine.process(template, context);
        sendHtmlMail(to, subject, emailContent);
        log.info("【模版邮件】成功发送!paramsMap={},template={}", paramMap, template);
    }

Добавьте тестовый метод электронной почты шаблона в модульный модульный тест, а затем отправьте тест электронной почты.

    @Test
    public void sendTemplateMailTest() throws MessagingException {
        String to = "niumoo@126.com";
        String subject = "Springboot 发送 模版邮件";
        Map<String, Object> paramMap = new HashMap();
        paramMap.put("username", "Darcy");
        mailService.sendTemplateMail(to, subject, paramMap, "RegisterSuccess");
    }

Проверьте квитанцию.模版邮件

Можно обнаружить, что письмо с шаблоном было отправлено нормально.

Почтовое дополнение Springboot

В приведенном выше примере базового использования почтовой службы Springboot много дублирования кода, а фактическое использование по-прежнему имеет много недостатков, таких как отсутствие异常处理机制, когда отправка не удалась重试机制Нет, в реальных ситуациях почтовая служба часто не работает в режиме реального времени, и во многих случаях она будет использоваться для异步请求.

Соответствующий код статьи загружен на Github.Интеграция, связанная с Spring Boot - почтовая служба.

Hello world :)

Я Аланг, яркая луна и чистый ветер, человек с техническими инструментами, который каждый день передвигает кирпичи.
Персональный сайт:www.wdbyte.com
Если вы хотите подписаться, вы можете подписатьсяпублика "Программист Аранг",илиБлог программиста Аранга,илиДобавьте меня в WeChat (wn8398).

Эта статья также была организована вGitHub.com/Ниу Мух/Java…, добро пожаловать Звезда.