Spring Boot 2.x (十八):邮件服务一文打尽

it2022-05-09  59

前景介绍

在日常的工作中,我们经常会用到邮件服务,比如发送验证码,找回密码确认,注册时邮件验证等,所以今天在这里进行邮件服务的一些操作。

大致思路

我们要做的其实就是把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简介,敬请期待,谢谢大家一直以来的支持!

公众号

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知!

转载于:https://www.cnblogs.com/viyoung/p/11205018.html

相关资源:数据结构—成绩单生成器

最新回复(0)