第四章:SpringBoot整合JavaMail傳送郵件
簡單介紹
JavaMail是SUN公司提供給廣大Java開發人員的一款郵件傳送和接收的開源類庫,支援常用的郵件協議,如:SMTP、POP3、IMAP,開發人員使用JavaMail編寫郵件程式時,不再需要考慮底層的通訊細節如:Socket,而是關注在邏輯層面。JavaMail可以傳送各種複雜MIME格式的郵件內容,注意JavaMail僅支援JDK4及以上版本。
構建專案
本章專案無關Web相關內容,所以建立專案時選擇Jar形式建立。雖然JavaMail是JDK的API但它並沒有直接加入JDK中,所以我們需要另外新增依賴。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- JavaMail依賴 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4 .7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
封裝JavaMail
1、編寫實體類MailEntity來儲存傳送郵件時需要的引數欄位
public class MailEntity implements Serializable{
//此處填寫SMTP伺服器
private String smtpService;
//設定埠號
private String smtpPort;
//設定傳送郵箱
private String fromMailAddress;
// 設定傳送郵箱的STMP口令
private String fromMailStmpPwd;
//設定郵件標題
private String title;
//設定郵件內容
private String content;
//內容格式(預設採用html)
private String contentType;
//接受郵件地址集合
private List<String> list = new ArrayList<>();
get/set...
2、建立一個郵件傳送者實體MailSender來配置傳送郵件引數以及執行傳送郵件
public class MailSender {
private static MailEntity mail = new MailEntity(); //郵件實體
//設定郵件標題
public MailSender title(String title){
mail.setTitle(title);
return this;
}
//設定郵件內容
public MailSender content(String content)
{
mail.setContent(content);
return this;
}
//設定郵件格式
public MailSender contentType(MailContentTypeEnum typeEnum)
{
mail.setContentType(typeEnum.getValue());
return this;
}
//設定請求目標郵件地址
public MailSender targets(List<String> targets)
{
mail.setList(targets);
return this;
}
/**
* 執行傳送郵件
* @throws Exception 如果傳送失敗會丟擲異常資訊
*/
public void send() throws Exception
{
//預設使用html內容傳送
if(mail.getContentType() == null)
mail.setContentType(MailContentTypeEnum.HTML.getValue());
if(mail.getTitle() == null || mail.getTitle().trim().length() == 0)
{
throw new Exception("郵件標題沒有設定.呼叫title方法設定");
}
if(mail.getContent() == null || mail.getContent().trim().length() == 0)
{
throw new Exception("郵件內容沒有設定.呼叫content方法設定");
}
if(mail.getList().size() == 0)
{
throw new Exception("沒有接受者郵箱地址.呼叫targets方法設定");
}
//讀取/resource/mail_zh_CN.properties檔案內容
final PropertiesUtil properties = new PropertiesUtil("mail");
// 建立Properties 類用於記錄郵箱的一些屬性
final Properties props = new Properties();
// 表示SMTP傳送郵件,必須進行身份驗證
props.put("mail.smtp.auth", "true");
//此處填寫SMTP伺服器
props.put("mail.smtp.host", properties.getValue("mail.smtp.service"));
//設定埠號,QQ郵箱給出了兩個埠465/587
props.put("mail.smtp.port", properties.getValue("mail.smtp.prot"));
// 設定傳送郵箱
props.put("mail.user", properties.getValue("mail.from.address"));
// 設定傳送郵箱的16位STMP口令
props.put("mail.password", properties.getValue("mail.from.smtp.pwd"));
// 構建授權資訊,用於進行SMTP進行身份驗證
Authenticator authenticator = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
// 使用者名稱、密碼
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
};
// 使用環境屬性和授權資訊,建立郵件會話
Session mailSession = Session.getInstance(props, authenticator);
// 建立郵件訊息
MimeMessage message = new MimeMessage(mailSession);
// 設定發件人
String nickName = MimeUtility.encodeText(properties.getValue("mail.from.nickname"));
InternetAddress form = new InternetAddress(nickName + " <" + props.getProperty("mail.user") + ">");
message.setFrom(form);
// 設定郵件標題
message.setSubject(mail.getTitle());
//html傳送郵件
if(mail.getContentType().equals(MailContentTypeEnum.HTML.getValue())) {
// 設定郵件的內容體
message.setContent(mail.getContent(), mail.getContentType());
}
//文字傳送郵件
else if(mail.getContentType().equals(MailContentTypeEnum.TEXT.getValue())){
message.setText(mail.getContent());
}
//傳送郵箱地址
List<String> targets = mail.getList();
for(int i = 0;i < targets.size();i++){
try {
// 設定收件人的郵箱
InternetAddress to = new InternetAddress(targets.get(i));
message.setRecipient(Message.RecipientType.TO, to);
// 最後當然就是傳送郵件啦
Transport.send(message);
}catch (Exception e)
{
continue;
}
}
}
}
3、定義一個列舉型別MailContentTypeEnum包含了郵件內容的型別,目前我只添加了html和text這兩種形式。
public enum MailContentTypeEnum {
HTML("text/html;charset=UTF-8"), TEXT("text");
private String value;
MailContentTypeEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
4、建立工具類PropertiesUtil
PropertiesUtil用於讀取*.properties配置檔案的工具類,使用JavaMail需要配置SMTP以及使用者名稱、密碼等也就是MailEntity內的欄位,那麼我們在/resource目錄下建立一個名字叫mail.properties的配置檔案,裡面存放我們定義的郵件傳送引數配置,這樣方便修改
public class PropertiesUtil {
private final ResourceBundle resource;
private final String fileName;
//建構函式例項化部分物件,獲取檔案資源物件
public PropertiesUtil(String fileName)
{
this.fileName = fileName;
Locale locale = new Locale("zh", "CN");
this.resource = ResourceBundle.getBundle(this.fileName, locale);
}
/**
* 根據傳入的key獲取物件的值
* @param key properties檔案對應的key
* @return String 解析後的對應key的值
*/
public String getValue(String key)
{
String message = this.resource.getString(key);
return message;
}
//獲取properties檔案內的所有key值
public Enumeration<String> getKeys(){
return resource.getKeys();
}
}
mail.properties
mail.smtp.service=smtp.qq.com
mail.smtp.prot=587
mail.from.address=123@qq.com
mail.from.smtp.pwd=***********
mail.from.nickname=Mir Li
注意:如果第一次使用QQ郵箱的SMTP服務,請點選“開啟”POP3以及SMTP服務並且按照提示步驟完成獲取“授權碼”即可,授權碼就是傳送郵件引數的smtp.pwd屬性。
測試郵件傳送
建立一個TestMail類來作為測試入口,因為我們的專案是jar形式,所以我們直接新建一個main方法直接呼叫傳送郵件就可以了。
public class TestMail {
public static void main(String[] args) throws Exception
{
new MailSender()
.title("測試SpringBoot傳送郵件")
.content("簡單文字內容傳送")
.contentType(MailContentTypeEnum.TEXT)
.targets(new ArrayList<String>(){{
add("[email protected]");
}})
.send();
}
}
如果暱稱出現亂碼:修改InteiiJ IDEA工具的properties檔案的編碼,點選File->Setting->Editor->File Encodings將下面的Default encoding設定為UTF-8即可。
中文轉換ASCII碼可以訪問tool.oschina.net/encode線上轉換
總結
上述內容就是本章的所有講解,本章主要講解了在SpringBoot專案內是如何使用JavaMail來進行傳送簡單郵件,簡單封裝了下MailSender類以及物件實體MailEntity,如果需要傳送HTML內容的郵件修改contentType(MailContentTypeEnum.HTML)然後content(“html程式碼”)即可。
相關推薦
第四章:SpringBoot整合JavaMail傳送郵件
簡單介紹 JavaMail是SUN公司提供給廣大Java開發人員的一款郵件傳送和接收的開源類庫,支援常用的郵件協議,如:SMTP、POP3、IMAP,開發人員使用JavaMail編寫郵件程式時,不再需要考慮底層的通訊細節如:Socket,而是關注在邏輯層面。J
第七章:springboot整合MongoDB
本篇博文主要講述入使用springboot對MongoDB進行整合 這裡我們需要先安裝配置MongoDB。在官網下載會比較慢,(反正我是比較慢啦,不知道各位的了)所以我特意提供了一下我下載好的安裝包,以及補丁,還有一個視覺化工具。地址在下方,有需要的可以前往下載。 此
SpringBoot整合JavaMail傳送郵件 --轉載
JavaMail是SUN提供給廣大Java開發人員的一款郵件傳送和接受的一款開源類庫,支援常用的郵件協議,如:SMTP、POP3、IMAP,開發人員使用JavaMail編寫郵件程式時,不再需要考慮底層的通訊細節如:Socket而是關注在邏輯層面。JavaMail可以傳送各種複雜MIME格式的郵件內容
Springboot 整合 javamail傳送郵件535錯誤
好多夥伴都會遇到 javamail傳送郵件535錯誤 網上有很多經常能搜到的解決方案我姐不說了,提一下我的問題,以及很少能搜到的導致535錯誤的一種原因。 當你的jdk是1.8版本的時候,也是導致535的一種因素:解決:如果還有問題 大家就可以去網上搜搜了,其他的導致53
第四章:整合
整合是微服務相關技術中最重要的一個。做得好的話,你的微服務可以保持自治性,可以獨立修改和釋出他們,如果做的不好的話,會帶來災難。 4.1尋找理想的整合技術 微服務間的通訊選擇性很多,REST、SOAP、RPC、Protocol buffers等。 4.11避免破壞性修改 有
第四章:使用Druid作為SpringBoot專案資料來源(新增監控)
Druid是一個關係型資料庫連線池,它是阿里巴巴的一個開源專案。Druid支援所有JDBC相容資料庫,包括了Oracle、MySQL、PostgreSQL、SQL Server、H2等。Druid在監控、可擴充套件性、穩定性和效能方面具有明顯的優勢。通過Druid提供的監控功
Netty In Action中文版 - 第四章:Transports(傳輸)
duplicate pipeline 客戶 下列表 bytes 線程安全 get 工具 jsb 本章內容 Transports(傳輸)NIO(non-blocking IO,New IO), OIO(Old IO,blocking IO), Local(本地),
讀構建之法 第四章:兩人合作
應用 結對編程 使用 一對一 測試 一個 比較 以及 領域 程序員寫的代碼最終是人在看,所以代碼規範很重要,原則是:簡明,易讀,無二義性。 不光是程序書寫的格式問題,還牽涉到程序設計、模塊之間的關系、設計模式等方方面面。 代碼復審的正確定義看代碼是否在代碼規範的框架內正確的
第四章:執行環境與作用域
logs 執行 引用傳遞 按值傳遞 ons fun col func clas 函數中對象的值是按值傳遞的 !(function () { //對象的按值傳遞or按引用傳遞在函數中 function setName(obj) {
第四章:操作列表
clas str 3.3 轉換 一個 改變 導致 賦值 any 第四章:操作列表 4.1 遍歷整個列表 如果名單很長,將包含大量反復的代碼。另外,每當名單的長度發生變化時,都必須修改代碼。通過for 循環,可讓Python去處理這些問題 1)使用for循環來打印魔術師名
第四章:重構代碼[學習Android Studio漢化教程]
出現 introduce 編輯 rri 分享 成員 dialog fig ice 第四章 Refactoring Code The solutions you develop in Android Studio will not always follow a straig
ES6標準入門 第四章:字符串的擴展
固定 缺陷 長度 需要 允許 實例對象 poi turn har 1、字符串的Unicode 表示法 JavaScript 允許采用 \uxxxx 表示一個字符,其中 xxxx 表示字符的碼點。 "\u0061" // "a" ES5中的缺陷: 以上表示
Node入門教程(5)第四章:global 全局變量
-c 這不 .com clear 替換 http htm 取消 floating global - 全局變量 全局對象(global object),不要和 全局的對象( global objects )或稱標準內置對象混淆。這裏說的全局的對象是說在全局作用域裏的內的對象
第四章:活動圖
分享圖片 只有一個 什麽 分叉 img 面向 png 對象流 有一個 活動圖明確先做什麽,後坐什麽,什麽條件下做什麽。 活動圖也可以不面向對象,但流程圖一定面向過程。 一個活動圖一定有只有一個初始節點。終點為1~n。 如果有多個終點那麽可以有描述。
第四章:Spring AOP
edi 關註 aspectj 附加 aop 插入 out cert AC 4.1:面向切面編程 AOP是在運行期間將代碼切入到類的指定位置的編程思想。切面能幫助我們模塊化橫切關註點,實現橫切關註點的復用。Spring在運行期間將切面植入到指定的Bean中,實際是通過攔
現代軟件工程—構建之法---第四章:練習與討論
人在 做出 鍵盤 工具 等級分 閱讀 nbsp 現實 是個 1 、結對項目的案例與論文 論文已閱讀。 2、性格對合作的影響 我的MBTI為:ESTJ 管家型——掌控當下,讓各種事務有條不紊地進行 ESTJ型的人高效率地工作,自我負責,監督他人工作,合理分配和處置
《JavaScript 高級程序設計》第四章:變量、作用域和內存問題
綁定 pro 擔心 block lock 效率 TE 二次 problem 目錄 變量的引用 執行環境及作用域 作用域鏈延長 塊級作用域 垃圾回收機制 變量的引用 當一個變量保存了基本數據類型時,此時對於變量的操作(賦值,運算)就是操作這個基本數據的本身,就算是賦值操
C#本質論6.0第四章:方法和參數
有助於 異常 名稱 別名 不同的 元素 寫入 轉換 參數順序 方法和參數 方法組合一系列語句以執行特定操作或計算特定結果,它能夠為構成程序的語句提供更好的結構和組織。 方法總是和類型——通常是類關聯。 方法通過實參接收數據,實參由方法的參數或形參定義,參數是調用者用於向被
Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第四章:Direct 3D初始化
學習目標 對Direct 3D程式設計在3D硬體中扮演的角色有基本瞭解; 理解COM在Direct 3D中扮演的角色; 學習基本的圖形學概念,比如儲存2D影象、頁面切換,深度緩衝、多重紋理對映和CPU與GPU如何互動; 學習如何使用效能計數函式讀取高精度時間;
《SQL入門經典》筆記(第四章:建立資料庫之去規格化資料庫)
1. 什麼是去規格化? 去規格化是通過修改規格化資料庫的表的構成,在允許一定程度的資料冗餘的情況下,提高資料庫庫效能。 2. 為什麼要去規格化? 嘗試提高效能是進行去規格化資料庫的唯一原因(規格化的資料庫需要頻繁地進行表的結合,效能會降低)。 3.