JavaMail保證郵件發(fā)送成功的方法是什么

JavaMail 保證郵件發(fā)送成功的方法是什么,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),香河企業(yè)網(wǎng)站建設(shè),香河品牌網(wǎng)站建設(shè),網(wǎng)站定制,香河網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,香河網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

使用過JavaMail的api發(fā)送郵件的人可能會(huì)有這樣一個(gè)疑惑:我如何知道我調(diào)用該api發(fā)送的郵件是否成功呢?一般的開放的api給我們調(diào)用都會(huì)有個(gè)返回值或者狀態(tài)碼,來告訴我們執(zhí)行成功與否。但是JavaMail卻沒有提供這樣一個(gè)返回值。

所以在調(diào)用JavaMail發(fā)送郵件的時(shí)候,我們只能通過catch異常的方式來判斷郵件是否發(fā)送成功。我們認(rèn)為只要沒有異常發(fā)生,那么郵件就能發(fā)送成功。那么我們就來分析一下JavaMail為什么沒有提供返回值,和通過異常判斷郵件發(fā)送成功狀態(tài)是否靠譜。

JavaMail發(fā)送郵件原理

在使用JavaMail進(jìn)行發(fā)送郵件時(shí),我們必須提供一個(gè)郵件會(huì)話。創(chuàng)建郵件會(huì)話的過程如下:

Properties props = new Properties();         // 發(fā)送郵件的服務(wù)器的IP和端口         props.put("mail.smtp.host", MAIL_SMTP_HOST);         props.put("mail.smtp.port", MAIL_SMTP_PORT);         // 是否需要身份驗(yàn)證         props.put("mail.smtp.auth", "true");          props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");         Session session = Session.getDefaultInstance(props, new Authenticator() {             protected PasswordAuthentication getPasswordAuthentication() {             // 登陸郵件發(fā)送服務(wù)器的用戶名和密碼                 return new PasswordAuthentication(MAIL_SENDER_MAIL, MAIL_SENDER_PASS);             }         });

分析一下代碼。在創(chuàng)建Session之前我們先創(chuàng)建一個(gè)Properties,這個(gè)Properties設(shè)置了這樣幾個(gè)參 數(shù):mail.smtp.host、mail.smtp.port、mail.smtp.auth和 mail.smtp.socketFactory.class。在創(chuàng)建Session的時(shí)候還要傳入發(fā)送郵件使用的用戶名及密碼。

發(fā)送郵件代碼如下:

//使用JavaMail發(fā)送郵件的5個(gè)步驟
        //1、創(chuàng)建session
         Session session = Session.getInstance(prop);
         //開啟Session的debug模式,這樣就可以查看到程序發(fā)送Email的運(yùn)行狀態(tài)
         session.setDebug(true);
         //2、通過session得到transport對(duì)象
         Transport ts = session.getTransport();
         //3、使用郵箱的用戶名和密碼連上郵件服務(wù)器,發(fā)送郵件時(shí),發(fā)件人需要提交郵箱的用戶名和密碼給smtp服務(wù)器,用戶名和密碼都通過驗(yàn)證之后才能夠正常發(fā)送郵件給收件人。
         ts.connect("smtp.sohu.com", "gacl", "郵箱密碼");
         //4、創(chuàng)建郵件
         Message message = createSimpleMail(session);
         //5、發(fā)送郵件
         ts.sendMessage(message, message.getAllRecipients());
         //關(guān)閉連接
         ts.close();

總結(jié)發(fā)送郵件過程主要有以下幾個(gè)步驟:

1.創(chuàng)建包含郵件服務(wù)器的網(wǎng)絡(luò)鏈接的Session對(duì)象
2.創(chuàng)建代表郵件內(nèi)容的Message對(duì)象
3.創(chuàng)建Transport對(duì)象
4.鏈接服務(wù)器
5.發(fā)送Message
6.關(guān)閉鏈接

由于Transport只是一個(gè)抽象類,所以這里在發(fā)送Message的時(shí)候用調(diào)用的方法ts.sendMessage實(shí)際上是調(diào)用的Transport的實(shí)現(xiàn)類SMTPTransport的sendMessage方法。

而SMTPTransport的sendMessage方法則依賴SMTP協(xié)議進(jìn)行郵件的發(fā)送。

所以,當(dāng)javamail使用smtp服務(wù)發(fā)送郵件時(shí),當(dāng)你把郵件發(fā)送到smtp服務(wù)器的時(shí)候,你只能得到已經(jīng)發(fā)送到smtp的隊(duì)列中的狀態(tài),但是郵件服務(wù)器是否能發(fā)送成功,你是得不到的。就是說,你不能保證郵件發(fā)送一定成功。 這就取決于SMTP協(xié)議的內(nèi)容傳輸了。

但是SMTP協(xié)議如果傳輸失敗,是會(huì)報(bào)錯(cuò)的。SMTP由TCP提供的可靠的數(shù)據(jù)傳輸服務(wù)把郵件消息從發(fā)信人的郵件服務(wù)器傳送到收信人的郵件服務(wù)器。

所以我們可以認(rèn)為當(dāng)我們調(diào)用JavaMail發(fā)送郵件時(shí),如果程序沒有報(bào)錯(cuò)則表示郵件發(fā)送成功。

SMTP工作機(jī)制

SMTP通常有兩種工作模式:發(fā)送SMTP和接收SMTP。

具體工作方式為:發(fā)送SMTP在接到用戶的郵件請(qǐng)求后,判斷此郵件是否為本地郵件,若是直接投送到用戶的郵箱,否則向DNS查詢遠(yuǎn)端郵件服務(wù)器的 MX紀(jì)錄,并建立與遠(yuǎn)端接收SMTP之間的一個(gè)雙向傳送通道,此后SMTP命令由發(fā)送SMTP發(fā)出,由接收SMTP接收,而應(yīng)答則反方面?zhèn)魉?。一旦傳送?道建立,SMTP發(fā)送者發(fā)送MAIL命令指明郵件發(fā)送者。如果SMTP接收者可以接收郵件則返回OK應(yīng)答。SMTP發(fā)送者再發(fā)出RCPT命令確認(rèn)郵件是否 接收到。如果SMTP接收者接收,則返回OK應(yīng)答;如果不能接收到,則發(fā)出拒絕接收應(yīng)答(但不中止整個(gè)郵件操作),雙方將如此重復(fù)多次。當(dāng)接收者收到全部 郵件后會(huì)接收到特別的序列,如果接收者成功處理了郵件,則返回OK應(yīng)答即可。

SMTP工作過程

簡單郵件傳輸協(xié)議(SMTP)是一種基于文本的電子郵件傳輸協(xié)議,是在因特網(wǎng)中用于在郵件服務(wù)器之間交換郵件的協(xié)議。SMTP是應(yīng)用層的服務(wù),可以適應(yīng)于各種網(wǎng)絡(luò)系統(tǒng)。

SMTP的命令和響應(yīng)都是基于文本,以命令行為單位,換行符為CR/LF。響應(yīng)信息一般只有一行,由一個(gè)3位數(shù)的代碼開始,后面可附上很簡短的文字說明。

SMTP要經(jīng)過建立連接、傳送郵件和釋放連接3個(gè)階段。具體為:

(1)建立TCP連接。
(2)客戶端向服務(wù)器發(fā)送HELO命令以標(biāo)識(shí)發(fā)件人自己的身份,然后客戶端發(fā)送MAIL命令。
(3)服務(wù)器端以O(shè)K作為響應(yīng),表示準(zhǔn)備接收。
(4)客戶端發(fā)送RCPT命令。
(5)服務(wù)器端表示是否愿意為收件人接收郵件。
(6)協(xié)商結(jié)束,發(fā)送郵件,用命令DATA發(fā)送輸入內(nèi)容。
(7)結(jié)束此次發(fā)送,用QUIT命令退出。

SMTP服務(wù)器基于DNS中的郵件交換(MX)記錄路由電子郵件。電子郵件系統(tǒng)發(fā)郵件時(shí)是根據(jù)收信人的地址后綴來定位郵件服務(wù)器的。SMTP通過用戶代理程序(UA)完成郵件的編輯、收取和閱讀等功能;通過郵件傳輸代理程序(MTA)將郵件傳送到目的地。

關(guān)于JavaMail 保證郵件發(fā)送成功的方法是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

本文名稱:JavaMail保證郵件發(fā)送成功的方法是什么
當(dāng)前網(wǎng)址:http://bm7419.com/article22/ijhjjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT企業(yè)建站、建站公司、搜索引擎優(yōu)化、微信公眾號(hào)、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化