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

使用JavaMail發(fā)送郵件保證成功的方法

 更新時間:2016年11月23日 10:50:29   投稿:daisy  
JavaMail是利用現有的郵件賬戶發(fā)送郵件的工具,使用過JavaMail的api發(fā)送郵件的人可能會有這樣一個疑惑:我如何知道我調用該api發(fā)送的郵件是否成功呢?那么通過下面這篇文章大家一起來看看使用JavaMail保證郵件發(fā)送成功的方法,有需要的朋友們可以參考借鑒。

前言

相信大家應該都知道,一般的開放的api給我們調用都會有個返回值或者狀態(tài)碼,來告訴我們執(zhí)行成功與否。但是JavaMail卻沒有提供這樣一個返回值。

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

JavaMail發(fā)送郵件原理

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

Properties props = new Properties();
  // 發(fā)送郵件的服務器的IP和端口 
  props.put("mail.smtp.host", MAIL_SMTP_HOST);
  props.put("mail.smtp.port", MAIL_SMTP_PORT);
  // 是否需要身份驗證
  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ā)送服務器的用戶名和密碼 
    return new PasswordAuthentication(MAIL_SENDER_MAIL, MAIL_SENDER_PASS);
   }
  });

分析一下代碼。

在創(chuàng)建Session之前我們先創(chuàng)建一個Properties,這個Properties設置了這樣幾個參數:mail.smtp.hostmail.smtp.port、mail.smtp.authmail.smtp.socketFactory.class。在創(chuàng)建Session的時候還要傳入發(fā)送郵件使用的用戶名及密碼。

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

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

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

     1.創(chuàng)建包含郵件服務器的網絡鏈接的Session對象

     2.創(chuàng)建代表郵件內容的Message對象

     3.創(chuàng)建Transport對象

     4.鏈接服務器

     5.發(fā)送Message

     6.關閉鏈接

由于Transport只是一個抽象類,所以這里在發(fā)送Message的時候用調用的方法ts.sendMessage實際上是調用的Transport的實現類SMTPTransportsendMessage方法。

SMTPTransportsendMessage方法則依賴SMTP協(xié)議進行郵件的發(fā)送。

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

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

所以我們可以認為當我們調用JavaMail發(fā)送郵件時,如果程序沒有報錯則表示郵件發(fā)送成功。

SMTP工作機制

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

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

SMTP工作過程

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

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

SMTP要經過建立連接、傳送郵件和釋放連接3個階段。具體為:

     (1)建立TCP連接。

     (2)客戶端向服務器發(fā)送HELO命令以標識發(fā)件人自己的身份,然后客戶端發(fā)送MAIL命令。

     (3)服務器端以OK作為響應,表示準備接收。

     (4)客戶端發(fā)送RCPT命令。

     (5)服務器端表示是否愿意為收件人接收郵件。

     (6)協(xié)商結束,發(fā)送郵件,用命令DATA發(fā)送輸入內容。

     (7)結束此次發(fā)送,用QUIT命令退出。

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關文章

  • SpringCloud之注冊中心之Nacos負載均衡詳解

    SpringCloud之注冊中心之Nacos負載均衡詳解

    Nacos提供多種負載均衡策略,包括權重、同機房、同地域、同環(huán)境等,服務下線和權重配置可以通過Nacos管理界面進行,同時,Nacos使用Raft算法選舉Leader節(jié)點,若IP地址改變可能會影響Leader選舉,配置同集群優(yōu)先訪問可以提高訪問速度,通過配置集群名稱和負載均衡策略
    2025-03-03
  • Java postgresql數組字段類型處理方法詳解

    Java postgresql數組字段類型處理方法詳解

    這篇文章主要介紹了Java postgresql數組字段類型處理方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • java jdbc連接mysql數據庫實現增刪改查操作

    java jdbc連接mysql數據庫實現增刪改查操作

    這篇文章主要為大家詳細介紹了java jdbc連接mysql數據庫實現增刪改查操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Java使用POI導出大數據量Excel的方法

    Java使用POI導出大數據量Excel的方法

    今天需要寫一個導出的Excel的功能,但是發(fā)現當數據量到3萬條時,列數在23列時,內存溢出,CPU使用100%,測試環(huán)境直接炸掉。小編給大家分享基于java使用POI導出大數據量Excel的方法,感興趣的朋友一起看看吧
    2019-11-11
  • SpringBoot后臺實現文件上傳下載

    SpringBoot后臺實現文件上傳下載

    這篇文章主要為大家詳細介紹了SpringBoot后臺實現文件上傳下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 出現SLF4J:?Failed?to?load?class?“org.slf4j.impl.StaticLoggerBinder“.的解決方法

    出現SLF4J:?Failed?to?load?class?“org.slf4j.impl.StaticLog

    本文主要介紹了出現SLF4J:?Failed?to?load?class?“org.slf4j.impl.StaticLoggerBinder“.的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 解決java數值范圍以及float與double精度丟失的問題

    解決java數值范圍以及float與double精度丟失的問題

    下面小編就為大家?guī)硪黄鉀Qjava數值范圍以及float與double精度丟失的問題。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • MyBatis通用Mapper中的通用example(排序)詳解

    MyBatis通用Mapper中的通用example(排序)詳解

    這篇文章主要介紹了MyBatis通用Mapper中的通用example(排序)詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 詳解Spring MVC事務配置

    詳解Spring MVC事務配置

    這篇文章主要介紹了詳解Spring MVC事務配置,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Log4j按級別輸出日志到不同文件的實現方法

    Log4j按級別輸出日志到不同文件的實現方法

    下面小編就為大家?guī)硪黄狶og4j按級別輸出日志到不同文件的實現方法。
    2016-11-11

最新評論

青州市| 桑日县| 孝义市| 安吉县| 修文县| 大荔县| 宽甸| 峨山| 门头沟区| 同仁县| 平塘县| 贵州省| 五大连池市| 民和| 剑河县| 荔波县| 金山区| 天峻县| 钟祥市| 澄城县| 鄂州市| 镇沅| 宜丰县| 珲春市| 尼木县| 崇明县| 仁寿县| 华亭县| 余江县| 祁东县| 海晏县| 塘沽区| 五常市| 卢湾区| 尤溪县| 石渠县| 五常市| 黄骅市| 禄劝| 天气| 乌拉特中旗|