Spring Boot 2.x (十八):邮件服务一文打尽
前景介绍
在日常的工作中,我们经常会用到邮件服务,比如发送验证码,找回密码确认,注册时邮件验证等,所以今天在这里进行邮件服务的一些操作。
大致思路
我们要做的其实就是把Java程序作为一个客户端,然后通过配置SMTP协议去连接我们所使用的发送邮箱(from)对应的SMTP服务器,然后通过SMTP协议,将邮件转投到目标邮箱(to)对应的SMTP服务器,最后将该邮件分发到目标邮箱

Spring Boot给我们集成了邮件的相关服务,并给出了对应的starter,这里我们来实战学习一下邮件服务是怎么玩的。
引入POM
万年不变的第一步:引入所需要的starter依赖,这里我采用的是和我的Spring Boot对应的版本2.1.4,其余版本的话应该是相差不大,可以同样作为借鉴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
配置文件
这里由于国内有几大邮箱运营商,所以分为四种不同的情况来说明
QQ邮箱
QQ邮箱是比较麻烦的一种,需要登录到邮箱中找到对应的配置,并验证密码后开启STMP服务


点击这里可以去获取对应的授权码,后面的配置中我们会用到~
- 个人QQ邮箱的SMTP服务器的host是:smtp.qq.com
163邮箱
对应的授权码就是我们邮箱的密码~
SMTP服务器的host是:smtp.163.com
腾讯企业邮箱
对应的授权码也是我们邮箱的密码
企业的和个人的host略有不同:smtp.exmail.qq.com
阿里企业邮箱
对应的授权码也是我们邮箱的密码
阿里的企业邮箱host是: smtp.mxhichina.com
得到对应的信息之后,我们就可以去完善我们的配置信息了 ~
# 这里的host对应是上面的几大运营商的STMP服务器的host
spring.mail.host=smtp.163.com
spring.mail.username=****@163.com
# 这里的password对应的就是上面的授权码
spring.mail.password=***
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8
编写邮件的实体类
/**
* 邮件实体类
* @author vi
* @since 2019/07/17
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Mail {
/**
* 邮件发送人
*/
private String from;
/**
* 邮件接收人
*/
private String to;
/**
* 邮件主题
*/
private String subject;
/**
* 邮件内容
*/
private String content;
/**
* 邮件主题
*/
private String type;
/**
* 发送邮件模板时的模板文件名
*/
private String templateName;
/**
* 模板参数
*/
private Map<String,Object> variables;
/**
* 附件地址
*/
private String attachPath;
}
编写发送邮件的方法
在这里,我将发送邮件分为了两种情况:
- 发送普通邮件
/**
* 发送普通邮件
* @param email 邮件对象
*/
private static void sendSimpleMail(Mail email) {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
// 邮件发送人
simpleMailMessage.setFrom(email.getFrom());
// 邮件接收人
simpleMailMessage.setTo(email.getTo());
// 邮件主题
simpleMailMessage.setSubject(email.getSubject());
// 邮件内容
simpleMailMessage.setText(email.getContent());
// 发送邮件
javaMailSender.send(simpleMailMessage);
}
- 发送MIME类型邮件(比如模板,附件,HTML都属于该类型的邮件)
/**
* 发送MIME类型的邮件
* @param email 邮件对象
*/
private static void sendMimeMail(Mail email) {
// 生成邮件字符串
String content = email.getContent();
if (email.getVariables() != null) {
content = generate(email);
}
// 基于这个对象可以发送HTML,或者携带附件的二进制邮件
MimeMessage message= javaMailSender.createMimeMessage();
try {
// 构建发送模板邮件的对象
MimeMessageHelper helper = new MimeMessageHelper(message,true);
// 设置发送邮箱
helper.setFrom(email.getFrom());
// 设置接收邮箱
helper.setTo(email.getTo());
// 设置邮件名(主题)
helper.setSubject(email.getSubject());
// 设置邮件内容
helper.setText(content,true);
// 这里可以发送带有附件的邮件,如果没有附件可以省略,就不在多做描述
if (!StringUtils.isNullOrEmpty(email.getAttachPath())) {
FileSystemResource file = new FileSystemResource(new File(email.getAttachPath()));
helper.addAttachment(file.getFilename(), file);
}
// 发送邮件
javaMailSender.send(message);
} catch (MessagingException e) {
}
}
/**
* 生成模板字符串
* @param email 邮件对象
* @return
*/
private static String generate(Mail email) {
Context context = new Context();
// 设置模板参数
context.setVariables(email.getVariables());
// 加载模板后的内容字符串
return templateEngine.process(email.getTemplateName(), context);
}
最后可以把这两个方法统一接口,通过Mail类中的类型来判断调用哪一个方法即可~
/**
* 对外开放的统一发送邮件方法
* @param mail
*/
public static void sendEmail(Mail mail) {
String type = mail.getType();
switch (type) {
case "1":
sendSimpleMail(mail);
case "2":
sendMimeMail(mail);
}
}
关于模板的一些补充
如果我们需要发送模板邮件的话,需要使用到模板引擎freemaker或thymeleaf,这里我拿thymeleaf来说一下~
第一步,可以引入pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
第二步,需要在配置文件中进行配置
spring.thymeleaf.check-template-location=true
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
第三步,通过我们获取到的模板参数对Mail类进行set方法
mail.setVariables(email.getVariables());
第四步,我们需要在模板中去使用参数
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3 style="color: red;" th:text="${username}"></h3>
</body>
</html>
注意,这里的thymeleaf的用法,使用标签th:text来赋值,更多的模板用法,可以去
查阅thymeleaf的用法~
公众号

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知!
Spring Boot 2.x (十八):邮件服务一文打尽的更多相关文章
- Spring Boot 2.X(十八):集成 Spring Security-登录认证和权限控制
前言 在企业项目开发中,对系统的安全和权限控制往往是必需的,常见的安全框架有 Spring Security.Apache Shiro 等.本文主要简单介绍一下 Spring Security,再通过 ...
- Spring Boot 2.X(十三):邮件服务
前言 邮件服务在开发中非常常见,比如用邮件注册账号.邮件作为找回密码的途径.用于订阅内容定期邮件推送等等,下面就简单的介绍下邮件实现方式. 准备 一个用于发送的邮箱,本文是用腾讯的域名邮箱,可以自己搞 ...
- 学习Spring Boot:(十八)Spring Boot 中session共享
前言 前面我们将 Redis 集成到工程中来了,现在需要用它来做点实事了.这次为了解决分布式系统中的 session 共享的问题,将 session 托管到 Redis. 正文 引入依赖 除了上篇文章 ...
- Spring Boot教程(十八)构建RESTful API
首先,回顾并详细说明一下在快速入门中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建 ...
- Spring Boot (十):邮件服务
Spring Boot 仍然在狂速发展,才几个多月没有关注,现在看官网已经到 2.1.0.RELEASE 版本了.准备慢慢在写写 Spring Boot 相关的文章,本篇文章使用 Spring Boo ...
- (转)Spring Boot (十):邮件服务
http://www.ityouknow.com/springboot/2017/05/06/spring-boot-mail.html Spring Boot 仍然在狂速发展,才几个多月没有关注,现 ...
- spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求
spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求 有半年多没有更新了,按照常规剧本,应该会说项目很忙,工作很忙,没空更新,吧啦吧啦,相关的话吧, 但是细想想 ...
- springboot(十):邮件服务
springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了.准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5. ...
- spring boot实战(第十二篇)整合RabbitMQ
前言 最近几篇文章将围绕消息中间件RabbitMQ展开,对于RabbitMQ基本概念这里不阐述,主要讲解RabbitMQ的基本用法.Java客户端API介绍.spring Boot与RabbitMQ整 ...
随机推荐
- 【shell】gerrit同步备份脚本的实现
本期分享下gerrit如何实现备份,由于之前的一台代码服务器直接down掉,所以为了以防万一,开始备份gerrit数据,有人说,gerrit不过是个审查代码的工具,备份这个做什么,git是分布式代码管 ...
- ArcGIS for Desktop入门教程_第八章_Desktop学习资源 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第八章_Desktop学习资源 - ArcGIS知乎-新一代ArcGIS问答社区 1 学习资源 用户在学习和应用过程中,可以参考的资源如下: 1. ...
- C#应用配置信息保存和读取
//保存信息 SystemConfig.WriteConfigData(“字段名称”, “这里是需要保存的内容”); //读取信息 SystemConfig.GetConfigData(“字段名称”, ...
- 赵海军获任中芯国际CEO 邱慈云留任副董事长、非执行董事(年薪40万美元+300万股票的认购权)
集微网消息,中芯国际今日宣布,由赵海军博士接替邱慈云博士担任中芯国际首席执行官,邱慈云博士将留任副董事长.非执行董事,并于2017年6月30日前担任公司全职顾问,于当日生效.邱博士将与赵博士紧密合作, ...
- mysql5.7.18 初始化和运行
比如你下载的mysql位于目录:E:\dbms\mysql下 ---该目录下文会用到. 如果你有mysql应用经验,你肯定配置过my.ini文件,比如修改IP或者Port等信息: 如果你从未用过mys ...
- eclipse 插件编写(一)
由于项目开发进程中有一些重复性的代码进行编写,没有任何业务逻辑,粘贴复制又很麻烦且容易出错,故想起做一个eclipse插件来满足一下自己的工作需要,同时记录一下,以供以后参考与共同学习.本文主要讲解一 ...
- 关于qtcreator+vs2008+CDB调试太卡的问题研究(载入符号表,以及VS调试器的注册表信息)
在刚接触Qt时,对于较大的项目,用qtcreator + vs + cdb 调试时,启动很慢并且单步运行时也经常会出现卡住半分钟以上的情况,一直没有解决.在需要debug的时候大多会在vs2008上安 ...
- .NET错误:未找到类型或命名空间名称
现象:编译项目时提示未找到类型或命名空间名称"... " 解决方法:如果是未找到类型,检查是否引用了类型所在的命名空间,使用using指令:如果是未找到命名空间,那么检查是否引用了 ...
- springboot如何读取自定义配置项
我们springboot项目有自己默认的配置文件,一般地由application.yml和bootstrap.yml组成,前者是模块的配置,后者是微服务的配置,后台比前者先被框架加载. 我们有时需要自 ...
- 浅谈IHttpHandler
在Web应用开发或接口开发时,处理请求接口IHttpHandler随处可见,那么我们这次来简单聊一下这个接口. ASP.NET响应Http请求时常用的两个处理接口,分别是IHttpHandler和IH ...