使用Spring Boot的JavaMailSender实现邮件发送

今天写项目的时候用到了邮件发送,顺便在这里总结一下实现方式,本文演示的是使用Spring Boot的JavaMailSender实现邮件发送,功能的实现非常简单。

一、准备工作

1. 引入发送邮件依赖(pom.xml)

邮件功能由 Spring 官方提供的 spring-boot-starter-mail 起步依赖实现。在 pom.xml<dependencies> 中加入:

 <!-- spring官方提供的JavaMailSender发送邮件依赖(spring-boot-starter-mail)-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-mail</artifactId>
 </dependency>

版本号不用写,由 spring-boot-starter-parent 统一管理。导入后项目就能自动装配 JavaMailSender

2. 获取邮箱授权码

用SMTP发邮件不能直接用邮箱登录密码,而要用邮箱服务的授权码(独立密码)。以 QQ 邮箱为例:

  1. 登录 QQ 邮箱网页版 →设置→账户;
  2. 找到POP3/IMAP/SMTP服务→ 开启SMTP 服务;
  3. 开启时会要求生成一个授权码(16 位字符串),这就是下面 yml 里 password 要填的值。

3. 配置邮箱信息(application.yml)

spring 节点下新增 mail 配置块:

 spring:
   mail:
     host: smtp.qq.com
     port: 465
     username: 你的QQ邮箱@qq.com
     password: 你的邮箱授权码
     default-encoding: UTF-8
     properties:
       mail:
         smtp:
           auth: true
           ssl:
             enable: true

二、发送邮件DEMO

可以在测试类里编写Demo来演示发送邮件功能,这里分别演示纯文本邮件HTML/附件邮件

1. 注入与纯文本邮件(SimpleMailMessage)


 @SpringBootTest
 class DemoApplicationTests {
 ​
     // 自动注入Spring容器中由 spring-boot-starter-mail 自动装配好的 JavaMailSender
     @Autowired
     private JavaMailSender mailSender;
 ​
     /**
      * DEMO1:发送一封最简单的纯文本邮件
      * SimpleMailMessage:Spring 提供的简单邮件对象,只能发纯文本,不能带附件/HTML
      */
     @Test
     void sendSimpleMail() {
         // 1.创建一封简单的邮件消息对象(new一个空对象)
         SimpleMailMessage message = new SimpleMailMessage();
         // 2.设置发件人(要和 yml 里配置的 username 一致)
         message.setFrom("你的QQ邮箱@qq.com");
         // 3.设置收件人(可以写多个,逗号隔开)
         message.setTo("收件人邮箱@xx.com");
         // 4.设置邮件主题
         message.setSubject("这是一封测试邮件");
         // 5.设置邮件正文(纯文本)
         message.setText("你好,这是使用 Spring Boot JavaMailSender 发送的第一封邮件!");
         // 6.调用 send 方法真正发出
         mailSender.send(message);
         // 注意:测试方法跑完如果没抛异常,就说明发送成功
     }
}

2. HTML 带附件邮件(MimeMessageHelper)

SimpleMailMessage 能力有限,只能纯文本、不能带附件和 HTML。要发富文本邮件,改用 MimeMessage + MimeMessageHelper

 /**
  * DEMO2:发送支持附件、内联图片的复杂邮件
  * MimeMessageHelper:底层 mail 对象,可发 HTML、带附件
  */
 @Test
 void sendMimeMail() throws MessagingException {
     // 1.创建底层 MimeMessage(封装真正的SMTP报文)
     MimeMessage mimeMessage = mailSender.createMimeMessage();
     // 2.用 MimeMessageHelper 来填充内容,true 表示允许携带附件/多部分
     //   这里不指定编码,会读取 yml 里配置的 default-encoding: UTF-8
     MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
     // 3.分别设置发件人、收件人、主题
     helper.setFrom("你的QQ邮箱@qq.com");
     helper.setTo("收件人邮箱@xx.com");
     helper.setSubject("带附件的测试邮件");
     // 4.支持 HTML 正文(第二个参数传 true 表示按HTML解析)
     helper.setText("<h1>你好</h1><p style='color:red'>这是一封 <b>HTML</b> 邮件</p>", true);
     // 5.添加附件(传入本地文件路径,第二个参数是邮件里显示的文件名)
     helper.addAttachment("demo.txt", new java.io.File("D:\\Desktop\\demo.txt"));
     // 6.真正发送
     mailSender.send(mimeMessage);
 }

自行总结整理,如有错误欢迎留言讨论。

THE END
文章版权归Tinsur.cn所有,转载分享请标注原链接
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容