最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中發(fā)送QQ郵件功能的實現(xiàn)代碼

 更新時間:2018年02月02日 11:56:09   作者:江南一點雨  
這篇文章主要介紹了SpringBoot中發(fā)送QQ郵件功能的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

本文是vhr系列的第十二篇,項目地址 https://github.com/lenve/vhr

郵件發(fā)送也是一個老生常談的問題了,代碼雖然簡單,但是許多小伙伴對過程不太理解,所以還是打算和各位小伙伴聊聊這個話題。

郵件協(xié)議

我們經(jīng)常會聽到各種各樣的郵件協(xié)議,比如SMTP、POP3、IMAP,那么這些協(xié)議有什么作用,有什么區(qū)別?我們先來討論一下這個問題。

SMTP是一個基于TCP/IP的應用層協(xié)議,江湖地位有點類似于HTTP,SMTP服務(wù)器默認監(jiān)聽的端口號為25。看到這里,小伙伴們可能會想到既然SMTP協(xié)議是基于TCP/IP的應用層協(xié)議,那么我是不是也可以通過Socket發(fā)送一封郵件呢?回答是肯定的。

生活中我們投遞一封郵件要經(jīng)過如下幾個步驟:

1.深圳的小王先將郵件投遞到深圳的郵局

2.深圳的郵局將郵件運送到上海的郵局

3.上海的小張來郵局取郵件

這是一個縮減版的生活中郵件發(fā)送過程。這三個步驟可以分別對應我們的郵件發(fā)送過程,假設(shè)從aaa@qq.com發(fā)送郵件到111@163.com

1.aaa@qq.com先將郵件投遞到騰訊的郵件服務(wù)器

2.騰訊的郵件服務(wù)器將我們的郵件投遞到網(wǎng)易的郵件服務(wù)器

3.111@163.com登錄網(wǎng)易的郵件服務(wù)器查看郵件

郵件投遞大致就是這個過程,這個過程就涉及到了多個協(xié)議,我們來分別看一下。

SMTP協(xié)議全稱為Simple Mail Transfer Protocol,譯作簡單郵件傳輸協(xié)議,它定義了郵件客戶端軟件于SMTP服務(wù)器之間,以及SMTP服務(wù)器與SMTP服務(wù)器之間的通信規(guī)則。也就是說aaa@qq.com用戶先將郵件投遞到騰訊的SMTP服務(wù)器這個過程就使用了SMTP協(xié)議,然后騰訊的SMTP服務(wù)器將郵件投遞到網(wǎng)易的SMTP服務(wù)器這個過程也依然使用了SMTP協(xié)議,SMTP服務(wù)器就是用來收郵件。而POP3協(xié)議全稱為Post Office Protocol,譯作郵局協(xié)議,它定義了郵件客戶端與POP3服務(wù)器之間的通信規(guī)則,那么該協(xié)議在什么場景下會用到呢?當郵件到達網(wǎng)易的SMTP服務(wù)器之后,111@163.com用戶需要登錄服務(wù)器查看郵件,這個時候就該協(xié)議就用上了:郵件服務(wù)商都會為每一個用戶提供專門的郵件存儲空間,SMTP服務(wù)器收到郵件之后,就將郵件保存到相應用戶的郵件存儲空間中,如果用戶要讀取郵件,就需要通過郵件服務(wù)商的POP3郵件服務(wù)器來完成。最后,可能也有小伙伴們聽說過IMAP協(xié)議,這個協(xié)議是對POP3協(xié)議的擴展,功能更強,作用類似,這里不再贅述。

發(fā)送QQ郵件準備工作

首先我們需要先登錄QQ郵箱網(wǎng)頁版,點擊上方的設(shè)置按鈕:

 

然后點擊賬戶選項卡:

 

在賬戶選項卡中找到開啟POP3/SMTP選項,如下:

 

點擊開啟,開啟相關(guān)功能,開啟過程需要手機號碼驗證,按照步驟操作即可,不贅述。開啟成功之后,即可獲取一個授權(quán)碼,將該號碼保存好,一會使用。

然后我們需要JavaxMail這個jar包,小伙伴可以直接去Maven中央倉庫下載,這里不再贅述。

發(fā)送

簡單郵件

如果我們只發(fā)送一個簡單的文本,發(fā)送方式就比較簡單,整個過程可以分為三步如下:

第一步:構(gòu)造SMTP郵件服務(wù)器的基本環(huán)境

Properties properties = new Properties();
properties.setProperty("mail.host", "smtp.qq.com");
properties.setProperty("mail.transport.protocol", "smtp");
properties.setProperty("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
properties.setProperty("mail.smtp.port", "465");
Session session = Session.getDefaultInstance(properties);
session.setDebug(true);

第二步:構(gòu)造郵件

MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.addRecipients(Message.RecipientType.TO, "111@qq.com");//設(shè)置收信人
mimeMessage.addRecipients(Message.RecipientType.CC, "222@qq.com");//抄送
mimeMessage.setFrom("1510161612@qq.com");//郵件發(fā)送人
mimeMessage.setSubject("測試郵件主題");//郵件主題
mimeMessage.setContent("Hello,這是一封測試郵件", "text/html;charset=utf-8");//正文

第三步:發(fā)送郵件

Transport transport = session.getTransport();
transport.connect("smtp.qq.com", "333@qq.com", "剛剛申請到的授權(quán)碼");
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());//發(fā)送郵件,第二個參數(shù)為收件人
transport.close();

復雜郵件

發(fā)送復雜郵件,第一步和第三步也是一樣的,只有第二步構(gòu)造郵件的過程比較麻煩,那么接下來給小伙伴們演示一個發(fā)送一封圖文+兩個附件的郵件。要發(fā)送復雜郵件,得先熟悉三個概念,如下:

1.MimeMessage:該類是個能理解MIME類型和頭的電子郵件消息

2.MimeMultipart:該類定義了增加、刪除以及獲取郵件不同部分內(nèi)容的方法

3.MimeBodyPart:該對象代表一個MimeMessage對象內(nèi)容的一部分。每個MimeBodyPart被認為有兩部分:MIME類型和匹配這個類型的內(nèi)容

完整的郵件生成過程如下(第一步和第三步參考上文):

MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.addRecipients(Message.RecipientType.TO, "111@qq.com");//設(shè)置收信人
mimeMessage.addRecipients(Message.RecipientType.CC, "222@qq.com");//抄送
mimeMessage.setFrom("333@qq.com");//郵件發(fā)送人
mimeMessage.setSubject("測試郵件主題");//郵件主題
MimeMultipart mixed = new MimeMultipart("mixed");
mimeMessage.setContent(mixed);//設(shè)置整封郵件的MIME消息體為混合的組合關(guān)系
MimeBodyPart attach1 = new MimeBodyPart();//創(chuàng)建附件1
MimeBodyPart attach2 = new MimeBodyPart();//創(chuàng)建附件2
MimeBodyPart content = new MimeBodyPart();//創(chuàng)建郵件正文
mixed.addBodyPart(attach1);//將附件一添加到MIME消息體中
mixed.addBodyPart(attach2);//將附件二添加到MIME消息體中
mixed.addBodyPart(content);//將正文添加到消息體中
FileDataSource fds1 = new FileDataSource(new File("C:\\Users\\sang\\Desktop\\1.png"));//構(gòu)造附件一的數(shù)據(jù)源
DataHandler dh1 = new DataHandler(fds1);//數(shù)據(jù)處理
attach1.setDataHandler(dh1);//設(shè)置附件一的數(shù)據(jù)源
attach1.setFileName("1.png");//設(shè)置附件一的文件名
//附件二的操作與附件一類似,這里就不一一注釋了
FileDataSource fds2 = new FileDataSource(new File("C:\\Users\\sang\\Desktop\\博客筆記.xlsx"));
DataHandler dh2 = new DataHandler(fds2);
attach2.setDataHandler(dh2);
attach2.setFileName(MimeUtility.encodeText("博客筆記.xlsx"));//設(shè)置文件名時,如果有中文,可以通過MimeUtility類中的encodeText方法進行編碼,避免亂碼
MimeMultipart bodyMimeMultipart = new MimeMultipart("related");//設(shè)置正文的MIME類型
content.setContent(bodyMimeMultipart);//將bodyMimeMultipart添加到正文消息體中
MimeBodyPart bodyPart = new MimeBodyPart();//正文的HTML部分
bodyPart.setContent("<h1>Hello大家好,這是一封測試郵件<img src='cid:2.png'/></h1>","text/html;charset=utf-8");
MimeBodyPart picPart = new MimeBodyPart();//正文的圖片部分
DataHandler dataHandler = new DataHandler(new FileDataSource("C:\\Users\\sang\\Desktop\\2.png"));
picPart.setDataHandler(dataHandler);
picPart.setContentID("2.png");
//將正文的HTML和圖片部分分別添加到bodyMimeMultipart中
bodyMimeMultipart.addBodyPart(bodyPart);
bodyMimeMultipart.addBodyPart(picPart);
mimeMessage.saveChanges();

OK,Java Mail發(fā)送QQ郵件就是這么簡單,至于其他的如163,sina等,寫法類似,這里我就不贅述了。

總結(jié)

以上所述是小編給大家介紹的SpringBoot中發(fā)送QQ郵件功能的實現(xiàn)代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 盤點Java中延時任務(wù)的多種實現(xiàn)方式

    盤點Java中延時任務(wù)的多種實現(xiàn)方式

    當需要一個定時發(fā)布系統(tǒng)通告的功能,如何實現(xiàn)??當支付超時,訂單自動取消,如何實現(xiàn)?其實這些問題本質(zhì)都是延時任務(wù)的實現(xiàn),本文為大家盤點了多種常見的延時任務(wù)實現(xiàn)方法,希望對大家有所幫助
    2022-12-12
  • 基于java讀取并引用自定義配置文件

    基于java讀取并引用自定義配置文件

    這篇文章主要介紹了基于java讀取并引用自定義配置文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 利用JStack排查死鎖問題和CPU100%問題

    利用JStack排查死鎖問題和CPU100%問題

    無論是再面試過程中還是再實際項目開發(fā)當中我們都有可能遇到這兩個問題如何利用JStack排查死鎖問題和CPU100%問題,文中給出了詳細的排查過程和解決方法,需要的朋友可以參考下
    2023-12-12
  • JAVA JDK8 List獲取屬性列表

    JAVA JDK8 List獲取屬性列表

    今天小編就為大家分享一篇關(guān)于JAVA JDK8 List獲取屬性列表,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 基于SpringBoot實現(xiàn)定時發(fā)送郵件過程解析

    基于SpringBoot實現(xiàn)定時發(fā)送郵件過程解析

    這篇文章主要介紹了基于SpringBoot實現(xiàn)定時發(fā)送郵件過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • SpringMvc自動裝箱及GET請求參數(shù)原理解析

    SpringMvc自動裝箱及GET請求參數(shù)原理解析

    這篇文章主要介紹了SpringMvc自動裝箱及GET請求參數(shù)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • springboot controller無效的處理方案

    springboot controller無效的處理方案

    這篇文章主要介紹了springboot controller無效的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 深入解析Java中的Class Loader類加載器

    深入解析Java中的Class Loader類加載器

    這篇文章主要介紹了Java中的類加載器,是Java入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-03-03
  • eclipse實現(xiàn)可認證的DH密鑰交換協(xié)議

    eclipse實現(xiàn)可認證的DH密鑰交換協(xié)議

    這篇文章主要介紹了eclipse實現(xiàn)可認證的DH密鑰交換協(xié)議,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 詳解Java的內(nèi)存模型

    詳解Java的內(nèi)存模型

    本文更準確的說法應該是JVM的內(nèi)存模型,但是這里又牽扯了一些其他的前置知識,主要是想從Java入手,從源頭上梳理一遍整個Java底層運行的機制,中間會額外補充一些和題目無關(guān)的前置基礎(chǔ),導致主講內(nèi)存模型的篇幅所占的比例就不是那么絕對。
    2021-06-06

最新評論

嫩江县| 吉水县| 南丹县| 定结县| 元阳县| 进贤县| 绥芬河市| 泉州市| 武宣县| 崇仁县| 耒阳市| 洪湖市| 洪湖市| 柏乡县| 哈巴河县| 囊谦县| 新竹市| 洪湖市| 兴城市| 潢川县| 潢川县| 新民市| 中阳县| 红原县| 新巴尔虎左旗| 宣武区| 大名县| 镇安县| 小金县| 石门县| 平安县| 涞水县| 丰台区| 南华县| 黄石市| 旬阳县| 兴山县| 武鸣县| 泸溪县| 咸丰县| 潮州市|