SpringBoot系列(十四)集成邮件发送服务及邮件发送的几种方式
往期推荐
SpringBoot系列(一)idea新建Springboot项目
Springboot系列(七) 集成接口文档swagger,使用,测试
SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式
SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回
SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?
SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!
目录:
一、SMTP协议简介
SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持,SMTP的重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。使用SMTP,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实现某处理进程与其他网络之间的邮件传输。
简单来说:我们使用的这些邮件发送功能,他们之间都有一个专门的电子邮件的服务器,类似于邮局,你将邮件发给邮局,邮局又会根据你的邮寄地址发送给相应的邮局,然后接收方去邮局取邮件。而邮件服务器呢,就是互联网之间的一个邮局,不同的网络之间也能实现电子邮件的发送。
Spring框架在java邮件服务的基础上进行了封装,SpringBoot在Spring的基础上对邮件服务进一步的封装,让SpringBoot发送邮件更为便利,灵活。
二、开启SMTP服务并获取授权码
这里我们以QQ邮箱为例,要想在SpringBoot发送QQ邮件必须先打开QQ邮箱的SMTP功能,默认是关闭的,具体操作如下。进入邮箱→设置→账户,然后找到下面这个:

将第一个开启,这里我已经开启了,就不用再开启了,至于那个POP3协议,这是一种从邮件服务器上读取邮件的协议,通过POP3协议,收信人不需要参与到与邮件服务器之间的邮件读取过程,简化了用户操作. 收信人可以“离线”地进行邮件处理,很方便地接收,阅读邮件。
然后我们开启之后还需要获取一个授权码,这个授权码我们后面编写邮件配置需要用到。获取授权码可能需要验证身份什么的。将授权码保存下来。

三、依赖导入与配置说明
依赖导入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
为了方便测试我们也需要将starter-web的依赖导入进来。
配置文件:
spring:
mail:
host: smtp.qq.com
username: qzstudynote@qq.com
password: zxcvbnmkj
properties:
mail:
smtp:
socketFactory:
class: javax.net.ssl.SSLSocketFactory
## ssl:
## enable :true
default-encoding: utf-8
配置说明:
- host就是你的邮件服务器地址,
- username就是你的邮箱账号,带上后缀
- password就是你刚刚复制的授权码,我这里是乱写的;
- default-encoding 设置邮件的编码为utf-8;
- properties:额外的配置,这里我写了两个,只用其中一个就行了,开启ssl加密,保证安全连接。
四、邮件发送
1.简单邮件发送
编写controller,或者是直接在测试模块添加测试就行
@RestController
public class MailController {
@Autowired
JavaMailSenderImpl javaMailSender;
@RequestMapping("/mail")
public String sendMail(){
SimpleMailMessage message = new SimpleMailMessage();
//邮件设置
message.setSubject("邮件主题");
message.setText("邮件内容");
message.setTo("xxxxxxx@139.com","111111111@qq.com");
message.setFrom("qzstudynote@qq.com");
javaMailSender.send(message);
return "简单邮件发送成功!"
}
}
代码说明:JavaMailSenderImpl就是一个SpringBoot中用来发送邮件的一个实现类,我们需要将它注入到bean中,以供使用。它里面有一些方法,这里只展示了简单的几个,其他的也很简单,比如说发送日期,抄送人等等。接受者可以设置多个,如上。
2. 带附件内容和正文带图片的邮件发送##
@RequestMapping("/mineMail")
public String sendMineMail() throws MessagingException {
//1、创建一个复杂的邮件
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//邮件主题
helper.setSubject("这是一个邮件啊");
//文本中添加图片
helper.addInline("image1",new FileSystemResource("D:\\images\\spring\\1.jpg"));
//邮件内容
helper.setText("全栈学习笔记<a href='https://www.cnblogs.com/swzx-1213/'>百度一下</a> <img src='cid:image1'></img>",true);
helper.setTo("xxxxx@139.com");
helper.setFrom("qzstudynote@qq.com");
//附件添加图片
helper.addAttachment("1.jpg",new File("D:\\images\\spring\\1.jpg"));
//附件添加word文档
helper.addAttachment("哈哈哈.docx",new File("D:\\images\\spring\\哈哈哈.docx"));
javaMailSender.send(mimeMessage);
return "复杂邮件发送!";
}
代码说明:
- 创建一个MimeMessage 邮件,但是我们也需要创建一个工具类MimeMessageHelper,相当于代理类吧,邮件的属性配置就由这个工具类来实现。
- addInline(),第一个参数是一个contentId,String类型的,相当于是一个key,第二个参数是一个Resource对象,资源对象,这里我们传了一个本地的图片就用的FileSystemResource对象。当然这里是说的我们用的这个addInline方法的参数是这样,还有其他的参数类型,所谓重载。
- setText(),这里用到的第一个参数就是文本字符串,第二个就是是否解析文本中的html语法。
- addAttachment() 这个方法是用来添加附件的,附件和我们之前添加的图片不一样,附件作为一种未下载的文件,而资源文件则是直接显示到正文中。利用我自己的邮箱进行测试的截图:

3. thymeleaf模板作为邮件发送
项目中需要引入thymeleaf依赖,并且要在新建的html文件中加入:xmlns:th="http://www.thymeleaf.org" ,不会thymeleaf的请移步之前的文章。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
这里在templates下面创建了一个email的html5文件。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<p th:text="${name}"></p>
<a th:text="这是一个链接" th:href="${link}"></a>
<img th:src="${image1}">
</body>
</html>
controller中再添加一个方法。
@RequestMapping("/thyMail")
public String sendThymeleafMail() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
messageHelper.setSubject("这是一个thymeleaf模板邮件");
messageHelper.setTo("xxxxxxxx@139.com");
messageHelper.setFrom("qzstudynote@qq.com");
Context context = new Context();
context.setVariable("name","这是一个新建的thymeleaf模板");
context.setVariable("link","https://www.cnblogs.com/swzx-1213/");
context.setVariable("image1","https://s1.ax1x.com/2020/04/14/JShDYt.th.jpg");
String value = templateEngine.process("email.html",context);
messageHelper.setText(value,true);
javaMailSender.send(mimeMessage);
return "模板邮件发送成功";
}
代码说明:
- Context 属于org.thymeleaf.context这个包。
- context.setVariable(),第一个参数是String,第二个是Object类型。第一个参数就对应thymeleaf模板上面相同名字的参数。
- templateEngine.process()将指定路径的html文件转换成String类型返回。
测试:

五、总结
本文讲了基础的邮件发送原理,SMTP协议以及提到的POP3协议的概要内容。然后一起引入依赖,添加项目属性配置,最后讲解了三大类发送邮件的方式。源码获取看下面!

SpringBoot系列(十四)集成邮件发送服务及邮件发送的几种方式的更多相关文章
- springboot系列十四、自定义实现starter
一.starter的作用 当我们实现了一个组建,希望尽可能降低它的介入成本,一般的组建写好了,只要添加spring扫描路径加载spring就能发挥作用.有个更简单的方式扫描路径都不用加,直接引入jar ...
- SpringBoot系列(十二)过滤器配置详解
SpringBoot(十二)过滤器详解 往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件 ...
- struts2官方 中文教程 系列十四:主题Theme
介绍 当您使用一个Struts 2标签时,例如 <s:select ..../> 在您的web页面中,Struts 2框架会生成HTML,它会显示外观并控制select控件的布局.样式和 ...
- Springboot系列(四)web静态资源配置详解
Springboot系列(四)web静态资源配置 往期精彩 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 SpringBoot系列(三)配 ...
- 不停止MySQL服务增加从库的两种方式
不停止MySQL服务增加从库的两种方式 转载自:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产环境MySQL数据库是一主一从,由于业务量访 ...
- 不停止MySQL服务增加从库的两种方式【转载】
现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...
- JAVA发送http GET/POST请求的两种方式+JAVA http 请求手动配置代理
java发送http get请求,有两种方式. 第一种用URLConnection: public static String get(String url) throws IOException { ...
- springboot系列十二、springboot集成RestTemplate及常见用法
一.背景介绍 在微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Apache的Http Client.N ...
- SpringBoot第二十四篇:应用监控之Admin
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11457867.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 前一章(S ...
随机推荐
- (一) Mybatis源码分析-解析器模块
Mybatis源码分析-解析器模块 原创-转载请说明出处 1. 解析器模块的作用 对XPath进行封装,为mybatis-config.xml配置文件以及映射文件提供支持 为处理动态 SQL 语句中的 ...
- JSON Extractor(JSON提取器)
JSON提取器 Variable names(名称):提取器的名称Apply to(应用范围):Main sample and sub-samples:应用于主sample及子sampleMain s ...
- Problem C Careful Ascent
数学问题. 在不经过shield时,竖直速度是1.所以时间就是y/1=y,,,,在经过shield时,时间为shield的数值长度*影响因素,然后总时间把他们加起来,最后再用水平方向的长度除以总时间, ...
- 前端学习笔记-H5
H5常用标签及其属性: <a>标签做超链接: <p>段落标签,自带段间距和换行样式: <div>块标签,表示一块内容,没有具体语意,区别与p标签,块与块间没有间距: ...
- [De1CTF 2019]SSRF Me
原帖地址 : https://xz.aliyun.com/t/5927 De1CTF 2019 的一个题目总结 题目描述 直接查看页面源代码可以看到正确格式的代码 #! /usr/bin/env py ...
- HTML+CSS教程(五)外联样式、组选择器、圆角边框、样式优先级、伪类、盒子模型、元素溢出
一.外联样式 通过link标签引入外部css文件夹中的xxx.css文件到head标签中 例: 二. 1.组选择器 选择器名称1,选择器名称2,选择器名称3,…{属性:属性值;属性;属性值} 例: & ...
- Java 多线程 -- 协作模型:生产消费者实现方式二:信号灯法
使用信号灯法实现生产消费者模式需要借助标志位. 下面以演员表演,观众观看电视为列,写一个demo 同一资源 电视: //同一资源 电视 class Tv { String voice; // 信号灯 ...
- MySQL server has gone away(在执行sql的时候,莫名的报错)
原文:https://cenalulu.github.io/mysql/mysql-has-gone-away/ MySQL Server has gone away报错原因汇总分析 原因1. MyS ...
- 5. 配置项:rule_files
prometheus配置文件内容: global: # 默认情况下抓取目标的频率. [ scrape_interval: <duration> | default = 1m ] # 抓取超 ...
- ansible的剧本play(四)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA68AAAETCAYAAADZDzDOAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw