前景介绍

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

大致思路

我们要做的其实就是把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. Android adb你真的会用吗?

    前言 本文基于Android官方文档, 以及个人工作的使用经验, 总结下adb的常用用法, 备忘. 1.adb 简介 adb全名Andorid Debug Bridge. 顾名思义, 这是一个Debu ...

  2. DDD中的值对象如何用NHibernate进行映射

    原文:DDD中的值对象如何用NHibernate进行映射 <component/>是NHibernate中一个有趣的特性,即是用来映射DDD(Data-Display-Debuger)概念 ...

  3. Android零基础入门第79节:Intent 属性详解(上)

    Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,则取决于Intent的各属性.本期将详细介绍Intent的各属性值,以及 Android如何根据不同属性值来启动相应的组件. ...

  4. linux log rotate

    今天老大提醒我产线kafka自身的log文件积累了好几个月了,我才发现原来kafka的log4j并删除old log. 第一反应是采用linux自带的logrotate功能,在/etc/logrota ...

  5. 一个拼图工具TImageBox的制作思路

    http://www.cnblogs.com/del/archive/2010/04/24/1719631.html

  6. redis INFO 解释

    以一种易于解释(parse)且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值. 通过给定可选的参数 section ,可以让命令只返回某一部分的信息: server 部分记录了 Re ...

  7. Kong:Nginx支持的API Gateway管理解决方案

    Kong的主要功能 Kong可灵活扩展:只要增添更多的服务器实例,它就能横向扩展,毫无问题,那样你可以支持更多流量,同时确保网络延迟很短. Kong可在任何地方运行:它可以部署在单个或多个数据中心环境 ...

  8. 高并发 Nginx+Lua OpenResty系列(2)——Nginx Lua API

    Nginx Lua API 和一般的Web Server类似,我们需要接收请求.处理并输出响应.而对于请求我们需要获取如请求参数.请求头.Body体等信息:而对于处理就是调用相应的Lua代码即可:输出 ...

  9. LVS的工作原理认识

    一.LVS 简介及工作模式 1. LVS:Linux Virtaul Server,该软件的功能是实现LB(load balance) 2. 三种工作模式的使用范围 1)NAT模式(NAT) LVS ...

  10. Hive —— 安装部署

    一.安装Hive 1.1 下载并解压 下载所需版本的Hive,这里我下载版本为cdh5.15.2.下载地址:http://archive.cloudera.com/cdh5/cdh/5/ # 下载后进 ...