前景介绍

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

大致思路

我们要做的其实就是把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 (十八):邮件服务一文打尽的更多相关文章

  1. Spring Boot 2.X(十八):集成 Spring Security-登录认证和权限控制

    前言 在企业项目开发中,对系统的安全和权限控制往往是必需的,常见的安全框架有 Spring Security.Apache Shiro 等.本文主要简单介绍一下 Spring Security,再通过 ...

  2. Spring Boot 2.X(十三):邮件服务

    前言 邮件服务在开发中非常常见,比如用邮件注册账号.邮件作为找回密码的途径.用于订阅内容定期邮件推送等等,下面就简单的介绍下邮件实现方式. 准备 一个用于发送的邮箱,本文是用腾讯的域名邮箱,可以自己搞 ...

  3. 学习Spring Boot:(十八)Spring Boot 中session共享

    前言 前面我们将 Redis 集成到工程中来了,现在需要用它来做点实事了.这次为了解决分布式系统中的 session 共享的问题,将 session 托管到 Redis. 正文 引入依赖 除了上篇文章 ...

  4. Spring Boot教程(十八)构建RESTful API

    首先,回顾并详细说明一下在快速入门中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建 ...

  5. Spring Boot (十):邮件服务

    Spring Boot 仍然在狂速发展,才几个多月没有关注,现在看官网已经到 2.1.0.RELEASE 版本了.准备慢慢在写写 Spring Boot 相关的文章,本篇文章使用 Spring Boo ...

  6. (转)Spring Boot (十):邮件服务

    http://www.ityouknow.com/springboot/2017/05/06/spring-boot-mail.html Spring Boot 仍然在狂速发展,才几个多月没有关注,现 ...

  7. spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求

    spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求 有半年多没有更新了,按照常规剧本,应该会说项目很忙,工作很忙,没空更新,吧啦吧啦,相关的话吧, 但是细想想 ...

  8. springboot(十):邮件服务

    springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了.准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5. ...

  9. spring boot实战(第十二篇)整合RabbitMQ

    前言 最近几篇文章将围绕消息中间件RabbitMQ展开,对于RabbitMQ基本概念这里不阐述,主要讲解RabbitMQ的基本用法.Java客户端API介绍.spring Boot与RabbitMQ整 ...

随机推荐

  1. Win10《芒果TV》更新v3.8.40青春版:优化推送策略、新增缓存清理

    芒果TV暑期重磅活动-青春芒果节拉开帷幕,炫酷的3D视觉大秀.王牌IP互动体验馆.众星云集的青春炙燥夜晚会.神秘的芒果吉祥物发布,Win10版<芒果TV>全平台同步更新青春版v3.8.40 ...

  2. 什么是BSON?

    BSON( Binary Serialized Document Format) 是一种二进制形式的存储格式,采用了类似于 C 语言结构体的名称.对表示方法,支持内嵌的文档对象和数组对象,具有轻量性. ...

  3. UWP访问KnownFolders.RemovableDevices时(读取U盘文件)抛出异常UnauthorizedAccessException

    读取U盘的文件时: StorageFile file = await folder.GetFileAsync("myfile.txt"); 抛出异常System.Unauthori ...

  4. nginx 简单应用

    从源代码编译 Nginx 把源码解压缩之后,在终端里运行如下命令: $ ./configure $ make $ sudo make install 默认情况下,Nginx 会被安装在 /usr/lo ...

  5. ECSHOP 数据库结构说明

    ECSHOP 数据库结构说明 (适用版本v2.7.3) 1.account_log 用户账目日志表 字段 类型 Null/默认 注释 log_id mediumint(8) 否 / 自增 ID 号 u ...

  6. QT 线程池 + TCP 小试(三)实现最终功能

    *免分资源链接点击打开链接http://download.csdn.net/detail/goldenhawking/4492378 有了TCP.线程池,我们就可以把他们连接起来.使用最简单的 QMa ...

  7. Linux下卸载QT SDK

    unbuntu下卸载QT方法一:you can remove it like this, those developers should add this somewhere ! like next ...

  8. 通过Graphics对象获取它所属的Control

    using System.Runtime.InteropServices;   [DllImport("user32.dll")] public static extern Int ...

  9. 用了WS_EX_LAYERED 后所有Twincontrl的wm_paint消息会停止(官方Layered Windows文档很多内容)good

    fmx 和 vcl 不一样, fmx 的阴影可以通过2D显示出来. VCL 无标题栏窗口的阴影很麻烦 280425268 我也是用两个窗口做阴影,并重绘了非客户区,不过阴影是基础自TwinContro ...

  10. 层次关系表格,不用递归,快速检索。HierarchyId

    最近这几天写了个T4自动实现EF code first和Ado的存储过程.使用过程中发现了一个Sql的类型为HierarchyId.看到时真是百思不得齐姐.算了查一下MSDN吧.从微软官网找到了Hie ...