一、前言
我们经常会听到各种各样的邮件协议,比如 SMTP、POP3、IMAP ,那么这些协议有什么作用,有什么区别?我们先来讨论一下这个问题。
SMTP 是一个基于 TCP/IP 的应用层协议,江湖地位有点类似于 HTTP,SMTP 服务器默认监听的端口号为25
SMTP 协议全称为 Simple Mail Transfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件与 SMTP 服务器之间,以及 SMTP 服务器与 SMTP 服务器之间的通信规则。SMTP 服务器就是用来收邮件。
而 POP3 协议全称为 Post Office Protocol ,译作邮局协议,它定义了邮件客户端与 POP3 服务器之间的通信规则,如果用户要读取邮件,就需要通过邮件服务商的 POP3 邮件服务器来完成。
最后,可能也有小伙伴们听说过 IMAP 协议,这个协议是对 POP3 协议的扩展,功能更强,作用类似。
二、准备工作
目前国内大部分的邮件服务商都不允许直接使用用户名/密码的方式来在代码中发送邮件,都是要先申请授权码,这里以 QQ 邮箱为例,向大家演示授权码的申请流程:
-
首先我们需要先登录 QQ 邮箱网页版,点击上方的设置按钮,再点击账户按钮
-
在账户选项卡中找到开启POP3/SMTP选项,点击开启
-
发送短信验证后回得到一个授权码,将授权码复制保存
三、项目创建
3.1 简单邮件的发送
- 创建springboot项目,导入邮件发送依赖和SpringWeb依赖
- 在application.properties中配置邮箱基本信息
#配置 SMTP 服务器地址
spring.mail.host=smtp.qq.com
#SMTP 服务器的端口
spring.mail.port=587
#配置邮箱用户名
spring.mail.username=1234567890@qq.com
#配置密码,注意,不是真正的密码,而是刚刚申请到的授权码
spring.mail.password=xxxxxxxxxxxxxxxx
#默认的邮件编码
spring.mail.default-encoding=UTF-8
#配饰 SSL 加密工厂
spring.mail.properties.mail.smtp.socketFactoryClass=javax.net.ssl.SSLSocketFactory
#表示开启 DEBUG 模式
spring.mail.properties.mail.debug=true
- 发送简单的邮件,在单元测试中写一下代码点击运行即可
@Autowired
JavaMailSender mailSender;
@Test
public void test01() {
//构建一封简单邮件
SimpleMailMessage message = new SimpleMailMessage();
//邮件主题
message.setSubject("这是一封测试邮件");
//邮件正文
message.setText("这是邮件正文");
//指定邮件发送者
message.setFrom(from);
//收件人
message.setTo("123456789@qq.com");
//抄送
message.setCc("112233445@qq.com");
//密抄,别人看不到这个收件人
message.setBcc("222222222@qq.com");
//邮件发送日期
message.setSentDate(new Date());
//发送邮件
mailSender.send(message);
}
3.2 复杂邮件的发送(这里使用的是thymeleaf模板)
推荐在 SpringBoot 中使用 Thymeleaf 来构建邮件模板。因为 Thymeleaf 的自动化配置提供了一个TemplateEngine,通过 TemplateEngine 可以方便的将 Thymeleaf 模板渲染为 HTML。
- 导入thymeleaf依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 创建邮件模板
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
欢迎 <span th:text="${username}"></span>
加入 Java开发大家庭,您的入职信息如下:
</div>
<div>
<table>
<tr>
<td>职位名称:</td>
<td th:text="${position}"></td>
</tr>
<tr>
<td>上级:</td>
<td th:text="${leader}"></td>
</tr>
<tr>
<td>薪水</td>
<td th:text="${salary}"></td>
</tr>
</table>
如果入职信息无误,请点击如下链接确认:
<div><a href="https://qq.yh31.com/tp/mr/202106011140588967.jpg">确认</a></div>
<img src="https://qq.yh31.com/tp/mr/202105141224077749.jpg" alt="">
</div>
</body>
</html>
- 发送邮件
@Autowired
JavaMailSender mailSender;
@Value("${spring.mail.username}")
String from;
@Autowired
TemplateEngine templateEngine;
@Test
public void test02() throws MessagingException {
//创建一个复杂邮件
MimeMessage mimeMessage = mailSender.createMimeMessage();
//MimeMessageHelper 是一个配置邮件对象的辅助工具
//如果邮件带附件,注意第二个参数要设置为 true
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//邮件主题
helper.setSubject("这是一封来自一个大帅比的邮件");
Context context = new Context();
context.setVariable("username", "XXX");
context.setVariable("position",
"Java开发工程师");
context.setVariable("leader", "石XX");
context.setVariable("salary", "20000");
String mail = templateEngine.process("email", context);
//邮件正文
helper.setText(mail,true);
//指定邮件发送者
helper.setFrom(from);
//收件人
helper.setTo("11111112220@qq.com");
抄送
//helper.setCc("xxxxx@qq.com");
密抄,别人看不到这个收件人
//helper.setBcc("xxxxxx@qq.com");
//邮件发送日期
helper.setSentDate(new Date());
//加附件
//helper.addAttachment("图片",new File("E:\\GZ-2201\\third\\springboot\\SpringBootProject\\mail\\src\\main\\resources\\static\\java.jpg"));
mailSender.send(mimeMessage);
}