Java Email郵件發(fā)送簡單實(shí)現(xiàn)介紹
一、郵件協(xié)議
MTA 和 MDA 這樣的服務(wù)器軟件通常是現(xiàn)成的,我們通常不會(huì)關(guān)心這些郵件服務(wù)器的內(nèi)部是如何運(yùn)行 的。更多的需求場景,是需要發(fā)送郵件。例如:促銷商品郵件、驗(yàn)證碼郵件、消息通知郵件等。常見的 郵件協(xié)議有: POP3 、 SMTP 、 IMAP 。
1.POP3
POP3是Post Office Protocol 3的簡稱,即郵局協(xié)議的第3個(gè)版本,它規(guī)定怎樣將個(gè)人計(jì)算機(jī)連接到Internet的郵件 服務(wù)器和下載電子郵件的電子協(xié)議。它是因特網(wǎng)電子郵件的第一個(gè)離線協(xié)議標(biāo)準(zhǔn),POP3允許用戶從服務(wù)器上把 郵件存儲(chǔ)到本地主機(jī)(即自己的計(jì)算機(jī))上,同時(shí)刪除保存在郵件服務(wù)器上的郵件,而POP3服務(wù)器則是遵循 POP3協(xié)議的接收郵件服務(wù)器,用來接收電子郵件的。
2.SMTP
SMTP 的全稱是“Simple Mail Transfer Protocol”,即簡單郵件傳輸協(xié)議。它是一組用于從源地址到目的地址傳 輸郵件的規(guī)范,通過它來控制郵件的中轉(zhuǎn)方式。SMTP 協(xié)議屬于 TCP/IP 協(xié)議簇,它幫助每臺(tái)計(jì)算機(jī)在發(fā)送或中 轉(zhuǎn)信件時(shí)找到下一個(gè)目的地。SMTP 服務(wù)器就是遵循 SMTP 協(xié)議的發(fā)送郵件服務(wù)器。 SMTP 認(rèn)證,簡單地說就是要求必須在提供了賬戶名和密碼之后才可以登錄 SMTP 服務(wù)器,這就使得那些垃圾 郵件的散播者無可乘之機(jī)。 增加 SMTP 認(rèn)證的目的是為了使用戶避免受到垃圾郵件的侵?jǐn)_。
3.IMAP
IMAP全稱是Internet Mail Access Protocol,即交互式郵件存取協(xié)議,它是跟POP3類似郵件訪問標(biāo)準(zhǔn)協(xié)議之 一。不同的是,開啟了IMAP后,您在電子郵件客戶端收取的郵件仍然保留 在服務(wù)器上,同時(shí)在客戶端上的操作 都會(huì)反饋到服務(wù)器上,如:刪除郵件,標(biāo)記已讀等,服務(wù)器上的郵件也會(huì)做相應(yīng)的動(dòng)作。所以無論從瀏覽器登 錄郵箱或者客戶端 軟件登錄郵箱,看到的郵件以及狀態(tài)都是一致的。
4.IMAP和POP3有什么區(qū)別
- POP3協(xié)議允許電子郵件客戶端下載服務(wù)器上的郵件,但是在客戶端的操作(如移動(dòng)郵件、標(biāo)記 已讀等),不會(huì)反饋到服務(wù)器上,比如通過客戶端收取了郵箱中的3封郵件并移動(dòng)到其他文件夾,郵 箱服務(wù)器上的這些郵件是沒有同時(shí)被移動(dòng)的 。
- IMAP提供webmail 與電子郵件客戶端之間的雙向通信,客戶端的操作都會(huì)反饋到服務(wù)器上,對(duì) 郵件進(jìn)行的操作,服務(wù)器上的郵件也會(huì)做相應(yīng)的動(dòng)作。 IMAP和POP3有什么區(qū)別?
二、發(fā)送郵件
發(fā)送郵件時(shí),我們需要構(gòu)造一個(gè) Message 對(duì)象,然后調(diào)用 Transport.send(Message) 即可完成發(fā)送:絕 大多數(shù)郵件服務(wù)器要求發(fā)送方地址和登錄用戶名必須一致,否則發(fā)送將失敗。
package com.ljl.email; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Paths; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.util.ByteArrayDataSource; import javax.activation.DataHandler; import javax.mail.BodyPart; import javax.mail.Message.RecipientType; public class Demo03 { public static void main(String[] args) { try { //創(chuàng)建Session會(huì)話 Session session = JavaMailUtils.createSession(); //創(chuàng)建郵件對(duì)象(Message抽象類的子類對(duì)象) MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress("olaiolaio@126.com")); msg.setRecipient(RecipientType.TO ,new InternetAddress("2272789133@qq.com")); msg.setSubject("這是一份測試郵件","utf-8");//標(biāo)題 //郵件內(nèi)容復(fù)合對(duì)象 Multipart multipart = new MimeMultipart(); //正文 BodyPart textPart = new MimeBodyPart(); //參數(shù)一:正文內(nèi)容 //參數(shù)二:內(nèi)容類型;字符編碼機(jī) textPart.setContent("輸了<b>你</b>贏了世界又如何","text/html;charset=utf-8"); //附件 BodyPart imagePart = new MimeBodyPart(); imagePart.setFileName("lin.jpg"); imagePart.setDataHandler(new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get("D:\\k\\image\\ljj.jpg")), "application/octet-stream"))); //添加至郵件內(nèi)容 multipart.addBodyPart(textPart);//添加正文 multipart.addBodyPart(imagePart);//添加附件 //設(shè)置郵件內(nèi)容 msg.setContent(multipart); //發(fā)送 Transport.send(msg); } catch (MessagingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
三、總結(jié)
- 使用 JavaMail API 發(fā)送郵件本質(zhì)上是一個(gè) MUA 軟件通過 SMTP 協(xié)議發(fā)送郵件 至 MTA 服務(wù)器;
- 打開調(diào)試模式可以看到詳細(xì)的 SMTP 交互信息;
- 某些郵件服務(wù)商需要開啟 SMTP ,并需要獨(dú)立的 SMTP 登錄密碼。
到此這篇關(guān)于Java Email郵件發(fā)送簡單實(shí)現(xiàn)介紹的文章就介紹到這了,更多相關(guān)Java Email內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中遇到的For?input?string問題解決辦法
這篇文章主要給大家介紹了關(guān)于Java中遇到的For?input?string問題的解決辦法,如果出現(xiàn)這樣的異常報(bào)錯(cuò),是指的數(shù)據(jù)轉(zhuǎn)換時(shí)出錯(cuò),文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11SpringBoot+Redis執(zhí)行l(wèi)ua腳本的5種方式總結(jié)
Lua是一種快速、輕量級(jí)的腳本語言,廣泛應(yīng)用于各種領(lǐng)域,包括數(shù)據(jù)庫,Redis作為一個(gè)內(nèi)嵌Lua解釋器的NoSQL數(shù)據(jù)庫,允許通過Lua腳本在服務(wù)器端執(zhí)行一些復(fù)雜的操作,本文給大家介紹了使用SpringBoot Redis執(zhí)行l(wèi)ua腳本的五種方式,需要的朋友可以參考下2023-11-11java設(shè)置session過期時(shí)間的實(shí)現(xiàn)方法
這篇文章主要介紹了java設(shè)置session過期時(shí)間的實(shí)現(xiàn)方法,以實(shí)例形式詳細(xì)講述了具體實(shí)現(xiàn)過程,非常具有參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10SpringBoot環(huán)境下junit單元測試速度優(yōu)化方式
這篇文章主要介紹了SpringBoot環(huán)境下junit單元測試速度優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java 實(shí)戰(zhàn)項(xiàng)目之疫情人員流動(dòng)管理系統(tǒng)詳解
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)疫情人員流動(dòng)管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11SSH框架網(wǎng)上商城項(xiàng)目第30戰(zhàn)之項(xiàng)目總結(jié)(附源碼下載地址)
這篇文章主要介紹了SSH框架網(wǎng)上商城項(xiàng)目第30戰(zhàn)之項(xiàng)目總結(jié),并附源碼下載地址,感興趣的小伙伴們可以參考一下2016-06-06HashMap實(shí)現(xiàn)保存兩個(gè)key相同的數(shù)據(jù)
這篇文章主要介紹了HashMap實(shí)現(xiàn)保存兩個(gè)key相同的數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06SpringBoot整合MybatisPlus的簡單教程實(shí)現(xiàn)(簡單整合)
這篇文章主要介紹了SpringBoot整合MybatisPlus的簡單教程實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05