Spring Boot 整合 JavaMail

1. 简述

本笔记基于Spring Boot 2.1.2 版本进行开发
发送邮件应该是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送营销信息。最早期的时候会使用 JavaMail 相关 api 来写发送邮件的相关代码,后来 Spring 推出了 JavaMailSender 更加简化了邮件发送的过程,在之后 Spring Boot 对此进行了封装就有了现在的 spring-boot-starter-mail

2. 基础整合使用

2.1. 引入依赖

在Spring Boot中发送邮件,在 pom.xml 文件里面添加 spring-boot-starter-mail 包引用

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-mail</artifactId>
  5. </dependency>
  6. </dependencies>

2.2. 邮件参数配置

  • 在 application.yml 中添加邮箱配置参数 ``` spring:

    配置邮箱

    mail: host: smtp.126.com # 邮箱服务器地址 username: lje888@126.com # 邮箱账号 password: ** # 密码 default-encoding: utf-8 # 默认编码

发送邮件相关参数

mail: fromMail: address: lje888@126.com

  1. - application.properties 配置(日后补充)
  1. ### 2.3. 编写接口与测试
  2. 1. 编写 mailService 接口与实现类

public interface MailService { /**

  1. * 发送简单邮件
  2. *
  3. * @param to 目标邮箱
  4. * @param subject 邮件主题
  5. * @param content 邮件内容
  6. */
  7. void sendSimpleMail(String to, String subject, String content);

}

@Service public class MailServiceImpl implements MailService {

  1. private static final Logger LOGGER = LoggerFactory.getLogger(MailService.class);
  2. /* 注入邮件发送类 */
  3. @Autowired
  4. private JavaMailSender javaMailSender;
  5. /* 读取配置文件邮件发送地址 */
  6. @Value("${mail.fromMail.address}")
  7. private String from;
  8. /**
  9. * 发送简单邮件
  10. *
  11. * @param to 目标邮箱
  12. * @param subject 邮件主题
  13. * @param content 邮件内容
  14. */
  15. @Override
  16. public void sendSimpleMail(String to, String subject, String content) {
  17. // 创建邮件对象
  18. SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
  19. // 设置邮件相关参数
  20. simpleMailMessage.setFrom(from);
  21. simpleMailMessage.setTo(to);
  22. simpleMailMessage.setSubject(subject);
  23. simpleMailMessage.setText(content);
  24. // 发送邮件
  25. javaMailSender.send(simpleMailMessage);
  26. LOGGER.info("发送简单邮件成功");
  27. }

}

  1. 2. 编写 test 类测试

@RunWith(SpringRunner.class) @SpringBootTest(properties = {“activeName=dev”}) public class MailSendTest {

  1. /* 注入邮件服务接口 */
  2. @Autowired
  3. private MailService mailService;
  4. @Test
  5. public void testSendSimpleMail() {
  6. mailService.sendSimpleMail("lje888@126.com", "测试发送邮件", "hello JavaMail for Spring boot");
  7. }

}

  1. ## 3. 发送 html 格式邮件
  2. 1. 其他配置不需要改

/**

  • 发送 html 格式邮件 *
  • @param to 目标邮箱
  • @param subject 邮件主题
  • @param content 邮件内容 */ @Override public void sendHtmlMail(String to, String subject, String content) { // 创建MimeMessage邮件对象 MimeMessage mimeMessage = javaMailSender.createMimeMessage();

    try {

    1. // 参数true表示需要创建一个multipart message
    2. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
    3. mimeMessageHelper.setFrom(from);
    4. mimeMessageHelper.setTo(to);
    5. mimeMessageHelper.setSubject(subject);
    6. // 第二参数表示内容是否为html文本
    7. mimeMessageHelper.setText(content, true);
    8. // 发送邮件
    9. javaMailSender.send(mimeMessage);
    10. LOGGER.info("发送简单邮件成功");

    } catch (MessagingException e) {

    1. e.printStackTrace();
    2. LOGGER.debug("发送 html 格式邮件失败,{}", e.getMessage());

    } }

  1. 2. 测试

@Test public void testHtmlMail() { String content = “\n” + “\n” + “

hello world ! 这是一封Html邮件!

\n” + “\n” + ““; mailService.sendHtmlMail(“lje888@126.com”, “测试发送Html邮件”, content); }

  1. ## 4. 发送带附件的邮件
  2. 1. 本示例是指定一个上传的文件夹,将文件夹中所有文件作为附件上传,一个文件一封邮件
  3. 1. 配置application.yml文件,设置上传文件夹

发送邮件相关参数

mail: fromMail: address: eric_ending@126.com uploadPath: E:\01-暂存处理区\風雲漫畫\不同步\待上传\autoUpload\

  1. 3. 编写上传附件的邮件接口与实现类

/**

  • 发送带附件的邮件 *
  • @param to 目标邮箱
  • @param subject 邮件主题
  • @param content 邮件内容
  • @param fileList 邮件附件对象数组 */ @Override public void sendAttachmentsMail(String to, String subject, String content, File[] fileList) { // 设置系统参数,取消发送邮件附件名称长度限制 System.setProperty(“mail.mime.splitlongparameters”, “false”);

    if (fileList != null && fileList.length > 0) {

    1. try {
    2. for (File filePath : fileList) {
    3. // 创建MimeMessage邮件对象
    4. MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    5. // 参数true表示需要创建一个multipart message
    6. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
    7. mimeMessageHelper.setFrom(from);
    8. mimeMessageHelper.setTo(to);
    9. mimeMessageHelper.setText(content, true);
    10. // 读取文件
    11. FileSystemResource fileSystemResource = new FileSystemResource(filePath);
    12. // 获取文件名称
    13. String fileName = fileSystemResource.getFilename();
    14. // 设置附件,添加多个附件可以使用多条 helper.addAttachment(fileName, file)
    15. mimeMessageHelper.addAttachment(MimeUtility.encodeWord(fileName, "UTF-8", "B"), fileSystemResource);
    16. // 判断是否有主题名称,如果主题为空,则以文件名称做为邮件主题名称
    17. if (StringUtils.isBlank(subject)) {
    18. mimeMessage.setSubject(fileName);
    19. } else {
    20. mimeMessageHelper.setSubject(subject);
    21. }
    22. // 发送邮件
    23. javaMailSender.send(mimeMessage);
    24. LOGGER.info("{}邮件发送成功", fileName);
    25. }
    26. } catch (Exception e) {
    27. e.printStackTrace();
    28. LOGGER.debug("发送附件邮件失败,{}", e.getMessage());
    29. }

    } }

@Override public void sendAttachmentsMail(String to, File[] fileList) { this.sendAttachmentsMail(to, “”, “”, fileList); }

  1. 4. 测试方法

/ 附件上传文件存储路径 / @Value(“${mail.uploadPath}”) private String uploadPath;

@Test public void sendAttachmentsMail() { // 读取配置文件,获取上传文件夹对象 File file = new File(uploadPath);

  1. // 判断是否为文件夹
  2. if (file.isDirectory()) {
  3. // 获取文件夹所有文件名称
  4. File[] fileList = file.listFiles();
  5. mailService.sendAttachmentsMail("eric_ending@126.com", fileList);
  6. }

}

  1. ## 5. 发送带静态资源的邮件
  2. 发送带静态资源的邮件其实就是在发送HTML邮件的基础上嵌入静态资源(比如图片),嵌入静态资源的过程和传入附件类似,唯一的区别在于需要标识资源的cid

package com.springboot.demo.controller;

import java.io.File;

import javax.mail.internet.MimeMessage;

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.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;

@RestController @RequestMapping(“/email”) public class EmailController {

  1. @Autowired
  2. private JavaMailSender jms;
  3. @Value("${spring.mail.username}")
  4. private String from;
  5. @RequestMapping("sendInlineMail")
  6. public String sendInlineMail() {
  7. MimeMessage message = null;
  8. try {
  9. message = jms.createMimeMessage();
  10. MimeMessageHelper helper = new MimeMessageHelper(message, true);
  11. helper.setFrom(from);
  12. helper.setTo("888888@qq.com"); // 接收地址
  13. helper.setSubject("一封带静态资源的邮件"); // 标题
  14. helper.setText("<html><body>博客图:<img src='cid:img'/></body></html>", true); // 内容
  15. // 传入附件
  16. FileSystemResource file = new FileSystemResource(new File("src/main/resources/static/img/sunshine.png"));
  17. helper.addInline("img", file);
  18. jms.send(message);
  19. return "发送成功";
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. return e.getMessage();
  23. }
  24. }

}

  1. > `helper.addInline("img", file);`方法中的img和图片标签里cid后的名称相对应。启动项目访问http://localhost/email/sendInlineMail,提示发送成功
  2. ## 6. 使用模板发送邮件
  3. 1. 在发送验证码等情况下可以创建一个邮件的模板,唯一的变量为验证码。这个例子中使用的模板解析引擎为Thymeleaf,所以首先引入Thymeleaf依赖:
org.springframework.boot spring-boot-starter-thymeleaf
  1. 2. template目录下创建一个emailTemplate.html模板

<!DOCTYPE html>

您好,您的验证码为{code},请在两分钟内使用完成操作。
  1. 3. 发送模板邮件,本质上还是发送HTML邮件,只不过多了绑定变量的过程

package com.springboot.demo.controller;

import java.io.File;

import javax.mail.internet.MimeMessage;

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.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context;

@RestController @RequestMapping(“/email”) public class EmailController {

  1. @Autowired
  2. private JavaMailSender jms;
  3. @Value("${spring.mail.username}")
  4. private String from;
  5. @Autowired
  6. private TemplateEngine templateEngine;
  7. @RequestMapping("sendTemplateEmail")
  8. public String sendTemplateEmail(String code) {
  9. MimeMessage message = null;
  10. try {
  11. message = jms.createMimeMessage();
  12. MimeMessageHelper helper = new MimeMessageHelper(message, true);
  13. helper.setFrom(from);
  14. helper.setTo("888888@qq.com"); // 接收地址
  15. helper.setSubject("邮件摸板测试"); // 标题
  16. // 处理邮件模板
  17. Context context = new Context();
  18. context.setVariable("code", code);
  19. String template = templateEngine.process("emailTemplate", context);
  20. helper.setText(template, true);
  21. jms.send(message);
  22. return "发送成功";
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. return e.getMessage();
  26. }
  27. }

}

```

其中code对应模板里的${code}变量。启动项目,访问http://localhost/email/sendTemplateEmail?code=EOS9,页面提示发送成功

7. (!待整理)邮件系统

8. 其他

Spring Boot (十):邮件服务
SpringBoot 发送邮件和附件(实用版)
https://mrbird.cc/Spring-Boot-Email.html