SpringBoot实现邮件发送功能的姿势分享
作者:一灰灰 发布时间:2022-05-27 02:08:09
目录
前言
I. 项目环境
1. 项目依赖
2. 配置
II. 邮件发送
1. 简单文本邮件发送
2. html发送
3. 添加附件
4. Freemaker模板
5. 测试与小结
III. 不能错过的源码和相关知识点
0. 项目
总结
前言
邮件发送,在实际的项目开发中,可能用的不是特别多,如果没有特定的需求,相信也没有多少小伙伴会特意的去关注,那么如果现在我们希望针对项目做一个异常的报警系统,当出现异常的时候,可以向指定的小伙伴发送邮件提醒,那么让我们来实现这个功能,可以怎么办呢?
这里介绍一下如何使用SpringBoot封装好的MailSender来实现邮件发送
I. 项目环境
1. 项目依赖
本项目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA进行开发
开一个web服务用于测试
<dependencies>
<!-- 邮件发送的核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- 适用于html模板形式的邮件发送,借助freemarker来实现html模板渲染 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
</dependencies>
2. 配置
在开始之前,我们需要先准备一个用于发送邮件的账号,比如我这里使用163的邮箱来发送邮件,需要先到邮箱提供商哪里获取授权码,具体如何获取这个东西,不同的邮箱姿势有些不同,各位小伙伴根据自己的实际情况,搜索一下,相信很快就能get到
这里简单介绍下网易邮箱的获取方式
接下来设置发送邮件相关的配置信息,配置文件application.yml
spring:
#邮箱配置
mail:
host: smtp.163.com
from: xhhuiblog@163.com
# 使用自己的发送方用户名 + 授权码填充
username:
password:
default-encoding: UTF-8
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
II. 邮件发送
接下来进入正题,我们将从简单基础的文本邮件发送开始,逐渐介绍如何添加附件,使用漂亮的html模板等
1. 简单文本邮件发送
我们这里直接使用JavaMailSender来发送一个基础的文本邮件
@Service
public class MailDemo {
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.from:xhhuiblog@163.com}")
private String from;
private void basicSend() {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//邮件发送人
simpleMailMessage.setFrom(from);
//邮件接收人,可以是多个,参数为可变参数
simpleMailMessage.setTo("bangzewu@126.com");
//邮件主题,也就是标题
simpleMailMessage.setSubject("SpringBoot测试邮件发送");
//邮件内容
simpleMailMessage.setText("简单的邮件正文");
javaMailSender.send(simpleMailMessage);
}
}
JavaMailSender: 直接作为一个Spring 的bean对象使用
SimpleMailMessage:简单的邮件对象,里面有一些邮件发送时,关联的基础信息
from: 发送方
replyTo: 邮件回复的收件人
to: 收件人
cc: 抄送
bcc: 密送
subject: 主题,也就是邮件标题
text: 邮件正文,文本格式
date: 邮件发送时间
2. html发送
对于简单的文本邮件发送,用上面的基本就够了,如果我们希望邮件的内容更美观一点的话,可以借助HTML来实现排版
区别于上面的SimpleMailMessage, 这里使用的是MimeMessage,来实现html内容发送
使用姿势与上面相比差不多,无非就是正文变成了html文本罢了
/**
* 发送html
*/
public void sendHtml() throws MessagingException {
MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setTo("bangzewu@126.com");
mimeMessageHelper.setSubject("SpringBoot测试邮件发送");
//邮件内容
mimeMessageHelper.setText("<h1>Hello World</h1> <br/> " +
"<div> 欢迎点击 <a href=\"https://blog.hhui.top\">一灰灰博文地址</a><br/>" +
" <img width=\"200px\" height=\"200px\" src=\"https://blog.hhui.top/hexblog/imgs/info/wx.jpg\"/>" +
"</div>", true);
javaMailSender.send(mimeMailMessage);
}
重点注意
注意上面的setText方法的第二个参数,必须有,且为true,否则会当成文本内容发送
3. 添加附件
邮件中添加附件,我们自己写邮件的时候可以直接选择附件上传,那么代码的实现方式又有什么区别呢?
/**
* 发送附件
*/
public void sendWithFile() throws MessagingException, IOException {
MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setTo("bangzewu@126.com");
mimeMessageHelper.setSubject("SpringBoot测试邮件发送");
mimeMessageHelper.setText("<h1>Hello World</h1> <br/> " +
"<div> 欢迎点击 <a href=\"https://blog.hhui.top\">一灰灰博文地址</a><br/>" +
" <img width=\"200px\" height=\"200px\" src=\"https://blog.hhui.top/hexblog/imgs/info/wx.jpg\"/>" +
"</div>");
String url = "https://blog.hhui.top/hexblog/imgs/info/wx.jpg";
URL imgUrl = new URL(url);
mimeMessageHelper.addAttachment("img.jpg", imgUrl::openStream);
javaMailSender.send(mimeMailMessage);
}
注意上面的实现,与前面差别不大,关键点在于attachment附件,上面的实现是在附件中添加一个图片,为了简单起见,图片是直接从网络下载的,然后将Stream作为传参
4. Freemaker模板
上面的html发送,会发现需要我们自己来组装html正文,这个操作可能就不是很美好了,借助页面渲染引擎来实现邮件模板支持,可以说是一个比较常见的方案了,这里简单介绍下Freemaker的实现姿势,至于themlaf, beef或者jsp啥的,都没有太大的区别
首先写一个邮件模板 resources/template/mail.ftl
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="SpringBoot thymeleaf"/>
<meta name="author" content="YiHui"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>邮件模板</title>
</head>
<style>
.title {
color: #c00;
font-weight: normal;
font-size: 2em;
}
.content {
color: darkblue;
font-size: 1.2em;
}
.sign {
color: lightgray;
font-size: 0.8em;
font-style: italic;
}
</style>
<body>
<div>
<div class="title">${title}</div>
<div class="content">${content}</div>
</div>
</body>
</html>
上面的模板中,定义了两个变量,一个title,一个content,这个就是我们需要替换的值
接下来是邮件发送实例
import freemarker.template.Configuration;
@Autowired
private Configuration configuration;
/**
* freemarker 模板
*/
public void freeMakerTemplate() throws MessagingException, IOException, TemplateException {
MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setTo("bangzewu@126.com");
mimeMessageHelper.setSubject("SpringBoot测试邮件发送");
Map<String, Object> map = new HashMap<>();
map.put("title", "邮件标题");
map.put("content", "邮件正文");
String text = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate("mail.ftl"), map);
mimeMessageHelper.setText(text, true);
String url = "https://blog.hhui.top/hexblog/imgs/info/wx.jpg";
URL imgUrl = new URL(url);
mimeMessageHelper.addAttachment("img.jpg", imgUrl::openStream);
javaMailSender.send(mimeMailMessage);
}
注意上面的实现,关键点就利用FreeMarkerTemplateUtils来实现模板的渲染,输出html正文,因此如果想使用其他的模板渲染引擎,就是改这里即可
5. 测试与小结
最后简单的调用一下上面的实现,看下邮件是否可以发送成功
本篇博文介绍了一下如何发送邮件,并针对简单的文本邮件,html正文,附件等不同的给出了实例;整体看下来使用姿势不难,不过邮件的几个术语可以了解一下
to: 接收人,就是邮件发送的目标群众
cc: 抄送,一般来讲抄送的名单,只是让他感知到有这封邮件,属于周知对象
bcc: 密送,与上面两个不一样,接收人和抄送人不知道密送给谁了,这就是最大的区别,说实话这个玩意我从没用过
接下来一篇博文,将介绍一下如何将log日志与邮件发送关联起来,当出现异常的时候,邮件发送给开发者
III. 不能错过的源码和相关知识点
0. 项目
工程:github.com/liuyueyi/sp…
源码:github.com/liuyueyi/sp…
来源:https://juejin.cn/post/6992371786184818719
猜你喜欢
- 二分查找又称折半查找,它是一种效率较高的查找方法。折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以
- 前言坚持是一件比较难的事,坚持并不是自欺欺人的一种自我麻痹和安慰,也不是做给被人的,我觉得,坚持的本质并没有带着过多的功利主义,如果满是功利
- java中初始化MediaRecorder实现代码:private boolean initializeVideo() { &
- 具体可见http://developer.android.com/tools/debugging/ddms.html。 DDMS为IDE和e
- 一、二叉搜索树插入元素/** * user:ypc; * date:2021-05-18; * time: 15:09; */
- 前言在阅读本文之前, 希望你可以思考一下下面几个问题, 带着问题去阅读文章会获得更好的效果。发送消息的时候, 当Broker挂掉了,消息体还
- 前言JavaEE(Java Enterprise Edition),Java企业版,是一个用于企业级web开发平台。最早由Sun公司定制并发
- 新建一个集合List<Bill> billList = new ArrayList<>();将订单中所有物品的名称提
- 前言自 Java 7 以来,java 中的 switch 语句经历了快速发展。因此,在本文中,我们将通过示例讨论 switch 语句从 ja
- @Value("${xxx}")取properties时中文乱码(1)检查spring的配置文件中,properties
- 质数又称素数。一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除的数;否则称为合数。根据算术基本定理,每一个比1大的整数,要么本
- 核心考点:链表操作,临界条件检查,特殊情况处理在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针
- 前言有人说Gradle使用groovy语言编写,简单,明了没像maven使用xml臃肿,其实我倒不觉得,我觉得maven挺好的,管理jar依
- 前言 短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天
- 1. 数据构造索引2个文档到 hotel 索引中:PUT /hotel/_doc/1{ "title": &
- java引用传递的三种类型我这里使用了mldn视频里的例子,只用于学习交流。第一种结果:调用前:50调用后:1000分析:理解:好理解第二种
- 注解是 JDK 5.0 引入的一种注释机制。注解可以作用在类型(类、接口、枚举等)、属性、方法、参数等不同位置,具体的 JDK
- 描述项目中用到boot 整合 mybatis-plus , 个人在使用分页条件查询的时候一直查不出 total, pages, 终于找到原因
- 实现比较两个List之间的差异,包括获取两List的差集,交集,并集(不去重&去重)的API解法和优化解法的解决方案。求差集/**
- OutputDebugString属于windows API的,所以只要是包含了window.h这个头文件后就可以使用了。可以把调