1. 程式人生 > >第四章:SpringBoot整合JavaMail傳送郵件

第四章: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; //內容格式(預設採用htmlprivate 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檔案內的所有keypublic 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.