国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Spring Boot利用Thymeleaf發(fā)送Email的方法教程

Spring Boot利用Thymeleaf發(fā)送Email的方法教程

2020-12-22 15:28橘子拌飯有營(yíng)養(yǎng)哦 Java教程

spring Boot默認(rèn)就是使用thymeleaf模板引擎的,下面這篇文章主要給大家介紹了關(guān)于在Spring Boot中利用Thymeleaf發(fā)送Email的方法教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。

前言

眾所周知,現(xiàn)在在后臺(tái)服務(wù)器中發(fā)送郵件已經(jīng)是一個(gè)非常常用的功能了。通常來(lái)說(shuō)雖然html并非是一個(gè)非常標(biāo)準(zhǔn)的信息格式,但是至少許多郵件客戶端都至少支持一部分標(biāo)記語(yǔ)言。 在這邊教程中主要是關(guān)于教你如何在spring boot 應(yīng)用中發(fā)送郵件以及使用非常簡(jiǎn)單強(qiáng)大的thymeleaf模板引擎來(lái)制作郵件內(nèi)容。

文章末尾附上源碼,已經(jīng)開(kāi)源到github上,是我公司做項(xiàng)目的時(shí)候處理郵件這一塊用到的。 基本上覆蓋了大部分郵件發(fā)送需求。稍微修改了一下,奉獻(xiàn)給有需要的人。當(dāng)你看完文章在看一下這封源碼,你會(huì)對(duì)這一塊更加的了解。而且你能掌握常用的郵件發(fā)送:

  • 純文本郵件
  • 內(nèi)聯(lián)圖片郵件
  • 帶附件的郵件

純文本郵件

添加依賴(mail starter dependencies)

首先制作并且通過(guò)smtp郵件服務(wù)器來(lái)發(fā)送一個(gè)純文本郵件。

如果你之前有用過(guò)spring boot的話,那你寧該并不好奇在你建立一個(gè)新工程的時(shí)候,spring boot已經(jīng)幫你繼承了常用的依賴庫(kù)。 通常你只需要在你的 pom.xml 中添加如下依賴即可:

?
1
2
3
4
<dependency>
 <groupid>org.springframework.boot</groupid>
 <artifactid>spring-boot-starter-mail</artifactid>
</dependency>

郵件服務(wù)器屬性配置(properties configuration)

通常情況下,如果所需要的依賴在 class path 中都是可用的話,這時(shí)候spring會(huì)自動(dòng)幫你注冊(cè)一個(gè)默認(rèn)實(shí)現(xiàn)的郵件發(fā)送服務(wù) (default mail sender service)。 spring.mail.host 屬性已經(jīng)被自動(dòng)定義了, 所有我們所需要做的事情就是把這個(gè)屬性添加到我們應(yīng)用的 application.properties 配置文件中。

application.properties 在resource文件夾下

spring boot 提供的默認(rèn)郵件發(fā)送服務(wù) 其實(shí)已經(jīng)非常強(qiáng)大了,我們可以通過(guò)簡(jiǎn)單的配置它的屬性就可以了。所謂的屬性其實(shí)說(shuō)白了就是配置它的郵件smtp 服務(wù)器:

?
1
2
3
4
5
spring.mail.port=25 # smtp server port
spring.mail.username= # login used for authentication
spring.mail.password= # password for the given login
spring.mail.protocol=smtp
spring.mail.defaultencoding=utf-8 # default message encoding

這里附帶一份 gmail 的smtp服務(wù)器配置清單:

?
1
2
3
4
5
6
7
spring.mail.host = smtp.gmail.com
spring.mail.username = *****@gmail.com
spring.mail.password = ****
spring.mail.properties.mail.smtp.auth = true
spring.mail.properties.mail.smtp.socketfactory.port = 587
spring.mail.properties.mail.smtp.socketfactory.class = javax.net.ssl.sslsocketfactory
spring.mail.properties.mail.smtp.socketfactory.fallback = false

郵件發(fā)送服務(wù)(mail sending service)

在這里我們使用 autowired 在注入我們的service, 它主要就是生成郵件的相關(guān)信息

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@service
public class mailclient {
 
 private javamailsender mailsender;
 
 @autowired
 public mailservice(javamailsender mailsender) {
 this.mailsender = mailsender;
 }
 
 public void prepareandsend(string recipient, string message) {
 //todo implement
 }
 
}

生成郵件內(nèi)容

下面是一個(gè)簡(jiǎn)單的生成郵件內(nèi)容的代碼。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void prepareandsend(string recipient, string message) {
 mimemessagepreparator messagepreparator = mimemessage -> {
 mimemessagehelper messagehelper = new mimemessagehelper(mimemessage);
 messagehelper.setfrom("sample@dolszewski.com");
 messagehelper.setto(recipient);
 messagehelper.setsubject("sample mail subject");
 messagehelper.settext(message);
 };
 try {
 mailsender.send(messagepreparator);
 } catch (mailexception e) {
 // runtime exception; compiler will not force you to handle it
 }
}

send() 需要被重寫以接受不同類型的參數(shù)變量:

  • simplemailmessage: 正如名字所示,這是一個(gè)最基本的郵件message的模塊,我們可以給它設(shè)置常用的屬性,它并不能夠修改信息的頭,只能發(fā)送純文本的文件。
  • mimemessage: 通過(guò)這個(gè)類我們可以構(gòu)建出比較復(fù)雜的郵件內(nèi)容
  • mimemessagepreparator: 這是一個(gè)接口類,主要目的是提供一個(gè)構(gòu)建模板方法用來(lái)構(gòu)建 mimemessage 以及當(dāng)你生成一個(gè)實(shí)例的時(shí)候幫你處理異常信息。官方文檔(也是常識(shí):))建議將mimemessagepreparator作為郵件構(gòu)建的首選類型。

mimemessagehelper類是mimemessage的裝飾類,它提供了更多的開(kāi)發(fā)人員友好界面,并為類的許多屬性添加了輸入驗(yàn)證。你可以不用,但是別人肯定會(huì)用,而且你會(huì)后悔不用 xd。

send() 會(huì)拋出 **mailexception ** 異常,這是個(gè)運(yùn)行時(shí)異常,也就是通常所說(shuō)的 runtimeexception。 在消息傳遞失敗的情況下,很可能會(huì)重復(fù)發(fā)送操作,或者至少使用一些更復(fù)雜的解決方案處理這種情況,例如:使用相應(yīng)的堆棧跟蹤記錄錯(cuò)誤消息。

手動(dòng)測(cè)試

通常如果你想郵件功能,你首先需要擁有一個(gè)smtp服務(wù)器在你本機(jī)的電腦上處理你的請(qǐng)求。 如果你還沒(méi)用過(guò),下面給你們推薦一些常用的:

  • fakesmtp – a simple server written in java. supported by any operating system with java 1.6 or newer installed.
  • – a server with a plain and user friendly interface. for windows only.
  • papercut – another simple server designed for windows.

集成測(cè)試

你可能或許會(huì)感到好奇應(yīng)該如果寫一個(gè)自動(dòng)化的test來(lái)驗(yàn)證你客戶端的功能。 如果你手動(dòng)測(cè)試的話,你需要開(kāi)啟smtp 服務(wù)器然后在運(yùn)行你的spring boot客戶端。 在這里給大家推薦一個(gè)神器 greenmail, 因?yàn)樗鷍unit單元測(cè)試高度集成,可以簡(jiǎn)化我們的測(cè)試。

添加依賴

greenmail 已經(jīng)在maven倉(cāng)庫(kù)中了,所以我們唯一所需要做的就是將其依賴加入我們的 pom.xml 配置文件中:

?
1
2
3
4
5
6
<dependency>
 <groupid>com.icegreen</groupid>
 <artifactid>greenmail</artifactid>
 <version>1.5.0</version>
 <scope>test</scope>
</dependency>

smtp服務(wù)器與test模板

現(xiàn)在呢,說(shuō)了這么多廢話,我們終于可以創(chuàng)建我們的第一個(gè)集成測(cè)試類了。 它會(huì)啟動(dòng)spring應(yīng)用程序并同時(shí)運(yùn)行郵件客戶端。但是在我們編寫實(shí)際測(cè)試之前呢,我們首先必須要確保smtp服務(wù)器正確運(yùn)行,同時(shí)在測(cè)試結(jié)束的時(shí)候能夠正確關(guān)閉。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@runwith(springjunit4classrunner.class)
@springapplicationconfiguration(application.class)
public class mailclienttest {
 
 private greenmail smtpserver;
 
 @before
 public void setup() throws exception {
 smtpserver = new greenmail(new serversetup(25, null, "smtp"));
 smtpserver.start();
 }
 
 @after
 public void teardown() throws exception {
 smtpserver.stop();
 }
 
}

創(chuàng)建郵件客戶端

首先,我們需要注入我們的郵件service在測(cè)試類中。之后,我們才能通過(guò)grennmail來(lái)驗(yàn)證是否能夠接受到郵件。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@autowired
private mailclient mailclient;
 
@test
public void shouldsendmail() throws exception {
 //given
 string recipient = "name@hotmail.com";
 string message = "test message content";
 //when
 mailclient.prepareandsend(recipient, message);
 //then
 assertreceivedmessagecontains(message);
}
 
private void assertreceivedmessagecontains(string expected) throws ioexception, messagingexception {
 mimemessage[] receivedmessages = smtpserver.getreceivedmessages();
 assertequals(1, receivedmessages.length);
 string content = (string) receivedmessages[0].getcontent();
 asserttrue(content.contains(expected));
}

發(fā)送html郵件

在這里我們主要說(shuō)一下如何構(gòu)建html類型的郵件。

thymeleaf 模板引擎

首先在你的 pom.xml 中添加依賴。spring引導(dǎo)將使用其默認(rèn)設(shè)置自動(dòng)準(zhǔn)備引擎

?
1
2
3
4
<dependency>
 <groupid>org.springframework.boot</groupid>
 <artifactid>spring-boot-starter-thymeleaf</artifactid>
</dependency>

thymeleaf的默認(rèn)配置期望所有html文件都放在 **resources/templates ** 目錄下,以.html擴(kuò)展名結(jié)尾。 讓我們創(chuàng)建一個(gè)名為mailtemplate.html的簡(jiǎn)單文件,我們將使用創(chuàng)建的郵件客戶端類發(fā)送:

Spring Boot利用Thymeleaf發(fā)送Email的方法教程

除了在生成過(guò)程中作為參數(shù)傳遞的消息的占位符,該模板幾乎不包含任何內(nèi)容。這不是廢話么-,-

模板處理

創(chuàng)建一個(gè)服務(wù)類,它主要負(fù)責(zé)將寫入的模板和外部模型組合在一起,這在我們的例子中是一個(gè)簡(jiǎn)單的短信。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@service
public class mailcontentbuilder {
 
 private templateengine templateengine;
 
 @autowired
 public mailcontentbuilder(templateengine templateengine) {
 this.templateengine = templateengine;
 }
 
 public string build(string message) {
 context context = new context();
 context.setvariable("message", message);
 return templateengine.process("mailtemplate", context);
 }
 
}

注意:這里的 context。 這里主要使用的 鍵值對(duì) 的形式,類似map,將模板里面的需要的變量與值對(duì)應(yīng)起來(lái)。 比如: <span th:text="${message}"></span> , 這里我們通過(guò)context就將message的內(nèi)容賦值給了span。

templateengine類的實(shí)例由spring boot thymeleaf自動(dòng)配置提供。我們所需要做的就是調(diào)用process()方法,該方法接受兩個(gè)參數(shù),也就是我們使用的模板的名稱以及充當(dāng)模型的容器的上下文對(duì)象對(duì)象。

將新創(chuàng)建的 mailcontentbuilder 注入到mailservice類中。我們需要在prepareandsen() 方法中進(jìn)行一個(gè)小的調(diào)整,以利用構(gòu)建器將生成內(nèi)容設(shè)置為mime消息。我們還使用 settext() 方法的重載變量將 content-type 頭設(shè)置為text / html,而不是默認(rèn)的 text / plain。

測(cè)試

需要更新的最后一件事是我們的測(cè)試,更確切地說(shuō),是接收到的消息的預(yù)期內(nèi)容。只需對(duì)驗(yàn)證邏輯進(jìn)行一個(gè)小的更改,運(yùn)行測(cè)試并檢查結(jié)果。

?
1
2
3
4
5
6
7
8
9
10
11
@test
public void shouldsendmail() throws exception {
 //given
 string recipient = "name@dolszewski.com";
 string message = "test message content";
 //when
 mailservice.prepareandsend(recipient, message);
 //then
 string content = "<span>" + message + "</span>";
 assertreceivedmessagecontains(content);
}

本文到此基本宣告結(jié)束。

再次獻(xiàn)上一份我常用的html email模板:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<!doctype html>
<html lang="en"
 xmlns="http://www.w3.org/1999/xhtml"
 xmlns:th="http://www.thymeleaf.org">
<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
 <title>siemens sinnovation</title>
 <style>
 .button {
  background-color: #4caf50;
  border-radius: 12px;
  border: none;
  color: white;
  padding: 10px 25px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 18px;
  margin: 4px 2px;
  cursor: pointer;
  box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
 }
 
 .button:hover {
  box-shadow: 0 12px 16px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19);
 }
 </style>
</head>
<body style="margin: 0;padding: 0;">
 
 
<table align="center" border="1" cellpadding="0" cellspacing="0" width="600px">
 <tr>
 <td>
  <table align="center" border="0" cellpadding="0" cellspacing="0" width="600"
   style="border-collapse: collapse;">
  <tr>
   <td align="center" style="padding: 40px 0 30px 0;">
   <!--![](image/logo.png)-->
   ![](|cid:${imageresourcename}|)
 
   </td>
  </tr>
 
  <tr>
   <td bgcolor="#ffffff" style="padding: 20px 30px 20px 30px">
   <h4>the following message was created by <span th:text="${owner.getname()}"></span> in the
    siemens dffa group: </h4>
 
 
   <table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tr>
    <td><span th:text="${title}">title</span></td>
    </tr>
    <tr>
    <td style="padding: 20px 0 30px 0">
     <span th:text="${description}">description</span>
 
    </td>
 
    </tr>
 
    <tr>
    <table border="0" cellpadding="0" cellspacing="0" width="100%">
     <tr>
     <!--<td align="center" style="padding: 5px 0 3px 0">status:<span-->
      <!--th:text="${status}">status</span></td>-->
     <!--<td align="center" style="padding: 5px 0 3px 0">date submitted: <span-->
      <!--th:text="${createdate}">createdate</span></td>-->
     <!--<td align="center" style="padding: 5px 0 3px 0">days left to join:<span-->
      <!--th:text="${lefttime}">lefttime</span></td>-->
 
     <td align="center" style="padding: 5px 0 3px 0">status:<span
      th:text="${status}"> open for joining</span></td>
     <td align="center" style="padding: 5px 0 3px 0">date submitted: 28/08/2017 <span
      th:text="${createdate}">createdate</span></td>
     <td align="center" style="padding: 5px 0 3px 0">days left to join: 10h<span
      th:text="${lefttime}">lefttime</span></td>
     </tr>
    </table>
    </tr>
    <tr>
    <table border="0" cellpadding="0" cellspacing="0" width="100%">
     <tr>
     <td style="padding: 40px 0px 10px 0px">
      team member:
     </td>
     </tr>
     <tr th:each="member :${members}">
     <td style="padding: 5px 0px 5px 0px"><span
      th:text="${member.getname()}+', email: '+${member.getemail()}"></span>
     </td>
     </tr>
    </table>
    </tr>
    <tr>
    <td align="center" style="padding: 5px 40px 5px 40px">
     <button class="button">view details</button>
    </td>
    </tr>
   </table>
 
 
   </td>
  </tr>
  </table>
 </td>
 </tr>
 
</table>
</body>
</html>

源碼下載:

github 源碼:鏈接地址

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。

原文鏈接:http://www.jianshu.com/p/13bcaee989fe

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲一区二区 | 成年人免费观看在线视频 | 欧美日韩一级视频 | 久久99精品久久久久久久青青日本 | 羞羞视频在线免费 | 天天久久 | 精品一区二区三区中文字幕老牛 | 99国产精品99久久久久久 | 国内成人免费视频 | 一级在线免费视频 | 欧美在线免费 | 久久精品亚洲成在人线av网址 | 国产一区二区影院 | 久久久久久久国产精品 | 国产亚洲一区二区三区在线观看 | 成人综合网站 | 丝袜美腿一区二区三区 | 欧美一区二区三区精品 | 成人av一区二区三区 | 综合精品 | 日本精品久久久 | 欧美激情国产精品 | 性色av一区二区三区红粉影视 | 国产这里只有精品 | 不卡视频一二三区 | 操av在线 | 一区二区免费 | 国产精品欧美日韩 | 日韩中文在线 | 黄色av免费看 | 亚洲精品影院 | 精品久久一区二区三区 | 色在线看 | 国产精品成av人在线视午夜片 | 91国内外精品自在线播放 | 精品一区二区三区在线视频 | 国产主播福利 | 91精品国产综合久久久久久丝袜 | 亚洲国产中文字幕 | 亚洲免费精品 | 国产精品原创av片国产免费 |