
SpringBoot系列之郵件發(fā)送姿勢(shì)介紹
郵件發(fā)送,在實(shí)際的項(xiàng)目開發(fā)中,可能用的不是特別多,如果沒(méi)有特定的需求,相信也沒(méi)有多少小伙伴會(huì)特意的去關(guān)注,那么如果現(xiàn)在我們希望針對(duì)項(xiàng)目做一個(gè)異常的報(bào)警系統(tǒng),當(dāng)出現(xiàn)異常的時(shí)候,可以向指定的小伙伴發(fā)送郵件提醒,那么讓我們來(lái)實(shí)現(xiàn)這個(gè)功能,可以怎么辦呢?
這里介紹一下如何使用SpringBoot封裝好的MailSender來(lái)實(shí)現(xiàn)郵件發(fā)送
I. 項(xiàng)目環(huán)境
1. 項(xiàng)目依賴
本項(xiàng)目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA進(jìn)行開發(fā)
開一個(gè)web服務(wù)用于測(cè)試
<dependencies>
<!-- 郵件發(fā)送的核心依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- 適用于html模板形式的郵件發(fā)送,借助freemarker來(lái)實(shí)現(xiàn)html模板渲染 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
</dependencies>
2. 配置
在開始之前,我們需要先準(zhǔn)備一個(gè)用于發(fā)送郵件的賬號(hào),比如我這里使用163的郵箱來(lái)發(fā)送郵件,需要先到郵箱提供商哪里獲取授權(quán)碼,具體如何獲取這個(gè)東西,不同的郵箱姿勢(shì)有些不同,各位小伙伴根據(jù)自己的實(shí)際情況,搜索一下,相信很快就能get到
這里簡(jiǎn)單介紹下網(wǎng)易郵箱的獲取方式

接下來(lái)設(shè)置發(fā)送郵件相關(guān)的配置信息,配置文件application.yml
spring:
#郵箱配置
mail:
host: smtp.163.com
from: xhhuiblog@163.com
# 使用自己的發(fā)送方用戶名 + 授權(quán)碼填充
username:
password:
default-encoding: UTF-8
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
II. 郵件發(fā)送
接下來(lái)進(jìn)入正題,我們將從簡(jiǎn)單基礎(chǔ)的文本郵件發(fā)送開始,逐漸介紹如何添加附件,使用漂亮的html模板等
1. 簡(jiǎn)單文本郵件發(fā)送
我們這里直接使用JavaMailSender來(lái)發(fā)送一個(gè)基礎(chǔ)的文本郵件
@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();
//郵件發(fā)送人
simpleMailMessage.setFrom(from);
//郵件接收人,可以是多個(gè),參數(shù)為可變參數(shù)
simpleMailMessage.setTo("bangzewu@126.com");
//郵件主題,也就是標(biāo)題
simpleMailMessage.setSubject("SpringBoot測(cè)試郵件發(fā)送");
//郵件內(nèi)容
simpleMailMessage.setText("簡(jiǎn)單的郵件正文");
javaMailSender.send(simpleMailMessage);
}
}
- JavaMailSender: 直接作為一個(gè)Spring 的bean對(duì)象使用
- SimpleMailMessage:簡(jiǎn)單的郵件對(duì)象,里面有一些郵件發(fā)送時(shí),關(guān)聯(lián)的基礎(chǔ)信息
- from: 發(fā)送方
- replyTo: 郵件回復(fù)的收件人
- to: 收件人
- cc: 抄送
- bcc: 密送
- subject: 主題,也就是郵件標(biāo)題
- text: 郵件正文,文本格式
- date: 郵件發(fā)送時(shí)間
2. html發(fā)送
對(duì)于簡(jiǎn)單的文本郵件發(fā)送,用上面的基本就夠了,如果我們希望郵件的內(nèi)容更美觀一點(diǎn)的話,可以借助HTML來(lái)實(shí)現(xiàn)排版
區(qū)別于上面的SimpleMailMessage, 這里使用的是MimeMessage,來(lái)實(shí)現(xiàn)html內(nèi)容發(fā)送
使用姿勢(shì)與上面相比差不多,無(wú)非就是正文變成了html文本罷了
/**
* 發(fā)送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測(cè)試郵件發(fā)送");
//郵件內(nèi)容
mimeMessageHelper.setText("<h1>Hello World</h1> <br/> " +
"<div> 歡迎點(diǎn)擊 <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);
}
重點(diǎn)注意
- 注意上面的
setText方法的第二個(gè)參數(shù),必須有,且為true,否則會(huì)當(dāng)成文本內(nèi)容發(fā)送
3. 添加附件
郵件中添加附件,我們自己寫郵件的時(shí)候可以直接選擇附件上傳,那么代碼的實(shí)現(xiàn)方式又有什么區(qū)別呢?
/**
* 發(fā)送附件
*/
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測(cè)試郵件發(fā)送");
mimeMessageHelper.setText("<h1>Hello World</h1> <br/> " +
"<div> 歡迎點(diǎn)擊 <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);
}
注意上面的實(shí)現(xiàn),與前面差別不大,關(guān)鍵點(diǎn)在于attachment附件,上面的實(shí)現(xiàn)是在附件中添加一個(gè)圖片,為了簡(jiǎn)單起見(jiàn),圖片是直接從網(wǎng)絡(luò)下載的,然后將Stream作為傳參
4. Freemaker模板
上面的html發(fā)送,會(huì)發(fā)現(xiàn)需要我們自己來(lái)組裝html正文,這個(gè)操作可能就不是很美好了,借助頁(yè)面渲染引擎來(lái)實(shí)現(xiàn)郵件模板支持,可以說(shuō)是一個(gè)比較常見(jiàn)的方案了,這里簡(jiǎn)單介紹下Freemaker的實(shí)現(xiàn)姿勢(shì),至于themlaf, beef或者jsp啥的,都沒(méi)有太大的區(qū)別
首先寫一個(gè)郵件模板 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>
上面的模板中,定義了兩個(gè)變量,一個(gè)title,一個(gè)content,這個(gè)就是我們需要替換的值
接下來(lái)是郵件發(fā)送實(shí)例
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測(cè)試郵件發(fā)送");
Map<String, Object> map = new HashMap<>();
map.put("title", "郵件標(biāo)題");
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);
}
注意上面的實(shí)現(xiàn),關(guān)鍵點(diǎn)就利用FreeMarkerTemplateUtils來(lái)實(shí)現(xiàn)模板的渲染,輸出html正文,因此如果想使用其他的模板渲染引擎,就是改這里即可
5. 測(cè)試與小結(jié)
最后簡(jiǎn)單的調(diào)用一下上面的實(shí)現(xiàn),看下郵件是否可以發(fā)送成功


本篇博文介紹了一下如何發(fā)送郵件,并針對(duì)簡(jiǎn)單的文本郵件,html正文,附件等不同的給出了實(shí)例;整體看下來(lái)使用姿勢(shì)不難,不過(guò)郵件的幾個(gè)術(shù)語(yǔ)可以了解一下
- to: 接收人,就是郵件發(fā)送的目標(biāo)群眾
- cc: 抄送,一般來(lái)講抄送的名單,只是讓他感知到有這封郵件,屬于周知對(duì)象
- bcc: 密送,與上面兩個(gè)不一樣,接收人和抄送人不知道密送給誰(shuí)了,這就是最大的區(qū)別,說(shuō)實(shí)話這個(gè)玩意我從沒(méi)用過(guò)
接下來(lái)一篇博文,將介紹一下如何將log日志與郵件發(fā)送關(guān)聯(lián)起來(lái),當(dāng)出現(xiàn)異常的時(shí)候,郵件發(fā)送給開發(fā)者
III. 不能錯(cuò)過(guò)的源碼和相關(guān)知識(shí)點(diǎn)
0. 項(xiàng)目
- 工程:https://github.com/liuyueyi/spring-boot-demo
- 源碼:https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/
1. 一灰灰Blog
盡信書則不如,以上內(nèi)容,純屬一家之言,因個(gè)人能力有限,難免有疏漏和錯(cuò)誤之處,如發(fā)現(xiàn)bug或者有更好的建議,歡迎批評(píng)指正,不吝感激
下面一灰灰的個(gè)人博客,記錄所有學(xué)習(xí)和工作中的博文,歡迎大家前去逛逛
- 一灰灰Blog個(gè)人博客 https://blog.hhui.top
- 一灰灰Blog-Spring專題博客 http://spring.hhui.top