您的位置:首页 > 大数据 > 人工智能

SmtpClient 身份验证失败(authentication failed) 的原因分析

2010-08-05 22:14 281 查看
使用 SmtpClient 通过 139,189,qq 邮箱的SMTP服务,发送邮件时,都不成功,返回的错误是 “身份验证失败”,而同样的情况,使用outlook express, foxmail 则可以正常发送。

为了搞清原因,我自己测试了一把,问题确实如此。

据此,可以判断,问题应该是出在 SmtpClient 本身了。而且,既然是 “身份验证失败” 的错误,那就应该出在 身份验证的环节了。为了彻底搞清楚这个问题, 我使用了抓取网络封包的方法, 分别获取了使用 outlook express 和 SmtpClient发送邮件时,各自的交互情况,抓包工具,使用的是大名鼎鼎的 Wireshark,此工具的使用,我就不做说明了,有兴趣的朋友自己去官方网站看吧。

下面的2附图,是2个过程的抓包情况:





下面,我们来对比分析,为什么 SmtpClient 会失败。

对于图一(outlook) 的情况,我们看到第 8 行,是 Authentication successful ,说明是认证成功的。

两幅图上的 第 3 行, 我标记了一个 红色的圆圈,这句就是认证开始的过程,下面把2种情况的认证过程都列出来:

(一) outlook express 的情况

行号发送方命令
3outlook expressAUTH LOGIN
4SMTP服务器334 VXNlcm5hbwu6 (命令的含义是 user)
5outlook express隐藏部分,内容是 邮箱帐户的base64编码
6SMTP服务器334 UGFzc3dvcmQ6 (命令的含义是 password)
7outlook express隐藏部分,内容是 邮箱密码的base64编码
8SMTP235 Authentication successful 认证成功,下面就是发送邮件的内容了
(二) smtpclient 的情况

行号发送方命令
3smtpclientAUTH login 隐藏部分(内容是 邮箱帐号的 base64编码)
4SMTP服务器334 VXNlcm5hbwu6 (命令的含义是 user)
5smtpclient隐藏部分,内容是邮箱密码的base64编码,而此处实际需要的是邮箱帐号的base64编码
6SMTP服务器334 UGFzc3dvcmQ6 (命令的含义是 password)
7smtpclient因为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的开发人员为了偷懒?



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: