`
zu14
  • 浏览: 459072 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类

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

阅读更多

最近,收到几位网友的咨询,都说使用 SmtpClient 通过 139,189,qq 邮箱的SMTP服务,发送邮件时,都不成功,返回的错误是 “身份验证失败”,而同样的情况,使用outlook express, foxmail 则可以正常发送。

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

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

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

 outlook

 smtpclient

下面,我们来对比分析,为什么 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

    2. **身份验证**:SMTPCLIENT支持多种身份验证方式,如无认证(不推荐,因为安全性低)、PLAIN、LOGIN和AUTH XOAUTH2等。其中,AUTH XOAUTH2是Google推荐的,它使用OAuth 2.0令牌进行授权,增强了安全性。 3. **SSL...

    smtpclient

    3. **身份验证**:如果服务器需要,执行AUTH命令进行认证。 4. **发送邮件头**:包括`MAIL FROM:`和一系列`RCPT TO:`命令。 5. **发送邮件内容**:使用`DATA`命令传递邮件的文本部分,包括主题和正文。 6. **结束...

    SmtpClient-for-Qt

    SMTP服务器通常运行在25号端口上,但对于需要身份验证的情况,可能会使用465号端口(SSL/TLS加密)或587号端口(STARTTLS扩展)。 Qt是一个跨平台的应用程序开发框架,广泛应用于GUI(图形用户界面)和非GUI应用...

    SMTPClient异步发送邮件简单示例

    6. **身份验证**:如果SMTP服务器需要身份验证,SMTPClient支持多种认证方式,如Basic、NTLM或Integrated Security。在设置SmtpClient对象时,需要指定UseDefaultCredentials属性或提供NetworkCredential对象。 7. ...

    smtpclient-1.0.1.tar.gz_linux发送邮件_smtp_smtpclient_smtpclient mai

    SMTP(Simple Mail Transfer Protocol)是互联网上用于发送电子邮件的标准协议,而`smtpclient`则是一个实现SMTP协议的客户端工具,适合在嵌入式系统中使用。`smtpclient-1.0.1.tar.gz`是一个针对Linux操作系统的...

    C# 使用SmtpClient类发送电子邮件

    本教程将详细解释如何使用`SmtpClient`类来实现电子邮件的发送,并结合提供的源代码进行分析。 首先,确保在C#项目中引用了`System.Net`和`System.Net.Mail`命名空间。这可以通过在代码文件顶部添加以下引用完成: ...

    SMTPclient 简单实现

    - 发送`HELO/EHLO`命令,可能包括`AUTH`命令进行身份验证。 - 发送`MAIL FROM:`和`RCPT TO:`命令,设置发件人和收件人。 - 使用`DataOutputStream`发送邮件内容,确保每个命令以`\r\n`结尾。 - 发送`QUIT`命令,关闭...

    C++ SMTP协议发送邮件模块(支持身份验证)

    1. `SMTPClient`类:封装了SMTP协议的实现,包含构造函数、连接服务器、发送命令、身份验证、发送邮件和断开连接等方法。 2. 身份验证方法:如`authenticate`,可能根据不同的认证类型(如PLAIN或LOGIN)执行相应的...

    C#通过SmtpClient实现后台发送邮件

    C#通过SmtpClient实现后台发送邮件

    C#实现简单的SmtpClient发送邮件

    通过`SmtpClient`,开发者可以轻松地构造和发送邮件,包括设置邮件内容、附件、收件人以及处理身份验证等。 #### 构造与初始化 初始化`SmtpClient`实例时,通常需要提供SMTP服务器的地址,例如: ```csharp ...

    c#邮箱验证源码

    C#支持多种身份验证机制,如Basic、NTLM或Secure Password Authentication (SPA)。 5. **电子邮件验证**:邮件验证通常指确保电子邮件地址的有效性。这可以通过几种方法实现,比如使用正则表达式检查格式,或者通过...

    使用.NET自带的类库SmtpClient发送邮件

    163邮箱使用SmtpClient发送带附件和正文图片的邮件,本地测试正常,发布到服务器需要修改server(smtp.163.com)

    SmtpClient-for-Qt:用C ++为Qt编写的SMTP客户端。 允许应用程序通过SMTP发送电子邮件(带有文本,html,附件,内联文件等的MIME)。 支持SSL和SMTP身份验证

    Qt的SMTP客户端(C ++)-版本1.1 Qt的SmtpClient是为Qt 4(C ++版本)编写的小型库,该库允许应用程序使用简单邮件传输协议(SMTP)发送复杂的电子邮件(纯文本,html,附件,内联文件等)。1.1版的新功能: 现在...

    使用SmtpClient发送邮件的方法

    在.NET Framework中,`SmtpClient`类是用于发送电子邮件的标准工具。...通过了解SMTP服务器的配置、`SmtpClient`的属性和方法,以及正确处理身份验证,可以有效地解决这些问题,实现稳定可靠的邮件发送功能。

    SMTP封装类 + 身份验证

    3. **身份验证**:SMTP服务器通常需要身份验证,因此类中会有对应的方法进行验证,如`auth()`。常见的验证方式有PLAIN、LOGIN和CRAM-MD5等。 4. **邮件创建与发送**:封装类可能会提供`send_email()`方法,用于构建...

    SMTP-client.rar_SMTP Client_smtpclient翻译

    在"SMTPclient翻译"部分,可能包含了对源代码的中文注释,这有助于非英语背景的开发者理解代码逻辑。不过,描述中提到注释一般,可能意味着注释不够详尽或全面,需要开发者有一定的编程基础来理解。 对于初学者或...

    SendEmail:C#简单的email类,支持身份验证、附件、作品

    C#的`SmtpClient`类支持多种身份验证方式,如基本认证(Basic Authentication)、NTLM(NT LAN Manager)和Kerberos。通过设置`UseDefaultCredentials`属性为`false`,然后使用`Credentials`属性设置`...

    Winform测试发送邮件

    测试发送QQ邮件、163邮件。 smtpClient类:允许应用程序使用简单邮件传输协议 (SMTP) 发送电子邮件。...NetworkCredential类:为基于密码的身份验证方案(如基本、简要、NTLM 和 Kerberos 身份验证)提供凭据。

    smtpclient-1.0.0.tar.gz_linux_linux smtp_smtp_smtp client c++ co

    2. **源代码文件(Source Files)**:`.cpp`或`.cc`文件包含实际的C++代码,实现了SMTP客户端的功能,如连接到SMTP服务器、身份验证、数据传输等。 3. **配置文件(Configuration Files)**:可能包含`.cfg`或`.ini...

    在ASP.NET中使用SmtpClient发送邮件

    在ASP.NET中使用SmtpClient发送邮件

Global site tag (gtag.js) - Google Analytics