一、获取服务器授权码
简单来说,就是你需要使用什么邮箱来发送邮件,需要获取到这个发送邮箱的授权码才能有这个权限,这里使用 QQ 邮箱为例



这个就是 QQ 邮箱的授权码,请妥善保管
二、基本配置
1. 添加相关的 POM 文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2. 配置 yml 文件
spring:
mail:
# 配置 SMTP 服务器地址
host: smtp.qq.com
# 发送者邮箱
username: xxxx@qq.com
# 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
password: xxxxxx
# 端口号465或587
port: 587
# 默认的邮件编码为UTF-8
default-encoding: UTF-8
# 配置SSL 加密工厂
properties: # 设置邮件超时时间防止服务器阻塞
timeout: 5000
connection-timeout: 5000
write-timeout: 5000
mail:
smtp:
socketFactoryClass: javax.net.ssl.SSLSocketFactory
#表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
debug: true
-
126邮箱 服务器地址:smtp.126.com,端口号:465 或者 994 -
2163邮箱 服务器地址:smtp.163.com,端口号:465 或者 994 -
yeah邮箱 服务器地址:smtp.yeah.net,端口号:465 或者 994 -
qq邮箱 服务器地址:smtp.qq.com,端口号 465 或 587
三、邮件服务
1. 定义邮件接口
public interface IEmailService {
/**
* 普通邮件发送
*
* @param form 发送人
* @param to 发送对象
* @param subject 主题
* @param content 内容
*/
void sendText(String form, String to, String subject, String content);
/**
* Html邮件发送
*
* @param form 发送人
* @param to 发送对象
* @param subject 主题
* @param content 内容
*/
void sendHtml(String form, String to, String subject, String content);
/**
* 邮件发送
*
* @param name 发送人名称
* @param form 发送人
* @param to 发送对象
* @param subject 主题
* @param content 内容
* @param isHtml 是否为html
* @param cc 抄送,多人用逗号隔开
* @param bcc 密送,多人用逗号隔开
* @param files 文件
*/
void send(String name, String form, String to, String subject, String content, Boolean isHtml, String cc, String bcc, List<File> files);
}
这里我定义了三个邮件发送的接口,一个是普通文本,一个是 HTML 的,最后一个是综合类型的,可以根据参数自己配置内容(附件,抄送等配置)
2. 邮件实现类
@Slf4j
@Service
public class EmailServiceImpl implements IEmailService {
@Autowired
private JavaMailSender javaMailSender;//注入邮件工具类
@Override
public void send(String name, String form, String to, String subject, String content, Boolean isHtml, String cc, String bcc, List<File> files) {
if (StringUtils.isAnyBlank(form, to, subject, content)) {
throw new ServiceException("发送人,接收人,主题,内容均不可为空");
}
try {
//true表示支持复杂类型
MimeMessageHelper messageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(), true);
//邮件发信人
messageHelper.setFrom(new InternetAddress(name + "<" + form + ">"));
//邮件收信人
messageHelper.setTo(to.split(","));
//邮件主题
messageHelper.setSubject(subject);
//邮件内容
messageHelper.setText(content, isHtml);
//抄送
if (!StringUtils.isEmpty(cc)) {
messageHelper.setCc(cc.split(","));
}
//密送
if (!StringUtils.isEmpty(bcc)) {
messageHelper.setCc(bcc.split(","));
}
//添加邮件附件
if (CollectionUtil.isNotEmpty(files)) {
for (File file : files) {
messageHelper.addAttachment(file.getName(), file);
}
}
// 邮件发送时间
messageHelper.setSentDate(new Date());
//正式发送邮件
javaMailSender.send(messageHelper.getMimeMessage());
} catch (Exception e) {
throw new ServiceException("邮件发送失败", e);
}
}
@Override
public void sendText(String form, String to, String subject, String content) {
this.send("评论提醒", form, to, subject, content, false, null, null, null);
}
@Override
public void sendHtml(String form, String to, String subject, String content) {
this.send("评论提醒", form, to, subject, content, true, null, null, null);
}
}
测试发送

每一行代码的注释我也都注释了,不难解释,这里我提出一点的是
//邮件发信人
messageHelper.setFrom(new InternetAddress(name + "<" + form + ">"));
这里是为了发送邮件的时候的发送者名称可以自定义,而不是上述中的邮箱名称

这样是不是好看多了
3.HTML 邮件
有时候,我们需要展示好看的邮件格式用 HTML 编写,然后使用占位符填充 HTML 的内容,所以这里使用TemplateEngine
来做
-
新增 POM
<!--thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
-
创建 HTML 模板 在 resoureces 文件夹下创建 template.html 文件

这里还是以博客回复发送的邮件为例
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>评论提醒</title>
<style>
.button {
background-color: rgb(14 165 233);
border-radius: 10px;
border: #181818;
color: white;
padding: 6px 10px;
}
.avatar {
width: 60px;
height: 60px;
border-radius: 9px;
}
</style>
</head>
<body>
<div>
<div style="display: flex;align-items: center">
<img class="avatar" src="https://q1.qlogo.cn/headimg_dl?dst_uin=1032065316&spec=100" alt="头像">
<div style="display: block;margin-left: 10px">
<p th:text="'您好,'+${oldNickname}"></p>
<p>您在本站的留言收到了回复:</p>
</div>
</div>
<p><strong>您的评论内容:</strong></p>
<p th:text="${oldContent}"></p>
<p><strong th:text="${nickname}+'回复内容:'"></strong></p>
<p th:text="${newContent}"><strong></strong></p>
<button class="button">
<a th:href="${url}">查看详细内容</a>
</button>
<p>此邮件由系统自动发出,请勿直接回复</p>
</div>
</body>
</html>
这里的${}就是占位符,在发送的时候填充数据即可,具体的thymeleaf
相关语法写法可以去百度找找
-
发送 HTML 邮件
@SpringBootTest
public class EmailTest implements Serializable {
@Autowired
private IEmailService emailService;
@Autowired
private TemplateEngine templateEngine;
@Test
public void test_email_text() {
Context context = new Context();
context.setVariable("avatar", "https://q1.qlogo.cn/headimg_dl?dst_uin=1032065316&spec=100");
context.setVariable("nickname", "Mr.Sun");
context.setVariable("newContent", "测试新的评论");
context.setVariable("oldContent", "这是旧的评论");
context.setVariable("oldNickname", "腾讯视频");
context.setVariable("url", "https://www.xiaoquanya.com");
String content = templateEngine.process("commentTemplate.html", context);
emailService.sendHtml("xxxx@qq.com", "xxxx@qq.com", "您在 『 Mr.Sun的博客 』上的留言有新的回复", content);
}
}
这里使用Context context = new Context();
来填充刚刚的 html 中的数据,然后发送就可以了
原文始发于微信公众号(一零贰肆):最详细的SpringBoot发送邮件教程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/250557.html