SpringBoot2 | 第二十二篇:使用JavaMailSender发送邮件

​ 相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送。在Spring Boot的Starter模块中也为此提供了自动化配置。下面通过实例看看如何在Spring Boot中使用JavaMailSender发送邮件。这里以 QQ邮件 为例

[TOC]

环境/版本一览:

  • 开发工具:Intellij IDEA 2018.2.2
  • springboot: 2.0.6.RELEASE
  • jdk:1.8.0_171
  • maven:3.3.9
  • spring-boot-starter-mail: 2.0.6.RELEASE

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入 JavaMailSender 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

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

application.yml

1
2
3
4
5
6
7
8
9
10
11
spring:
mail:
default-encoding: utf-8
# SMTP server host. For instance, `smtp.example.com`.
host: smtp.qq.com
# 账号
username: xxx@qq.com
# 密码(授权码)
password: xxxxxxxxxxxxxx
# 协议默认为 SMTP
protocol: smtp

如何获得授权码?

打开我的邮箱,选择设置

1540784160579

选择账户 ,找到服务,点击开启

1540784255454

发送短信,签证成功后既可获得授权码

1540784318779

1540784373938

入门

Test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.fatal;

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.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.test.context.junit4.SpringRunner;

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

@Autowired
private JavaMailSender sender;

@Test
public void sendSimpleMail() {

SimpleMailMessage mailMessage = new SimpleMailMessage();

mailMessage.setFrom("634137063@qq.com"); // 发送者
mailMessage.setTo("2235535456@qq.com"); // 接收者
mailMessage.setSubject("您好,这是fatal的一份邮件"); // 标题
mailMessage.setText("Hello world!"); // 内容

sender.send(mailMessage);
}

}

显示

启动程序测试方法 Chapter22ApplicationTests.sendSimpleMail()

1540784594122

进阶

​ 在上例中,我们通过使用SimpleMailMessage实现了简单的邮件发送,但是实际使用过程中,我们还可能会带上附件、或是使用邮件模块等。这个时候我们就需要使用MimeMessage来设置复杂一些的邮件内容,下面我们就来依次实现一下。下面的例子会以 发送附件嵌入静态资源 为例

Test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.fatal;

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.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.test.context.junit4.SpringRunner;

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

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

@Autowired
private JavaMailSender mailSender;

private static String FILENAME = "娜美桌面壁纸";

private static String PATHNAME = "E:/Pictures/桌面壁纸/娜美.png";

@Test
public void sendAttachmentsMail() throws Exception {

MimeMessage mimeMessage = mailSender.createMimeMessage();

/**
* 第二个参数表示是否创建多部分消息
*/
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

helper.setFrom("634137063@qq.com"); // 发送者
helper.setTo("2235535456@qq.com"); // 接收者
helper.setSubject("桌面壁纸"); // 标题

// 嵌入静态资源
helper.setText("<html><body><h1></h1><img style='max-width: 500px' src=\"cid:wallpaper\" ></body></html>", true); // 内容
// FileSystemResource 加载绝对路径的流
FileSystemResource file = new FileSystemResource(new File(PATHNAME));
// 设置 contentId 及其对应的 `文件资源`(Resource)
helper.addInline("wallpaper", file);

// 在邮件中添加附件,添加多个附件可以使用多条
// helper.addAttachment(附件名, 附件对象);
helper.addAttachment(FILENAME, file);

mailSender.send(mimeMessage);

}

}

这里需要注意的是addInline函数中资源名称==wallpaper==需要与正文中==cid:wallpaper==对应起来

显示

启动程序测试方法 Chapter22ApplicationTests.sendAttachmentsMail()

1540789898187

注意

  1. 如果需要设置替代文本或添加内联元素或附件,则通过构造函数创建适当的MimeMessageHelper,该构造函数采用“multipart”标志。

    MimeMessageHelper(MimeMessage mimeMessage)

    MimeMessageHelper(MimeMessage mimeMessage, boolean multipart)

    使用第一个构造方法会报错

    1
    java.lang.IllegalStateException: Not in multipart mode - create an appropriate MimeMessageHelper via a constructor that takes a 'multipart' flag if you need to set alternative texts or add inline elements or attachments.

参考资料

Spring Boot中使用JavaMailSender发送邮件

总结

SpringBoot的知识已经有前辈在我们之前探索了。比较喜欢的博主有:唐亚峰 | Battcn方志朋的专栏程序猿DD纯洁的微笑。对这门技术感兴趣的可以去他们的博客逛逛。谢谢他们的分享~~

以上文章是我用来学习的Demo,都是基于 SpringBoot2.x 版本。

源码地址: https://github.com/ynfatal/springboot2-learning/tree/master/chapter22

学习 翟永超 前辈的经验