摘要:網(wǎng)上也有不少人反饋用手機客戶端無法使用新浪郵箱發(fā)送郵件,隨后我嘗試用登錄新浪郵箱,也出現(xiàn)只能接收郵件而不能發(fā)送郵件的情況。三附錄錯誤碼及建議解決方法發(fā)送郵件成功卻收不到郵件或收到郵件無主題無收件人亂碼新浪郵箱誠信平臺
前言
??JavaMail的使用本身并不難,網(wǎng)上有不少案例,簡單易懂,而且有詳細的中文注解。但是由于JavaMail的機制設(shè)置不夠完善,特別是異常出錯時的參考信息太少,給初學(xué)者造成了不少麻煩,而我就是其中之一。在此,把我遇到過得那些坑總結(jié)出來,以免大家重蹈覆轍,浪費時間。(注:后續(xù)還有遇到新的問題,我會持續(xù)更新到這里)
一、JavaMail概述??JavaMail是由Sun定義的一套收發(fā)電子郵件的API,不同的廠商可以提供自己的實現(xiàn)類。但它并沒有包含在JDK中,而是作為JavaEE的一部分。
??廠商所提供的JavaMail服務(wù)程序可以有選擇地實現(xiàn)某些郵件協(xié)議,常見的郵件協(xié)議包括:
SMTP:簡單郵件傳輸協(xié)議,用于發(fā)送電子郵件的傳輸協(xié)議;
POP3:用于接收電子郵件的標準協(xié)議;
IMAP:互聯(lián)網(wǎng)消息協(xié)議,是POP3的替代協(xié)議。
??這三種協(xié)議都有對應(yīng)SSL加密傳輸?shù)膮f(xié)議,分別是SMTPS,POP3S和IMAPS。除JavaMail服務(wù)提供程序之外,JavaMail還需要JAF(JavaBeans Activation Framework)來處理不是純文本的郵件內(nèi)容,這包括MIME(多用途互聯(lián)網(wǎng)郵件擴展)、URL頁面和文件附件等內(nèi)容。下圖描述了JavaMail的體系結(jié)構(gòu)。
(圖片來源:http://blog.csdn.net/t12x3456...)
mail.jar:此JAR文件包含JavaMail API和Sun提供的SMTP、IMAP和POP3服務(wù)提供程序;
activation.jar:此JAR文件包含JAF API和Sun的實現(xiàn)。
(有關(guān)JavaMail的介紹我只摘要部分,詳細介紹請參考:http://blog.csdn.net/zapldy/a...)
二、各種問題及分析說明??后面列舉出來的報錯信息需要開啟Session的debug模式,具體配置方式如下:
Session sendMailSession = Session.getInstance(pro, authenticator); sendMailSession.setDebug(true);1、后臺顯示郵件發(fā)送成功但未收到郵件 問題現(xiàn)象
??使用新浪郵箱發(fā)送郵件,嘗試兩種郵件發(fā)送方式,分別是“A@sina .cn發(fā)送給A@sina .cn”和“A@sina .cn發(fā)送給B@sina .cn”,摘要部分后臺打印信息:
250 ok queue id 355937395546 QUIT 221 smtp-5-121.smtpsmail.fmail.xd.sinanode.com Sent message ***@sina.cn successfully....
??使用163郵箱發(fā)送郵件,嘗試C@126.com發(fā)送給A@sina .cn,摘要部分后臺打印信息:
250 Mail OK queued as smtp7,C8CowADnDNooqmNYHWsYGw--.30359S3 1482926655 QUIT 221 Bye Sent message ***@sina.cn successfully....
??登錄新浪郵箱確認有smtp服務(wù)且處于開通狀態(tài),也嘗試重新開啟smtp服務(wù),仍然郵件發(fā)送不成功。網(wǎng)上也有不少人反饋用手機客戶端無法使用新浪郵箱發(fā)送郵件,隨后我嘗試用foxmail登錄新浪郵箱,也出現(xiàn)只能接收郵件而不能發(fā)送郵件的情況。
問題分析??基本確定是新浪郵箱問題,至于是smtp服務(wù)問題,還是做什么限制就不清楚了。好像平時也沒多少人用新浪郵箱發(fā)郵件,通過網(wǎng)頁登錄也是能發(fā)郵件的,湊合能用,畢竟是免費郵箱嘛。
??這是用JavaMail發(fā)送郵件遭遇的第一個問題,案例都是參考別人原封不動拿過來用的,卻發(fā)了收不到郵件。換了幾個參考案例,問題現(xiàn)象相同。我開始懷疑別人給的案例代碼問題,畢竟堂堂的新浪郵箱還不至于這么不靠譜。然后,就是基于這樣的判斷,我就吃了大虧,一直在分析代碼和配置方式,也在各大論壇搜“發(fā)送郵件成功卻收不到郵件”,發(fā)現(xiàn)出現(xiàn)問題的不在少數(shù),而且多半給出的建議是檢查代碼有沒有問題,然后提問的人也沒了回復(fù)下文,這就導(dǎo)致了很大的誤導(dǎo)性。這正是因為這個原因,我也白白地耗了好幾天時間,直到最后發(fā)現(xiàn)原來原因是這么簡單...有時別人的解答能夠事半功倍,但是這種依賴性還是不靠譜的,有時自己的排錯思路更重要。
2、向新浪郵箱發(fā)信被退信 問題現(xiàn)象??平時開發(fā)測試,不想用私人常用郵箱,于是注冊了搜狐郵箱,并嘗試向新浪郵箱發(fā)送郵件,不過很快搜狐郵箱收到退信(這種情況JavaMail是不會提示判斷信息的),退信內(nèi)容如下:
問題分析
??通過訪問退信信息里面的鏈接(新浪郵箱誠信平臺),基本確定搜狐郵箱服務(wù)器被拉黑了。當然,不是被新浪拉黑,而是進了RBL黑名單,新浪參考其數(shù)據(jù)進行了屏蔽。這個已經(jīng)超出了個人能力范圍,果斷放棄新浪郵箱,改向其他郵箱發(fā)送。
【RBL黑名單】
RBL是英文Realtime Blackhole
List的縮寫,即實時黑名單列表。在該列表中的IP地址對外發(fā)布過垃圾郵件。是由第三方的反垃圾郵件組織提供的檢查垃圾郵件發(fā)送者地址的服務(wù)。
【查詢網(wǎng)站】
3、向163郵箱發(fā)信未收到且也無未退信 問題現(xiàn)象MXToolBox:http://mxtoolbox.com/
BlackListAlert:http://www.blacklistalert.org/
??通過搜狐郵箱向新浪郵箱發(fā)信遭遇退信后,我嘗試自己發(fā)給自己,正常收到郵件。考慮模擬測試要盡量真實,我改向163郵箱發(fā)信,結(jié)果出現(xiàn)后臺顯示發(fā)信成功,163郵箱卻沒收到郵件,但本地郵箱并沒收到退信通知。
問題分析??這說明“后臺顯示郵件發(fā)送成功但未收到郵件”的情況,原因還是多種多樣的,不僅可能發(fā)件服務(wù)器有問題,還可能是收件服務(wù)器的問題。收件服務(wù)器有的給你退信,有的還收了直接丟棄,真是什么奇葩情況都有,多加注意吧。
4、jar包重疊存在javax.mail.* 問題現(xiàn)象??從Oracle官網(wǎng)下載下來JavaMail相關(guān)jar包是mail.jar,導(dǎo)入進去測試后報各種奇葩錯誤。下面的異常信息是在項目中已有g(shù)eronimo-javamail_1.4_spec-1.3.jar的情況下導(dǎo)入mail.jar后報出來的:
com.sun.mail.smtp.SMTPSendFailedException: 530 Authentication required at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388) at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959) at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)
??不仔細看還以為是賬號或密碼填錯了,其實只要把geronimo-javamail_1.4_spec-1.3.jar剔除,重新發(fā)郵件就正常了。
問題分析??上面只是我貼出來的報錯情況之一,這些報錯是不一定能夠復(fù)現(xiàn),因為導(dǎo)包就存在問題,重疊存在javax.mail.*。我是在出現(xiàn)第一個問題(“后臺顯示郵件發(fā)送成功但未收到郵件”)的時候,在網(wǎng)上看到別人說的這種情況(javaMail發(fā)送郵件成功卻收不到郵件或收到郵件無主題無收件人亂碼),而后我就開始逐個排查定位,目前通過我所知道的情況來看,重疊存在javax.mail.*的jar有mail.jar、geronimo-javamail_1.4_spec-1.x.jar、mailapi.jar和javaee.jar。
??排查的方法也很簡單,比如打開javax.mail.Session,然后定位它所在的jar,剔除后再找下一個jar包。
??在jar包正常且配置正確的情況下,我也遇到過不少報錯情況。出現(xiàn)的情況基本是前幾次發(fā)郵件都正常,然后再發(fā)一次又突然出現(xiàn)報錯,再試一次問題又不復(fù)現(xiàn),貼出幾種報錯信息如下:
(報錯1)
DEBUG SMTP: Sending failed because of invalid destination addresses RSET DEBUG SMTP: MessagingException while sending, THROW: javax.mail.SendFailedException: Invalid Addresses; nested exception is: com.sun.mail.smtp.SMTPAddressFailedException: 554 5.7.1 <*@163.com>: Relay access denied at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1862) at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1118)
(報錯2)
Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not convert socket to TLS; nested exception is: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed
(報錯3)
javax.mail.SendFailedException: Send failure (javax.mail.MessagingException: Could not connect to SMTP host: smtp.sohu.com, port: 25 (java.net.ConnectException: Connection timed out: connect)) at javax.mail.Transport.send(Transport.java:163) at javax.mail.Transport.send(Transport.java:48) at javamail.EmailSender.sendMail(EmailSender.java:91) at javamail.EmailSender.main(EmailSender.java:64)
(報錯4)
250-zw_71_47 250-AUTH PLAIN LOGIN 250 STARTTLS DEBUG SMTP: Found extension "AUTH", arg "PLAIN LOGIN" DEBUG SMTP: Found extension "STARTTLS", arg "" DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM DEBUG SMTP: AUTH LOGIN command trace suppressed問題分析
??因為這些報錯不具有可復(fù)現(xiàn)性,測試過程中我也司空見慣,當然90%以上的情況郵件發(fā)送都是正常,代碼方面也是綜合了多個案例提煉出來的,而且代碼大同小異,也看過官方提供的樣例,配置內(nèi)容都差不多,代碼問題可能性較小,也不排除smtp服務(wù)器抽風(fēng)了,目前我暫時忽略。
??當然,如果有分析出是代碼問題,也歡迎留言告知分享。(注:后面文章我會將我的代碼粘貼出來共享)
??我將JavaMail代碼在外網(wǎng)測試郵件發(fā)送成功時,后臺打印信息結(jié)尾內(nèi)容基本如下:
250 Mail OK queued as smtp7,C8CowADnDNooqmNYHWsYGw--.30359S3 1482926655 QUIT 221 Bye
??當我將JavaMail代碼移植到內(nèi)部環(huán)境測試郵件發(fā)送成功時,后臺打印信息結(jié)尾內(nèi)容如下:
250 Message accepted for delivery QUIT 221 srv201.mail.*.* SMTP Service closing transmission channel問題分析
??通過上網(wǎng)查詢資料得知,250和221這樣的編碼實際是smtp交互的消息編碼,其中221代表郵件會話即將結(jié)束,這意味著所有消息都已被處理。編碼后面的信息“srv201.mail.. SMTP Service closing transmission channel”和“Bye”的意思類似,可以忽略具體內(nèi)容,知道221代表郵件發(fā)送正常即可。
221 | The server is closing its transmission channel. It can come with side messages like "Goodbye" or "Closing connection". | The mailing session is going to end, which simply means that all messages have been processed. |
---|
1、SMTP錯誤碼及建議解決方法
2、SMTP errors and reply codes
3、javaMail發(fā)送郵件成功卻收不到郵件或收到郵件無主題無收件人亂碼
4、新浪郵箱誠信平臺
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66452.html
摘要:代碼測試過程出現(xiàn)的問題,請參看郵件發(fā)送成功但未收到郵件的問題及解決辦法和使用發(fā)送郵件的有關(guān)說明分析解決。類電子郵件發(fā)送器,包含各種郵件發(fā)送方法,如文本形式形式和含附件形式等。 前言 ??關(guān)于JavaMail發(fā)送郵件的代碼,網(wǎng)上隨便搜搜就可以找到,但是要么寫得簡單且沒有注釋解釋,要么寫得復(fù)雜又非常雜亂。由于項目需要,花了一段時間搜集網(wǎng)上各類案例,熟悉JavaMail郵件發(fā)送涉及的配置,取...
摘要:時間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。用戶過生日,系統(tǒng)發(fā)送生日祝福郵件。將最新活動和優(yōu)惠以郵件的形式告知會員。通常把處理用戶請求郵件發(fā)送請求的郵件服務(wù)器稱為服務(wù)器。提供了加密的協(xié)議被稱為。 時間:2017年06月07日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:無個人學(xué)習(xí)源碼:https://github.com/zcc...
摘要:它是發(fā)布的用來處理的。入門第一篇郵件簡介及概述摘自入門第二篇創(chuàng)建郵件摘自入門第三篇發(fā)送郵件摘自入門第四篇接收郵件摘自入門第五篇解析郵件摘自第二講使用表示消息常用郵箱的地址及對應(yīng)的端口 JavaMail,顧名思義,提供給開發(fā)者處理電子郵件相關(guān)的編程接口。它是Sun發(fā)布的用來處理email的API。它可以方便地執(zhí)行一些常用的郵件傳輸。JavaMail API是Sun公司為方便Java開發(fā)人...
摘要:在業(yè)務(wù)過程系統(tǒng)中集成郵件服務(wù)功能發(fā)送郵件收取郵件刪除郵件收到郵件時執(zhí)行操作安裝要求對于嵌入式過程引擎添加作為應(yīng)用程序依賴如果使用需要添加如下依賴到文件中對于共享過程引擎添加到服務(wù)器的目錄中比如還要保證包括下面的依賴 https://github.com/camunda/ca... 在業(yè)務(wù)過程系統(tǒng)中集成郵件服務(wù). showImg(https://segmentfault.com/img/...
閱讀 2212·2021-09-30 09:47
閱讀 960·2021-08-27 13:01
閱讀 2959·2019-08-30 15:54
閱讀 3685·2019-08-30 15:53
閱讀 825·2019-08-29 14:07
閱讀 711·2019-08-28 18:16
閱讀 795·2019-08-26 18:37
閱讀 1406·2019-08-26 13:27