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