Боевая серия Spring Boot (6) Отправка электронной почты

Spring Boot

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

Быстрая навигация

добавить зависимости maven

существуетSpring BootПроектpom.xmlимпортируется в файлspring-boot-starter-emailполагаться

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

Шаблоны писем должны быть импортированыspring-boot-starter-thymeleafплагин

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Добавить конфигурацию, связанную с почтовым ящиком, в файл конфигурации

163 конфигурации почтового ящика, обратите внимание на замену информации вашей учетной записи, пароль - это код авторизации.

application.yml

spring: 
    mail:
        host: smtp.163.com
        username: your163account@163.com
        password: your163password
        default-encoding: utf-8

Почтовый ящик QQ отправляет конфигурацию почты, следующий пароль является кодом авторизации

spring:
    mail:
        host: smtp.qq.com
        username: yourqqaccount@qq.com
        password: yourQQpassword

сборка проекта

На основе модульного теста в предыдущем разделеchapter5-1Написано на основе примеров кода

код бизнес-уровня

Создайте в сервисной директории файл MailService.java, отвечающий за написание функции отправки почты бизнес-уровня

Давайте воспользуемся преимуществами SpringJavaMailSenderВ интерфейсе реализована отправка почты, которая используется локально в проекте@AutowiredВнедрить объект отправки почты

MailService.java

package com.angelo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;

@Service
public class MailService {

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

    @Autowired // 项目启动时将mailSender注入
    private JavaMailSender javaMailSender;

    // ... 下面会一一介绍 ...
}

код модульного теста

Создал в тестовом каталогеMailServiceTest.javaТестовый класс для модульного тестирования кода бизнес-уровня

MailServiceTest.java

package com.angelo.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.annotation.Resource;
import javax.mail.MessagingException;

import java.lang.reflect.Array;

import static org.junit.Assert.*;

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

    @Autowired
    private MailService mailService;

    @Resource
    TemplateEngine templateEngine;

    String to = "your163password@163.com";

    // ... 下面为一一介绍 ...
}

Пять типов отправки электронной почты

текстовое письмо

SimpleMailMessageОн инкапсулирует функции отправки и получения простых электронных писем, а также функцию мониторинга модулей исключений.Это также самый простой тип отправки электронной почты.Создайте объект сообщения электронной почты и установите отправителя, объект отправки, тему сообщения и содержимое сообщения электронной почты. Эл. адрес.

  • Бизнес-уровеньMailService.java
/**
 * 发送文本邮件
 * @param to
 * @param subject
 * @param content
 */
public void sendTextMail(String to, String subject, String content) {
    SimpleMailMessage message = new SimpleMailMessage();
    message.setTo(to); // 发送对象
    message.setSubject(subject); // 邮件主题
    message.setText(content); // 邮件内容
    message.setFrom(from); // 邮件的发起者

    javaMailSender.send(message);
}

Модульное тестирование приведенного выше бизнес-кода, чтобы увидеть эффект

  • модульный тестовый слойMailServiceTest.java
@Test
public void sendTextEmailTest() {
    mailService.sendTextMail(to, "发送文本邮件", "hello,这是Spring Boot发送的一封文本邮件!");
}
  • Результаты теста

图片描述

HTML-почта

на основеMimeMessageHelperСоздайтеhelperObject, установив для второго параметра setText значение true, будет использовать формат html для печати почты.

  • Бизнес-уровеньMailService.java
/**
 * 发送HTMl邮件
 * @param to
 * @param subject
 * @param content
 * @throws MessagingException
 */
public void sendHtmlMail(String to, String subject, String content) throws MessagingException {
    MimeMessage message = javaMailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    helper.setFrom(from);
    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(content, true);

    javaMailSender.send(message);
}
  • модульный тестовый слойMailServiceTest.java
@Test
public void sendHtmlEmailTest() throws MessagingException {
    String content = "<html>" +
            "<body>" +
                "<h1 style=\"" + "color:red;" + "\">hello,这是Spring Boot发送的一封HTML邮件</h1>" +
            "</body></html>";

    mailService.sendHtmlMail(to, "发送HTML邮件", content);
}
  • Результаты теста

Вы можете видеть, что результат электронной почты использует предварительно установленный формат электронной почты в примере.

图片描述

электронная почта вложения

  • Бизнес-уровеньMailService.java
    /**
     * 发送带附件的邮件
     * @param to
     * @param subject
     * @param content
     * @param filePathList
     * @throws MessagingException
     */
    public void sendAttachmentMail(String to, String subject, String content, String[] filePathList) throws MessagingException {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);

        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);

        for (String filePath: filePathList) {
            System.out.println(filePath);

            FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath));
            String fileName = fileSystemResource.getFilename();
            helper.addAttachment(fileName, fileSystemResource);
        }

        javaMailSender.send(message);
    }

filePathListНапишите путь к файлу вложения в формате массива.

  • модульный тестовый слойMailServiceTest.java
    @Test
    public void sendAttachmentEmailTest() throws MessagingException {
        String[] filePathList = new String[2];
        filePathList[0] = "/SpringBoot-WebApi/chapter4.zip";
        filePathList[1] = "/SpringBoot-WebApi/chapter5.zip";

        mailService.sendAttachmentMail(to, "发送附件邮件", "hello,这是Spring Boot发送的一封附件邮件!", filePathList);
    }
  • Результаты теста

图片描述

электронная почта со встроенным изображением в формате html

Он также отправляется на основе html-почты, и вы можете напрямую просматривать изображения через статические ресурсы, такие как встроенные изображения.

  • Бизнес-уровеньMailService.java
    /**
     * 发送html内嵌图片的邮件
     * @param to
     * @param subject
     * @param content
     * @param srcPath
     * @param srcId
     * @throws MessagingException
     */
    public void sendHtmlInlinePhotoMail(String to, String subject, String content, String srcPath, String srcId) throws MessagingException {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);

        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);

        FileSystemResource fileSystemResource = new FileSystemResource(new File(srcPath));
        helper.addInline(srcId, fileSystemResource);

        javaMailSender.send(message);
    }

В следующем модульном тесте srcPath — это ваш локальный путь к изображению, а srcId должен быть таким же, как у бизнес-уровня выше.helper.addInline(srcId, fileSystemResource)srcId остается прежним.

  • модульный тестовый слойMailServiceTest.java
    @Test
    public void sendHtmlInlinePhotoMailTest() throws MessagingException {
        String srcPath = "/SpringBoot-WebApi/chapter6/img/pic18.jpg";
        String srcId = "pic18";
        String content = "<html>" +
                "<body>" +
                "<h2>hello,这是Spring Boot发送的一封HTML内嵌图片的邮件</h2>" +
                "<img src=\'cid:"+ srcId +"\'></img>" +
                "</body></html>";

        mailService.sendHtmlInlinePhotoMail(to, "发送图片邮件", content, srcPath, srcId);
    }
  • Результаты теста

图片描述

шаблон письма

Когда содержание электронной почты относительно простое, мы можем использовать вышеуказанные простые методы отправки электронной почты.В сложном бизнесе нам нужно использовать структуру HTML, а данные в HTML необходимо динамически изменять.Или выбрать шаблон электронная почта, вы можете использоватьFreemarker,thymeleafи другие механизмы шаблонов, здесь мы в основном вводим использованиеthymeleaf.

  • Написание шаблона электронной почты

resources/templatesновый каталогemailTemplate.htmlдокумент

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>模板邮件</title>
</head>
<body>
您好,<span th:text="${username}"></span>,欢迎访问我的个人博客:
    <a href="https://github.com/Q-Angelo/summarize">Github</a>、
    <a th:href="@{https://www.imooc.com/u/{id}(id=${id})}" href="#">慕课网</a>
</body>
</html>

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

  • модульный тестовый слойMailServiceTest.java
@Test
public void testTemplateEmailTest() throws MessagingException {
    Context context = new Context();
    context.setVariable("username", "张三");
    context.setVariable("id", "2667395");

    String emailContent = templateEngine.process("emailTemplate", context);

    mailService.sendHtmlMail(to, "发送模板邮件", emailContent);
}
  • Результаты теста

图片描述

Общая проблема

Причина этой ошибки в том, что NetEase расценивает отправленное мной электронное письмо как спам, > Это заголовок электронного письма, которое я заполнил, и позже я обнаружил, что NetEase включил заголовок в заголовок.163В результате, если вы столкнетесь с похожими проблемами, пожалуйста, проверьте больше.

com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp10,DsCowADH1MxWegtcyxFjDw--.48939S2 1544256086

Если у вас есть какие-либо вопросы, пожалуйста, задайте их в разделе комментариев ниже

Посмотреть полный пример этой статьи на Github, глава 6-1.

Автор: май июнь
Ссылка на сайт:Вухуу. ИМО OC.com/article/267…
Источник: МООК
Github: Боевая серия Spring Boot