摘要:網(wǎng)上也有不少人反饋用手機(jī)客戶端無(wú)法使用新浪郵箱發(fā)送郵件,隨后我嘗試用登錄新浪郵箱,也出現(xiàn)只能接收郵件而不能發(fā)送郵件的情況。三附錄錯(cuò)誤碼及建議解決方法發(fā)送郵件成功卻收不到郵件或收到郵件無(wú)主題無(wú)收件人亂碼新浪郵箱誠(chéng)信平臺(tái)
前言
??JavaMail的使用本身并不難,網(wǎng)上有不少案例,簡(jiǎn)單易懂,而且有詳細(xì)的中文注解。但是由于JavaMail的機(jī)制設(shè)置不夠完善,特別是異常出錯(cuò)時(shí)的參考信息太少,給初學(xué)者造成了不少麻煩,而我就是其中之一。在此,把我遇到過(guò)得那些坑總結(jié)出來(lái),以免大家重蹈覆轍,浪費(fèi)時(shí)間。(注:后續(xù)還有遇到新的問(wèn)題,我會(huì)持續(xù)更新到這里)
一、JavaMail概述??JavaMail是由Sun定義的一套收發(fā)電子郵件的API,不同的廠商可以提供自己的實(shí)現(xiàn)類。但它并沒有包含在JDK中,而是作為JavaEE的一部分。
??廠商所提供的JavaMail服務(wù)程序可以有選擇地實(shí)現(xiàn)某些郵件協(xié)議,常見的郵件協(xié)議包括:
SMTP:簡(jiǎn)單郵件傳輸協(xié)議,用于發(fā)送電子郵件的傳輸協(xié)議;
POP3:用于接收電子郵件的標(biāo)準(zhǔn)協(xié)議;
IMAP:互聯(lián)網(wǎng)消息協(xié)議,是POP3的替代協(xié)議。
??這三種協(xié)議都有對(duì)應(yīng)SSL加密傳輸?shù)膮f(xié)議,分別是SMTPS,POP3S和IMAPS。除JavaMail服務(wù)提供程序之外,JavaMail還需要JAF(JavaBeans Activation Framework)來(lái)處理不是純文本的郵件內(nèi)容,這包括MIME(多用途互聯(lián)網(wǎng)郵件擴(kuò)展)、URL頁(yè)面和文件附件等內(nèi)容。下圖描述了JavaMail的體系結(jié)構(gòu)。
(圖片來(lái)源:http://blog.csdn.net/t12x3456...)
mail.jar:此JAR文件包含JavaMail API和Sun提供的SMTP、IMAP和POP3服務(wù)提供程序;
activation.jar:此JAR文件包含JAF API和Sun的實(shí)現(xiàn)。
(有關(guān)JavaMail的介紹我只摘要部分,詳細(xì)介紹請(qǐng)參考:http://blog.csdn.net/zapldy/a...)
二、各種問(wèn)題及分析說(shuō)明??后面列舉出來(lái)的報(bào)錯(cuò)信息需要開啟Session的debug模式,具體配置方式如下:
Session sendMailSession = Session.getInstance(pro, authenticator); sendMailSession.setDebug(true);1、后臺(tái)顯示郵件發(fā)送成功但未收到郵件 問(wèn)題現(xiàn)象
??使用新浪郵箱發(fā)送郵件,嘗試兩種郵件發(fā)送方式,分別是“A@sina .cn發(fā)送給A@sina .cn”和“A@sina .cn發(fā)送給B@sina .cn”,摘要部分后臺(tái)打印信息:
250 ok queue id 355937395546 QUIT 221 smtp-5-121.smtpsmail.fmail.xd.sinanode.com Sent message ***@sina.cn successfully....
??使用163郵箱發(fā)送郵件,嘗試[email protected]發(fā)送給A@sina .cn,摘要部分后臺(tái)打印信息:
250 Mail OK queued as smtp7,C8CowADnDNooqmNYHWsYGw--.30359S3 1482926655 QUIT 221 Bye Sent message ***@sina.cn successfully....
??登錄新浪郵箱確認(rèn)有smtp服務(wù)且處于開通狀態(tài),也嘗試重新開啟smtp服務(wù),仍然郵件發(fā)送不成功。網(wǎng)上也有不少人反饋用手機(jī)客戶端無(wú)法使用新浪郵箱發(fā)送郵件,隨后我嘗試用foxmail登錄新浪郵箱,也出現(xiàn)只能接收郵件而不能發(fā)送郵件的情況。
問(wèn)題分析??基本確定是新浪郵箱問(wèn)題,至于是smtp服務(wù)問(wèn)題,還是做什么限制就不清楚了。好像平時(shí)也沒多少人用新浪郵箱發(fā)郵件,通過(guò)網(wǎng)頁(yè)登錄也是能發(fā)郵件的,湊合能用,畢竟是免費(fèi)郵箱嘛。
??這是用JavaMail發(fā)送郵件遭遇的第一個(gè)問(wèn)題,案例都是參考別人原封不動(dòng)拿過(guò)來(lái)用的,卻發(fā)了收不到郵件。換了幾個(gè)參考案例,問(wèn)題現(xiàn)象相同。我開始懷疑別人給的案例代碼問(wèn)題,畢竟堂堂的新浪郵箱還不至于這么不靠譜。然后,就是基于這樣的判斷,我就吃了大虧,一直在分析代碼和配置方式,也在各大論壇搜“發(fā)送郵件成功卻收不到郵件”,發(fā)現(xiàn)出現(xiàn)問(wèn)題的不在少數(shù),而且多半給出的建議是檢查代碼有沒有問(wèn)題,然后提問(wèn)的人也沒了回復(fù)下文,這就導(dǎo)致了很大的誤導(dǎo)性。這正是因?yàn)檫@個(gè)原因,我也白白地耗了好幾天時(shí)間,直到最后發(fā)現(xiàn)原來(lái)原因是這么簡(jiǎn)單...有時(shí)別人的解答能夠事半功倍,但是這種依賴性還是不靠譜的,有時(shí)自己的排錯(cuò)思路更重要。
2、向新浪郵箱發(fā)信被退信 問(wèn)題現(xiàn)象??平時(shí)開發(fā)測(cè)試,不想用私人常用郵箱,于是注冊(cè)了搜狐郵箱,并嘗試向新浪郵箱發(fā)送郵件,不過(guò)很快搜狐郵箱收到退信(這種情況JavaMail是不會(huì)提示判斷信息的),退信內(nèi)容如下:
問(wèn)題分析
??通過(guò)訪問(wèn)退信信息里面的鏈接(新浪郵箱誠(chéng)信平臺(tái)),基本確定搜狐郵箱服務(wù)器被拉黑了。當(dāng)然,不是被新浪拉黑,而是進(jìn)了RBL黑名單,新浪參考其數(shù)據(jù)進(jìn)行了屏蔽。這個(gè)已經(jīng)超出了個(gè)人能力范圍,果斷放棄新浪郵箱,改向其他郵箱發(fā)送。
【RBL黑名單】
RBL是英文Realtime Blackhole
List的縮寫,即實(shí)時(shí)黑名單列表。在該列表中的IP地址對(duì)外發(fā)布過(guò)垃圾郵件。是由第三方的反垃圾郵件組織提供的檢查垃圾郵件發(fā)送者地址的服務(wù)。
【查詢網(wǎng)站】
3、向163郵箱發(fā)信未收到且也無(wú)未退信 問(wèn)題現(xiàn)象MXToolBox:http://mxtoolbox.com/
BlackListAlert:http://www.blacklistalert.org/
??通過(guò)搜狐郵箱向新浪郵箱發(fā)信遭遇退信后,我嘗試自己發(fā)給自己,正常收到郵件??紤]模擬測(cè)試要盡量真實(shí),我改向163郵箱發(fā)信,結(jié)果出現(xiàn)后臺(tái)顯示發(fā)信成功,163郵箱卻沒收到郵件,但本地郵箱并沒收到退信通知。
問(wèn)題分析??這說(shuō)明“后臺(tái)顯示郵件發(fā)送成功但未收到郵件”的情況,原因還是多種多樣的,不僅可能發(fā)件服務(wù)器有問(wèn)題,還可能是收件服務(wù)器的問(wèn)題。收件服務(wù)器有的給你退信,有的還收了直接丟棄,真是什么奇葩情況都有,多加注意吧。
4、jar包重疊存在javax.mail.* 問(wèn)題現(xiàn)象??從Oracle官網(wǎng)下載下來(lái)JavaMail相關(guān)jar包是mail.jar,導(dǎo)入進(jìn)去測(cè)試后報(bào)各種奇葩錯(cuò)誤。下面的異常信息是在項(xiàng)目中已有g(shù)eronimo-javamail_1.4_spec-1.3.jar的情況下導(dǎo)入mail.jar后報(bào)出來(lái)的:
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)
??不仔細(xì)看還以為是賬號(hào)或密碼填錯(cuò)了,其實(shí)只要把geronimo-javamail_1.4_spec-1.3.jar剔除,重新發(fā)郵件就正常了。
問(wèn)題分析??上面只是我貼出來(lái)的報(bào)錯(cuò)情況之一,這些報(bào)錯(cuò)是不一定能夠復(fù)現(xiàn),因?yàn)閷?dǎo)包就存在問(wèn)題,重疊存在javax.mail.*。我是在出現(xiàn)第一個(gè)問(wèn)題(“后臺(tái)顯示郵件發(fā)送成功但未收到郵件”)的時(shí)候,在網(wǎng)上看到別人說(shuō)的這種情況(javaMail發(fā)送郵件成功卻收不到郵件或收到郵件無(wú)主題無(wú)收件人亂碼),而后我就開始逐個(gè)排查定位,目前通過(guò)我所知道的情況來(lái)看,重疊存在javax.mail.*的jar有mail.jar、geronimo-javamail_1.4_spec-1.x.jar、mailapi.jar和javaee.jar。
??排查的方法也很簡(jiǎn)單,比如打開javax.mail.Session,然后定位它所在的jar,剔除后再找下一個(gè)jar包。
??在jar包正常且配置正確的情況下,我也遇到過(guò)不少報(bào)錯(cuò)情況。出現(xiàn)的情況基本是前幾次發(fā)郵件都正常,然后再發(fā)一次又突然出現(xiàn)報(bào)錯(cuò),再試一次問(wèn)題又不復(fù)現(xiàn),貼出幾種報(bào)錯(cuò)信息如下:
(報(bào)錯(cuò)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)
(報(bào)錯(cuò)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
(報(bào)錯(cuò)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)
(報(bào)錯(cuò)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問(wèn)題分析
??因?yàn)檫@些報(bào)錯(cuò)不具有可復(fù)現(xiàn)性,測(cè)試過(guò)程中我也司空見慣,當(dāng)然90%以上的情況郵件發(fā)送都是正常,代碼方面也是綜合了多個(gè)案例提煉出來(lái)的,而且代碼大同小異,也看過(guò)官方提供的樣例,配置內(nèi)容都差不多,代碼問(wèn)題可能性較小,也不排除smtp服務(wù)器抽風(fēng)了,目前我暫時(shí)忽略。
??當(dāng)然,如果有分析出是代碼問(wèn)題,也歡迎留言告知分享。(注:后面文章我會(huì)將我的代碼粘貼出來(lái)共享)
??我將JavaMail代碼在外網(wǎng)測(cè)試郵件發(fā)送成功時(shí),后臺(tái)打印信息結(jié)尾內(nèi)容基本如下:
250 Mail OK queued as smtp7,C8CowADnDNooqmNYHWsYGw--.30359S3 1482926655 QUIT 221 Bye
??當(dāng)我將JavaMail代碼移植到內(nèi)部環(huán)境測(cè)試郵件發(fā)送成功時(shí),后臺(tái)打印信息結(jié)尾內(nèi)容如下:
250 Message accepted for delivery QUIT 221 srv201.mail.*.* SMTP Service closing transmission channel問(wèn)題分析
??通過(guò)上網(wǎng)查詢資料得知,250和221這樣的編碼實(shí)際是smtp交互的消息編碼,其中221代表郵件會(huì)話即將結(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錯(cuò)誤碼及建議解決方法
2、SMTP errors and reply codes
3、javaMail發(fā)送郵件成功卻收不到郵件或收到郵件無(wú)主題無(wú)收件人亂碼
4、新浪郵箱誠(chéng)信平臺(tái)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66452.html
摘要:代碼測(cè)試過(guò)程出現(xiàn)的問(wèn)題,請(qǐng)參看郵件發(fā)送成功但未收到郵件的問(wèn)題及解決辦法和使用發(fā)送郵件的有關(guān)說(shuō)明分析解決。類電子郵件發(fā)送器,包含各種郵件發(fā)送方法,如文本形式形式和含附件形式等。 前言 ??關(guān)于JavaMail發(fā)送郵件的代碼,網(wǎng)上隨便搜搜就可以找到,但是要么寫得簡(jiǎn)單且沒有注釋解釋,要么寫得復(fù)雜又非常雜亂。由于項(xiàng)目需要,花了一段時(shí)間搜集網(wǎng)上各類案例,熟悉JavaMail郵件發(fā)送涉及的配置,取...
摘要:時(shí)間年月日星期三說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。用戶過(guò)生日,系統(tǒng)發(fā)送生日祝福郵件。將最新活動(dòng)和優(yōu)惠以郵件的形式告知會(huì)員。通常把處理用戶請(qǐng)求郵件發(fā)送請(qǐng)求的郵件服務(wù)器稱為服務(wù)器。提供了加密的協(xié)議被稱為。 時(shí)間:2017年06月07日星期三說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:無(wú)個(gè)人學(xué)習(xí)源碼:https://github.com/zcc...
摘要:它是發(fā)布的用來(lái)處理的。入門第一篇郵件簡(jiǎn)介及概述摘自入門第二篇?jiǎng)?chuàng)建郵件摘自入門第三篇發(fā)送郵件摘自入門第四篇接收郵件摘自入門第五篇解析郵件摘自第二講使用表示消息常用郵箱的地址及對(duì)應(yīng)的端口 JavaMail,顧名思義,提供給開發(fā)者處理電子郵件相關(guān)的編程接口。它是Sun發(fā)布的用來(lái)處理email的API。它可以方便地執(zhí)行一些常用的郵件傳輸。JavaMail API是Sun公司為方便Java開發(fā)人...
摘要:在業(yè)務(wù)過(guò)程系統(tǒng)中集成郵件服務(wù)功能發(fā)送郵件收取郵件刪除郵件收到郵件時(shí)執(zhí)行操作安裝要求對(duì)于嵌入式過(guò)程引擎添加作為應(yīng)用程序依賴如果使用需要添加如下依賴到文件中對(duì)于共享過(guò)程引擎添加到服務(wù)器的目錄中比如還要保證包括下面的依賴 https://github.com/camunda/ca... 在業(yè)務(wù)過(guò)程系統(tǒng)中集成郵件服務(wù). showImg(https://segmentfault.com/img/...
閱讀 2243·2021-09-30 09:47
閱讀 1017·2021-08-27 13:01
閱讀 2984·2019-08-30 15:54
閱讀 3711·2019-08-30 15:53
閱讀 852·2019-08-29 14:07
閱讀 747·2019-08-28 18:16
閱讀 836·2019-08-26 18:37
閱讀 1443·2019-08-26 13:27