SmtpClient 身份验证失败(authentication failed) 的原因分析
2009-06-06 19:25
459 查看
最近,收到几位网友的咨询,都说使用 SmtpClient 通过 139,189,qq 邮箱的SMTP服务,发送邮件时,都不成功,返回的错误是 “身份验证失败”,而同样的情况,使用outlook express, foxmail 则可以正常发送。
为了搞清原因,我自己测试了一把,问题确实如此。
据此,可以判断,问题应该是出在 SmtpClient 本身了。而且,既然是 “身份验证失败” 的错误,那就应该出在 身份验证的环节了。为了彻底搞清楚这个问题, 我使用了抓取网络封包的方法, 分别获取了使用 outlook express 和 SmtpClient发送邮件时,各自的交互情况,抓包工具,使用的是大名鼎鼎的 Wireshark,此工具的使用,我就不做说明了,有兴趣的朋友自己去官方网站看吧。
下面的2附图,是2个过程的抓包情况:
下面,我们来对比分析,为什么 SmtpClient 会失败。
对于图一(outlook) 的情况,我们看到第 8 行,是 Authentication successful ,说明是认证成功的。
两幅图上的 第 3 行, 我标记了一个 红色的圆圈,这句就是认证开始的过程,下面把2种情况的认证过程都列出来:
(一) outlook express 的情况
(二) smtpclient 的情况
通过上面的对比,我们可以很清楚的发现,smtpclient 在发送 AUTH LOGIN 命令的同时,把 邮箱帐号 也一起发送了过去。通常情况下,SMTP服务器是可以正确处理这个命令的,这样就顺利完成了对应于 outlook express 的行 3,4,5;然而,139,189和QQ的邮箱SMTP服务器,并不能正确识别这个命令,而是将 AUTH LOGIN 后面的内容丢弃了,从而造成了命令对应的错位,这也就是导致smtpclient认证失败的关键。
.NET 中的 SmtpClient 的认证方式,为什么不采用 outlook express 的方式,而采用了这种貌似简洁的方式,究其原因,就不得而知了(莫非是Microsoft的开发人员为了偷懒?
)
园子里,有不少MVP和其他的牛人,希望能给个帮助,或者能跟微软的人员提一下这个问题,嘿嘿
为了搞清原因,我自己测试了一把,问题确实如此。
据此,可以判断,问题应该是出在 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 认证成功,下面就是发送邮件的内容了 |
行号 | 发送方 | 命令 |
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就认为是认证失败了 |
.NET 中的 SmtpClient 的认证方式,为什么不采用 outlook express 的方式,而采用了这种貌似简洁的方式,究其原因,就不得而知了(莫非是Microsoft的开发人员为了偷懒?
)
园子里,有不少MVP和其他的牛人,希望能给个帮助,或者能跟微软的人员提一下这个问题,嘿嘿
相关文章推荐
- SmtpClient 身份验证失败(authentication failed) 的原因分析
- windows 8上使用SmtpClient.Send()发送邮件失败的原因分析。
- VMware View Client 连接服务器,提示身份验证失败,连接服务器时
- 在设置iis windows身份验证,出错:登录失败:用户帐户限制。可能的原因包括不允许空密码登录时间限制或强制的策略限制。
- 启用和分析Exchange SMTP身份验证记录(收藏)
- 启用和分析Exchange SMTP身份验证记录
- linux ssl 验证失败的原因分析和解决办法
- postfix client 端强制勾选“SMTP发送服务器需身份验证”
- Linux suse x86_64 环境上部署Hadoop启动失败原因分析
- Android与IIS身份验证——基本验证_HttpClient Http请求 验证
- ASP.NET 日期数据服务端验证失败的原因
- Wince启动失败原因分析
- sql server 2005之”SQL server 身份验证“方式登录失败
- dpdk组态 千兆网卡 驱动 失败 原因分析及 解决方案
- ROS HTB限速失败原因分析和需注意事项
- dpdk配置 万兆网卡 驱动 失败的 原因分析及 解决办法
- 关于 submit 按钮的 onclick 验证事件,第一次验证失败,第二次 submit 按钮失效的原因解析
- ubuntu16.04下vim安装失败的原因分析及解决方案
- 数据库连接失败的原因分析及解决办法
- SMTP 服务器要求安全连接或客户端未通过身份验证的各个解决方案(C#)