最近,收到几位网友的咨询,都说使用 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和其他的牛人,希望能给个帮助,或者能跟微软的人员提一下这个问题,嘿嘿
分享到:
相关推荐
SMTPCLIENT应用
This is a simple smtp client example.
本例是简单的使用MS C# 封装的smtpClient发送邮件 程序中采用异步发送的方式 在发送过程中给予用户发送状态的提示
C#通过SmtpClient实现后台发送邮件
邮件发送客户端,适合嵌入式,smtpclient
SMTP协议发送电子邮件,QT实现,QT5测试通过
Qt的SMTP客户端(C ++)-版本1.1 Qt的SmtpClient是为Qt 4(C ++版本)编写的小型库,该库允许应用程序使用简单邮件传输协议(SMTP)发送复杂的电子邮件(纯文本,html,附件,内联文件等)。1.1版的新功能: 现在...
C#实现简单的SmtpClient发送邮件
关于SMTP 的协议发包的简单实现,主要使用socket和发件服务器的连接,通信来完成
测试发送QQ邮件、163邮件。 smtpClient类:允许应用程序使用简单邮件传输协议 (SMTP) 发送电子邮件。...NetworkCredential类:为基于密码的身份验证方案(如基本、简要、NTLM 和 Kerberos 身份验证)提供凭据。
源代码里有详细的注释,本人已经亲自测试过程序,如有其它的建议,还请多多赐教!
在ASP.NET中使用SmtpClient发送邮件
本来想试试用SmtpClient来做一个简单的发送邮件的Demo程序。却不想在中途遇上了意料之外的事情,使得这次试验过程变得有些曲折。
163邮箱使用SmtpClient发送带附件和正文图片的邮件,本地测试正常,发布到服务器需要修改server(smtp.163.com)
c编程,写了一个SmtpClient用来发送邮件。 用于将电子邮件发送到 SMTP 服务器以便传递
这是一个smtp 客户端程序,源码发行版,可直接运行,内部注释一般,还有待改进
基于SMTP的邮件客户端
VC2019 采用SMTP协议 + POP协议 ,接收和发送邮件的MFC程序 , 支持163\126\QQ邮箱
龙卷风-smtpclient 非阻塞 smtp 客户端与 Tornado Web 框架 4.0 及更高版本一起使用 这个库是 Python smtplib 到 tornado 非阻塞 IOstream 实现的一个端口。 从 0.1.4 版本开始,包名称已更改为 tornado_smtpclient...
最新版本的SMTPClient需要Julia 1.3或更高版本。 此软件包的版本可能适用于Julia的较早版本,但不完全受支持。 安装 Pkg . add ( " SMTPClient " ) LibCURL本机库是使用Julia的工件系统自动安装的。 用法 using ...