SmtpClient 身份验证失败(authentication failed) 的原因分析
最近,收到幾位網(wǎng)友的咨詢,都說使用 SmtpClient 通過 139,189,qq 郵箱的SMTP服務(wù),發(fā)送郵件時(shí),都不成功,返回的錯(cuò)誤是 “身份驗(yàn)證失敗”,而同樣的情況,使用outlook express, foxmail 則可以正常發(fā)送。
為了搞清原因,我自己測試了一把,問題確實(shí)如此。
據(jù)此,可以判斷,問題應(yīng)該是出在 SmtpClient 本身了。而且,既然是 “身份驗(yàn)證失敗” 的錯(cuò)誤,那就應(yīng)該出在 身份驗(yàn)證的環(huán)節(jié)了。為了徹底搞清楚這個(gè)問題, 我使用了抓取網(wǎng)絡(luò)封包的方法, 分別獲取了使用 outlook express 和 SmtpClient發(fā)送郵件時(shí),各自的交互情況,抓包工具,使用的是大名鼎鼎的 Wireshark,此工具的使用,我就不做說明了,有興趣的朋友自己去官方網(wǎng)站看吧。
下面的2附圖,是2個(gè)過程的抓包情況:
?
?
下面,我們來對(duì)比分析,為什么 SmtpClient 會(huì)失敗。
對(duì)于圖一(outlook) 的情況,我們看到第 8 行,是 Authentication successful ,說明是認(rèn)證成功的。
兩幅圖上的 第 3 行, 我標(biāo)記了一個(gè) 紅色的圓圈,這句就是認(rèn)證開始的過程,下面把2種情況的認(rèn)證過程都列出來:
(一) outlook express 的情況
| 行號(hào) | 發(fā)送方 | 命令 |
| 3 | outlook express | AUTH LOGIN |
| 4 | SMTP服務(wù)器 | 334 VXNlcm5hbwu6 (命令的含義是 user) |
| 5 | outlook express | 隱藏部分,內(nèi)容是 郵箱帳戶的base64編碼 |
| 6 | SMTP服務(wù)器 | 334 UGFzc3dvcmQ6 (命令的含義是 password) |
| 7 | outlook express | 隱藏部分,內(nèi)容是 郵箱密碼的base64編碼 |
| 8 | SMTP | 235 Authentication successful 認(rèn)證成功,下面就是發(fā)送郵件的內(nèi)容了 |
(二) smtpclient 的情況
| 行號(hào) | 發(fā)送方 | 命令 |
| 3 | smtpclient | AUTH login 隱藏部分(內(nèi)容是 郵箱帳號(hào)的 base64編碼) |
| 4 | SMTP服務(wù)器 | 334 VXNlcm5hbwu6 (命令的含義是 user) |
| 5 | smtpclient | 隱藏部分,內(nèi)容是郵箱密碼的base64編碼,而此處實(shí)際需要的是郵箱帳號(hào)的base64編碼 |
| 6 | SMTP服務(wù)器 | 334 UGFzc3dvcmQ6 (命令的含義是 password) |
| 7 | smtpclient | 因?yàn)閟mtpclient的認(rèn)證過程已經(jīng)結(jié)束了,但是卻收到了SMTP服務(wù)器的password指令,所以smtpclient就認(rèn)為是認(rèn)證失敗了 |
通過上面的對(duì)比,我們可以很清楚的發(fā)現(xiàn),smtpclient 在發(fā)送 AUTH LOGIN 命令的同時(shí),把 郵箱帳號(hào) 也一起發(fā)送了過去。通常情況下,SMTP服務(wù)器是可以正確處理這個(gè)命令的,這樣就順利完成了對(duì)應(yīng)于 outlook express 的行 3,4,5;然而,139,189和QQ的郵箱SMTP服務(wù)器,并不能正確識(shí)別這個(gè)命令,而是將 AUTH LOGIN 后面的內(nèi)容丟棄了,從而造成了命令對(duì)應(yīng)的錯(cuò)位,這也就是導(dǎo)致smtpclient認(rèn)證失敗的關(guān)鍵。
.NET 中的 SmtpClient 的認(rèn)證方式,為什么不采用 outlook express 的方式,而采用了這種貌似簡潔的方式,究其原因,就不得而知了(莫非是Microsoft的開發(fā)人員為了偷懶? )
?
園子里,有不少M(fèi)VP和其他的牛人,希望能給個(gè)幫助,或者能跟微軟的人員提一下這個(gè)問題,嘿嘿
轉(zhuǎn)載于:https://www.cnblogs.com/sjcatsoft/archive/2009/06/06/1497772.html
總結(jié)
以上是生活随笔為你收集整理的SmtpClient 身份验证失败(authentication failed) 的原因分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Crypto API 学习笔记一
- 下一篇: [转]Oracle update用例