前景介绍
在日常的工作中,我们经常会用到邮件服务,比如发送验证码,找回密码确认,注册时邮件验证等,所以今天在这里进行邮件服务的一些操作。
大致思路
我们要做的其实就是把 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 的用法~
后记
邮件在这里就告一段落了,下篇预告:JVM 系列(一):JVM 简介,敬请期待,谢谢大家一直以来的支持!
公众号
原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知!