基於Spring Boot快速實現發送郵件功能

郵件在項目中常常會被用到,好比用郵件發送通知。好比,經過郵件註冊、認證、找回密碼、系統報警通知、報表信息等。本篇文章帶你們經過SpringBoot快速實現一個發送郵件的功能。html

郵件協議

下面先簡單瞭解一下常見的郵件協議。經常使用的電子郵件協議有SMTP、POP三、IMAP4,它們都隸屬於TCP/IP協議簇,默認狀態下,分別經過TCP端口2五、110和143創建鏈接。java

SMTP協議

SMTP的全稱是 「Simple Mail Transfer Protocol」,即簡單郵件傳輸協議。它是一組用於從源地址到目的地址傳輸郵件的規範,經過它來控制郵件的中轉方式。它的一個重要特色是它可以在傳送中接力傳送郵件,即郵件能夠經過不一樣網絡上的主機接力式傳送。git

SMTP認證,簡單地說就是要求必須在提供了帳戶名和密碼以後才能夠登陸SMTP服務器,這就使得那些垃圾郵件的散播者無可乘之機。增長SMTP認證的目的是爲了使用戶避免受到垃圾郵件的侵擾。SMTP已經是事實上的E-Mail傳輸的標準。github

POP協議

POP郵局協議負責從郵件服務器中檢索電子郵件。它要求郵件服務器完成下面幾種任務之一:從郵件服務器中檢索郵件並從服務器中刪除這個郵件;從郵件服務器中檢索郵件但不刪除它;不檢索郵件,只是詢問是否有新郵件到達。spring

POP協議支持多用戶互聯網郵件擴展,後者容許用戶在電子郵件上附帶二進制文件,如文字處理文件和電子表格文件等,實際上這樣就能夠傳輸任何格式的文件了,包括圖片和聲音文件等。在用戶閱讀郵件時,POP命令全部的郵件信息當即下載到用戶的計算機上,不在服務器上保留。springboot

POP3(Post Office Protocol 3)即郵局協議的第3個版本,是因特網電子郵件的第一個離線協議標準。服務器

IMAP協議

互聯網信息訪問協議(IMAP)是一種優於POP的新協議。和POP同樣,IMAP也能下載郵件、從服務器中刪除郵件或詢問是否有新郵件,但IMAP克服了POP的一些缺點。例如,它能夠決定客戶機請求郵件服務器提交所收到郵件的方式,請求郵件服務器只下載所選中的郵件而不是所有郵件。客戶機可先閱讀郵件信息的標題和發送者的名字再決定是否下載這個郵件。微信

經過用戶的客戶機電子郵件程序,IMAP可以讓用戶在服務器上建立並管理郵件文件夾或郵箱、刪除郵件、查詢某封信的一部分或所有內容,完成全部這些工做時都不須要把郵件從服務器下載到用戶的我的計算機上。網絡

支持IMAP的經常使用郵件客戶端有:ThunderMail,Foxmail,Microsoft Outlook等。app

SpringBoot集成Mail功能

若是未使用SpringBoot,須要本身去封裝消息體等信息,實現起來仍是比較複雜的。但基於Spring Boot進行郵件發送,幾乎能夠說只用引入spring-boot-starter-mail就能夠輕鬆完成郵件的發送。

從本質上來講是因爲Spring推出了關於Mail的JavaMailSender類,基於該類Spring Boot又進一步封裝,從而實現了輕鬆發送郵件的集成。並且JavaMailSender類提供了強大的郵件發送能力,支持各類類型的郵件發送。

依賴配置

集成步驟很是簡單,在項目中添加以下依賴:

<dependency> 
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

配置文件

在application.properties中添加郵箱配置,對應參數項已經內置好,根據具體狀況進行配置便可。

# 郵箱服務器地址
spring.mail.host=smtp.qq.com
spring.mail.username=admin@choupangxia.com
spring.mail.password=123456
spring.mail.default-encoding=UTF-8

其中第一個host(郵件服務器地址)參數,不一樣的郵箱有所不一樣,上面是QQ郵箱的host。163郵箱爲smtp.163.com、126郵箱爲smtp.126.com。

username和password項爲郵箱對應的用戶名和密碼,密碼並非登陸密碼,而是開啓POP3以後設置的客戶端受權密碼。

以QQ郵箱爲例,進行密碼的配置和獲取。首先登陸QQ郵箱,找「設置」,「帳戶」。

image

在下面找到「POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務」,選擇第二項中的「IMAP/SMTP服務」,進行開啓。

image

開啓成功,會顯示以下頁面:

image

頁面中便包含了受權碼,也就是咱們項目中的密碼。此時將該受權碼複製到password處便可。

發送文本郵件

完成了上面的配置,發送功能的實現便極其簡單了,直接在項目中注入JavaMailSender而後調用其send方法即可進行郵件的發送。

以單元測試的形式發送郵件以下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MailTests {

    @Resource
    private JavaMailSender javaMailSender;

    @Test
    public void sendMail() {
        SimpleMailMessage msg = new SimpleMailMessage();
        msg.setFrom("123@qq.com");
        msg.setTo("123@qq.com");
        msg.setSubject("程序新視界");
        msg.setText("技術分享");
        javaMailSender.send(msg);
    }
}

程序很簡單,建立一個SimpleMailMessage對象,設置從哪一個(from)帳號發送到(to)哪一個帳號,郵件的標題(subject)和內容(text)分別是什麼。

執行單元測試,稍等片刻,郵箱便收到了郵件。若是執行的過程當中出現權限驗證相關的異常,則須要檢查一下相關的配置是否正確。

若是須要抄送其餘人,經過以下格式新增一個或多個收件地址。

// 抄送郵箱
msg.setCc("abc@126.com","def@126.com");

發送富文本郵件

正常來講,咱們的郵件會有不一樣的格式,使用上面的SimpleMailMessage不可以很好的豐富郵件內容,也不支持html的解析。

Spring Boot支持使用HTML發送郵件是經過MimeMessage來完成的。看具體的示例代碼:

@Test
public void sendHtmlMail() {
    String content="<html>\n" +
            "<body>\n" +
            "    <h3>hello world ! 這是一封html郵件!</h3>\n" +
            "</body>\n" +
            "</html>";

    MimeMessage message = javaMailSender.createMimeMessage();
    try {
        // 第二個參數true表示須要建立一個multipart message
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom("123@qq.com");
        helper.setTo("123@qq.com");
        helper.setSubject("程序新視界");
        helper.setText(content, true);

        javaMailSender.send(message);
    } catch (MessagingException e){
        System.out.println("發送郵件異常");
    }
}

此處使用了MimeMessageHelper來設置對應的參數信息,但在調用MimeMessageHelper對應的setter方法時會拋出MessagingException異常,須要進行特殊處理。

上面的content的內容,若是使用SimpleMailMessage對象進行發送,郵件的內容是包含html標籤的內容,而不是直接呈現html標籤所須要展現的格式。

MimeMessageHelper支持發送複雜郵件模板,支持文本、附件、HTML、圖片等。好比須要發送附件,則在上面的代碼中經過調用helper的addAttachment(fileName, file)方法便可。

咱們這裏就再也不拓展其餘功能,你們可自行進行嘗試。

其餘擴展

上面只是經過單元測試的形式展現了基於Spring Boot發送郵件,固然,在生產環境中的應用場景要比上面的複雜的多。好比,要考慮郵件模板、對外接口、異常處理、成功率等問題。你們可在此基礎上進行拓展。

源碼地址:https://github.com/secbr/spri...


<center>程序新視界:精彩和成長都不容錯過</center>

程序新視界-微信公衆號

相關文章
相關標籤/搜索