从web.config中膨胀时,SmtpClient不会进行身份验证

时间:2011-01-13 21:02:49

标签: asp.net smtpclient

使用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);

4 个答案:

答案 0 :(得分:3)

我在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编码表示进行响应。因此,我建议将turning on the trace functionality用于SmtpClient,以便您可以看到两种情况下发生的情况。

我正在运行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);

答案 1 :(得分:2)

添加此项以进行记录

请评论使用的AuthenticationModule(您可以在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>

答案 2 :(得分:1)

尝试设置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>

答案 3 :(得分:0)

伙计这个代码没问题我尝试将devsmtp用于本地机器并且工作正常

受保护的子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