SpringBoot邮件发送

介绍

邮件发送是一个非常常见的功能,注册时的身份认证、重要通知发送等都会用到邮件发送。Spring中提供了JavaMailSender用来简化邮件配置,Spring Boot则提供了MailSenderAutoConfiguration对邮件的发送做了进一步简化。下面就来看看Spring Boot中如何发送邮件。

QQ邮箱开启服务

以QQ邮箱为例,首先要申请开通POP3/SMTP服务或者IMAP/SMTP服务。SMTP全称为Simple MailTransfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件与SMTP服务器之间,以及SMTP服务器与SMTP服务器之间的通信规则。

什么是 POP3/IMAP/SMTP 服务

  • POP3 (Post Office Protocol - Version 3)协议用于支持使用电子邮件客户端获取并删除在服务器上的电子邮件。
  • MAP (Internet Message Access Protocol)协议用于支持使用电子邮件客户端交互式存取服务器上的邮件。
  • SMTP (Simple Mail Transfer Protocol)协议用于支持使用电子邮件客户端发送电子邮件。

开启POP3/SMTP服务

网页登录QQ邮箱,点击左上角设置按钮,再点击账户,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,点击开启按钮,发送短信验证,获取授权码

什么是授权码

授权码是QQ邮箱用于登录第三方客户端/服务的专用密码,适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务。

Tips:更改QQ帐号密码会触发授权码过期,需要重新获取新的授权码登录。

发送邮件

引入依赖

使用SpringBoot发送邮件,首先要添加邮件依赖:

1
2
3
4
5
<!--添加邮件依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

配置yml

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
mail:
host: smtp.qq.com #邮件服务器地址
port: 465 #端口号
username: QQ邮箱
password: 上面获取的授权码
default-encoding: UTF-8 #默认编码格式
properties:
mail:
debug: true #启动debug调试
smtp:
socketFactory:
class: javax.net.ssl.SSLSocketFactory #SSL连接配置

Tips:服务器地址和端口是可以在邮件的帮助中心看到的(QQ邮箱=>帮助中心=>搜索SSL),端口号可以使用456或587。

发送邮件

编码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Component
public class MyMailService {

@Autowired
JavaMailSender javaMailSender; // 引入发送邮件类

public void sendMail(String from,String to,String cc,String subject,String text){
SimpleMailMessage smm = new SimpleMailMessage();
smm.setFrom(from);//发送者
smm.setTo(to);//收件人
smm.setCc(cc);//抄送人
smm.setSubject(subject);//邮件主题
smm.setText(text);//邮件内容
javaMailSender.send(smm);//发送邮件
}
}
  • JavaMailSender是Spring Boot在MailSenderPropertiesConfiguration类中配置好的,该类在Mail自动配置类MailSenderAutoConfiguration中导入,因此这里注入JavaMailSender就可以使用了
  • 简单邮件可以直接构建一个SimpleMailMessage对象进行配置,配置完成后,通过JavaMailSender将邮件发送出去

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@SpringBootTest
public class MyMailServiceTest {
@Autowired
MyMailService myMailService;
@Test
public void sendMailTest(){
myMailService.sendMail(
"1274604930@qq.com",
"1274604930@qq.com",
"1274604930@qq.com",
"测试发送邮件",
"邮件发送成功啦!");
}
}

测试发送复杂邮件:

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
@Autowired
JavaMailSender javaMailSender; // 引入发送邮件类

//测试复杂邮件发送
@Test
void test01() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
// true表示带附件
MimeMessageHelper msg = new MimeMessageHelper(mimeMessage, true);
String id = "test";
String path = "C:\\Users\\86173\\Desktop\\71(J}4SMX$~3X}0CTIU78FV.png";
//邮件的主题
msg.setSubject("这是包含图片测试邮件主题");
//邮件的内容,注意格式,true表示解析html
msg.setText("<h1>图片:</h1><img src='cid:" + id + "'/>", true);
FileSystemResource resource = new FileSystemResource(new File(path));
// 插入图片
msg.addInline(id, resource);
// 添加附件
msg.addAttachment("test.png", resource);
//邮件的发送方,对应配置文件中的spring.mail.username
msg.setFrom("1274604930@qq.com");
//邮件发送时间
msg.setSentDate(new Date());
//邮件接收方
msg.setTo("1274604930@qq.com");
//执行发送
javaMailSender.send(mimeMessage);
}

这里使用MimeMessageHelper简化了邮件配置,它的构造方法的第二个参数true表示构造一个multipart message类型的邮件。最后通过addAttachment方法添加附件。

至此,使用SpringBoot实现邮件发送就完成了。