【问题标题】:SmtpClient won't authenticate when inflated from web.config从 web.config 膨胀时,SmtpClient 不会进行身份验证
【发布时间】:2013-04-09 08:10:54
【问题描述】:

当使用 system.net/mail web.config 设置来配置我的 SmtpClient 时,它无法发送电子邮件,并出现 Base64 编码和身份验证问题最好描述的“协议错误”:

示例:
使用以下配置

<system.net>
    <mailSettings>
        <smtp from="email@server.com">
            <network host="servermail.outsourced.com"
                     port="2525" 
                     defaultCredentials="false" 
                     userName="username" 
                     password="password"/>
        </smtp>
    </mailSettings>
</system.net>

还有代码:

var tmp = new SmtpClient();

MailMessage msg = new MailMessage();
msg.Subject = "test";
msg.From = new MailAddress("me@server.com");
msg.To.Add(new MailAddress("me@server.com"));
msg.Body = "test";
tmp.Send(msg);

产生错误信息:

System.Net.Mail.SmtpException: The server committed a protocol violation The server response was: UGFzc3dvcmQ6
   at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)
   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException
& exception)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)

但是,在我手动设置所有属性的以下代码中,代码运行无异常并且电子邮件已送达。

var tmp2 = new SmtpClient("servermail.outsourced.com", 2525);
tmp2.Credentials = new NetworkCredential("username", "password");
tmp2.UseDefaultCredentials = false;

MailMessage msg = new MailMessage();
msg.Subject = "test";
msg.From = new MailAddress("me@server.com");
msg.To.Add(new MailAddress("me@server.com"));
msg.Body = "test";
tmp2.Send(msg);

【问题讨论】:

  • 如果你解码 UGFzc3dvcmQ6 你会得到“密码:”所以你的身份验证显然有问题。我自己对此进行了测试,没有任何问题。可能重复:stackoverflow.com/questions/2380531/…
  • 这是我最初的怀疑,除了相同的凭据在通过网络配置设置时会产生错误,而在使用代码设置时会起作用。
  • 使用的邮件服务器是什么?
  • 您能诊断出您的问题吗?

标签: asp.net smtpclient


【解决方案1】:

我在 LINQPad 中针对我的 hMailServer 邮件服务器尝试了您的配置设置,它们运行良好。所以,我的猜测是你正在与之通信的邮件服务器正在以一种意想不到的方式与客户端握手。当我在测试时,我从我的服务器捕获了 SMTP 日志,这就是它的样子(当然是经过清理的):

SENT: 220 my.mailserv.er ESMTP
RECEIVED: EHLO CLIENTAPP
SENT: 250-my.mailserv.er[nl]250-SIZE 25600000[nl]250 AUTH LOGIN
RECEIVED: AUTH login bWFpbHRlc3RAbXkubWFpbHNlcnYuZXI=
SENT: 334 UGFzc3dvcmQ6
RECEIVED: ***
SENT: 235 authenticated.
RECEIVED: MAIL FROM:<mailtest@mailserv.er>
SENT: 250 OK
RECEIVED: RCPT TO:<happyuser@mailserv.er>
SENT: 250 OK
RECEIVED: DATA
SENT: 354 OK, send.

我的服务器需要 SMTP AUTH,您可以看到,在我的客户端发送 AUTH 命令后,服务器响应状态码 334,以及Password: 的 base-64 编码表示。因此,我建议 SmtpClient 使用 turning on the trace functionality,这样您就可以看到两种情况下发生的情况。

我运行的是 LINQPad 4.31,我的 linqpad.config 文件包含:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <mailSettings>
      <smtp from="mailtest@mailserv.er">
        <network host="my.mailserv.er" port="25" userName="mailtest@mailserv.er" password="supersecure"/>
      </smtp>
    </mailSettings>
  </system.net>
</configuration>

LINQPad 查询如下:

SmtpClient mailer = new SmtpClient();

Guid g = Guid.NewGuid();
g.Dump("Message GUID");

MailMessage msg = new MailMessage();
msg.Subject = "Test:" + g;
msg.To.Add(new MailAddress("happyuser@mailserv.er"));
msg.Body = "I HAS A BODY";
mailer.Send(msg);

【讨论】:

    【解决方案2】:

    将此添加到日志记录

    请评论使用了哪些 AuthenticationModules(您会在 network.log 中找到它们的说明)。 在我的盒子上,SmtpLoginAuthenticationModule# 是不变的,但还有其他可能的。

      <system.diagnostics>
        <sources>
          <source name="System.Net" tracemode="includehex">
            <listeners>
              <add name="System.Net"/>
            </listeners>
          </source>
          <source name="System.Net.Sockets">
            <listeners>
              <add name="System.Net"/>
            </listeners>
          </source>
          <source name="System.Net.Cache">
            <listeners>
              <add name="System.Net"/>
            </listeners>
          </source>
    
        </sources>
        <switches>
          <add name="System.Net" value="Verbose"/>
          <add name="System.Net.Sockets" value="Verbose"/>
          <add name="System.Net.Cache" value="Verbose"/>
        </switches>
        <sharedListeners>
          <add name="System.Net"
            type="System.Diagnostics.TextWriterTraceListener"
            initializeData="network.log"
          />
        </sharedListeners>
        <trace autoflush="true"/>
    
      </system.diagnostics>
    

    【讨论】:

      【解决方案3】:

      尝试设置deliveryMethod属性强制配置使用network-config

      <system.net>
          <mailSettings>
              <smtp deliveryMethod="network" from="email@server.com">
                  <network host="servermail.outsourced.com"
                           port="2525" 
                           defaultCredentials="false" 
                           userName="username" 
                           password="password"/>
              </smtp>
          </mailSettings>
      </system.net>
      

      【讨论】:

      • 感谢您的推荐。没有效果。
      • 在使用 web.config 存储您的凭据时,您是否尝试过在正确填充 SMTP 服务器的属性后调试和检查它们?也许那里的值不正确。
      【解决方案4】:

      伙计们,这段代码没问题,我尝试在本地机器上使用 devsmtp,它工作正常

      Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) 处理 Button1.Click

          Using tmp = New SmtpClient()
              Dim msg As New MailMessage() With {.Subject = "test", .From = New MailAddress("youremail@domain.com")}
              msg.[To].Add(New MailAddress("youremail@domain.com"))
              msg.Body = "test"
              tmp.Send(msg)
          End Using
      
      End Sub
      

      请从

      下载本地机器的devsmtp

      http://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=smtp4dev&DownloadId=269147&FileTime=129575689693530000&Build=20393

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-28
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多