SpringBoot发送邮件
SpringBoot发送邮件
邮件发送是一个很常见的功能,注册身份认证,找回密码等场景都会用到邮件发送。Spring Boot提供了MailSenderAutoConfiguration 对邮件的发送做了进一步简化。
SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。
也就是说 abc@qq.com 用户先将邮件投递到腾讯的 SMTP 服务器这个过程就使用了 SMTP 协议,然后腾讯的 SMTP 服务器将邮件投递到网易的 SMTP 服务器这个过程也依然使用了 SMTP 协议,SMTP 服务器就是用来收邮件。
而 POP3 协议全称为 Post Office Protocol ,译作邮局协议,它定义了邮件客户端与 POP3 服务器之间的通信规则,那么该协议在什么场景下会用到呢?当邮件到达网易的 SMTP 服务器之后,abc@163.com 用户需要登录服务器查看邮件,这个时候就该协议就用上了:邮件服务商都会为每一个用户提供专门的邮件存储空间,SMTP 服务器收到邮件之后,就将邮件保存到相应用户的邮件存储空间中,如果用户要读取邮件,就需要通过邮件服务商的 POP3 邮件服务器来完成。
申请开通POP3/SMTP服务
文章以qq邮箱的方式(其他邮箱步骤相同)
进入邮箱——>打开设置——>账户
在这里插入图片描述
- 找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
- 打开POP3/SMTP服务,开启服务后保存好授权码
授权码可以配置多个,如果忘记授权码可以重新申请。
环境搭建
1.引入依赖
<!-- Spring Mail依赖(发送邮件) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.配置邮箱信息
server:
port: 8080
spring:
mail:
# 配置 SMTP 服务器地址
host: smtp.qq.com
# 发送者邮箱,已开通POP3/SMTP服务的邮箱,也就是你自己的
username: xxxxx@qq.com
# 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
password: 123456
# 发送人昵称
nickname: ufo_21
# 端口号465或587(QQ邮箱发送邮件仅支持587端口协议)
port: 587
# 默认的邮件编码为UTF-8
default-encoding: UTF-8
# 配置SSL 加密工厂
properties:
mail:
smtp:
socketFactoryClass: javax.net.ssl.SSLSocketFactory
#表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
debug: true
邮箱类型 | SMTP服务器地址 | 端口号 |
---|---|---|
QQ邮箱 | smtp.qq.com | 465或587 |
sina邮箱 | smtp.sina.cn | 465或587 |
126邮箱 | smtp.126.com | 465或994 |
aliyun邮箱 | smtp.aliyun.com | 465或994 |
163邮箱 | smtp.163.com | 465或994 |
yeah邮箱 | smtp.yeah.net | 465或994 |
普通邮件发送
package com.ufo.maildemo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import java.util.Date;
@SpringBootTest
class MailDemoApplicationTests {
@Autowired
private JavaMailSender javaMailSender;
// 获取yml配置的发送者邮箱
@Value("${spring.mail.username}")
private String mainUserName;
//发送人昵称
@Value("${spring.mail.nickname}")
private String nickname;
/**
* 普通邮件发送
*/
@Test
public void sendSimpleMail() {
// 构建一个邮件对象
SimpleMailMessage message = new SimpleMailMessage();
// 设置邮件主题
message.setSubject("测试邮件");
// 设置邮件发送者,昵称+<邮箱地址>
message.setFrom(nickname+'<'+mainUserName+'>');
// 设置邮件接收者,可以有多个接收者,多个接受者参数需要数组形式
message.setTo("y****@163.com");
// 设置邮件抄送人,可以有多个抄送人
message.setCc("12****32*qq.com");
// 设置隐秘抄送人,可以有多个
message.setBcc("7******9@qq.com");
// 设置邮件发送日期
message.setSentDate(new Date());
// 设置邮件的正文
message.setText("hello,do you one more");
// 发送邮件
javaMailSender.send(message);
}
}
发送效果如下:
FreeMarker模板发送邮件
对于格式比较复杂的邮件,推荐使用HTML模板
- 引入FreeMarker依赖
<!-- FreeMarker模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- 定义模板文件
在resources目录创建templates文件,把模板保存在templates下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="utf-8">
<title>${title}</title>
<style>
.hello {
display: flex !important;
justify-content: center !important;
}
.areaBox {
width: 500px;
box-sizing: border-box;
}
.areaBox > .title {
font-size: 2em;
}
.text {
margin-bottom: 20px;
color: #536AD8;
}
</style>
</head>
<body>
<div class="hello">
<div class="areaBox">
<p class="title">${title}</p>
<p class="text">这是个模板</p>
</div>
</div>
</body>
</html>
- 使用FreeMarker模版渲染出邮件内容(代码)
/**
* FreeMarker模板发送邮件
*/
@Test
public void sendFreeMarkerMail() throws IOException, MessagingException, TemplateException {
// 首先配置 FreeMarker 模版位置
Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
// MailDemoApplication是启动类类名
ClassLoader loader = MailDemoApplication.class.getClassLoader();
configuration.setClassLoaderForTemplateLoading(loader, "templates");
// 配置模版文件
Template template = configuration.getTemplate("mail.ftl");
// 渲染模版
StringWriter mail = new StringWriter();
HashMap<String, Object> map = new HashMap<>();
map.put("title", "FreeMarker标题");
template.process(map, mail);
// 构建一个邮件对象
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 设置邮件发送者
message.setFrom(nickname+'<'+mainUserName+'>');
// 设置邮件接收者
helper.setTo("y******9@163.com");
// 设置邮件的主题
message.setSubject("FreeMarker模板发送邮件");
// 设置邮件的正文
helper.setText(mail.toString(), true);
// 发送邮件
javaMailSender.send(message);
}
发送效果如下:
如果想使用Thymeleaf模板发送邮件也是可以的,照葫芦画瓢。