1

从 ASP.NET Web 应用程序通过 SMTP 服务器发送电子邮件时,我遇到了一个神秘的(对我而言)错误。我收到著名的错误“无法转发 xxx@yyy.zzz”。对我来说神秘的是,当我将发送电子邮件的完全相同的代码剪切并粘贴到一个普通的 .NET Windows 窗体应用程序中时,用这个应用程序发送电子邮件,一切正常。这让我觉得问题可能是 ASP.NET 应用程序作为 NETWORK SERVICE 运行,而 Windows 窗体应用程序在域用户帐户上运行,但事实证明我有另一个 ASP.NET 应用程序通过相同的发送电子邮件SMTP 服务器在同一 IIS 的 NETWORK SERVER 下运行,并且此应用程序不会遇到此问题。

我进一步尝试通过 SMTP 服务器手动发送电子邮件,方法是在端口 25 上远程登录 SMTP 服务器并手动运行 SMTP 协议,一切正常。SMTP 服务器未配置任何类型的身份验证或 SSL。

另一个神秘的事实是 ASP.NET 应用程序可以将电子邮件从同一域内的地址发送到同一域内的电子邮件地址,但不能发送到域外的任何地址。但是使用完全相同的代码的 Windows 窗体应用程序可以从任何地址向域内和域外的任何地址发送电子邮件。

所以总结一下:

  • ASP.NET 应用程序可以将电子邮件从域内的地址发送到域内的地址,但不能发送到域外的地址。
  • 在同一台计算机上运行相同代码的 Windows 窗体应用程序可以将电子邮件从任何地址发送到任何地址。
  • 在同一帐户(网络服务)下运行的同一 IIS 上的另一个 ASP.NET 应用程序可以使用同一 SMTP 服务器从任何地址向任何地址发送电子邮件。
  • SMTP 服务器上没有配置身份验证。
  • ASP.NET 应用程序和 Windows 窗体应用程序都使用 System.Net.Mail.SmtpClient 类来发送 System.Net.Mail.MailMessage。

发送电子邮件消息的代码是:

private void button1_Click(object sender, EventArgs e)
        {
            MailMessage mesasge = new MailMessage(txtFrom.Text, txtTo.Text, "Test mail", txtBody.Text);
            SmtpClient client = new SmtpClient();
            if (!(string.IsNullOrEmpty(txtUserName.Text)))  //Is false since txtUserName.Text is empty
                client.Credentials = new System.Net.NetworkCredential(txtUserName.Text, txtPassword.Text);
            client.EnableSsl = false;
            client.Host = txtServer.Text;
            client.Port = 25;
            try
            {
                client.Send(mesasge);
            }
            catch (Exception ex)
            {
                txtResponse.Text = ex.Message;
            }
        }

据我了解,这应该是配置问题而不是编码问题。有谁知道问题可能是什么,也许如何解决?谢谢!

4

2 回答 2

1

这听起来绝对像是身份验证问题,或者您不小心使用了 2 个不同的 SMTP 服务器。

我建议您在两个应用程序中启用日志记录,并查看日志。当您查看日志时,您应该能够看到差异,并希望将其追溯到您的代码。

要在 System.Net.Mail 中登录,您需要在 .config 文件中添加一些条目。

<configuration>
  <system.diagnostics>
    <trace autoflush="true" />

    <sources>

      <source name="System.Net" >
        <listeners>
          <add name="MyTraceFile"/>
        </listeners>
      </source>

      <source name="System.Net.Sockets">
        <listeners>
          <add name="MyTraceFile"/>
        </listeners>
      </source>

    </sources>


    <sharedListeners>
      <add
        name="MyTraceFile"
        type="System.Diagnostics.TextWriterTraceListener"
        initializeData="System.Net.trace.log"                />
    </sharedListeners>

    <switches>
      <add name="System.Net" value="Verbose" />
      <add name="System.Net.Sockets" value="Verbose" />
    </switches>
 </configuration>

这是一个包含更多信息的链接:

http://systemnetmail.com/faq/4.10.aspx

于 2010-01-27T13:12:46.753 回答
0

您在 web.config 中有 impersonate = true 吗?

这样做:

new System.Net.NetworkCredential(txtUserName.Text, txtPassword.Text);

据我所知,需要将 web.config 设置为允许模拟。

尝试将此添加到您的 web.config 中(如果您没有它)

    <system.web>
    <identity impersonate="true"  />
于 2010-01-27T08:58:02.633 回答