当两个应用程序使用同一个SMTP服务器时,为什么从Windows窗体应用程序将邮件发送到任何地址,而不是从ASP.NET应用程序?

当两个应用程序使用同一个SMTP服务器时,为什么从Windows窗体应用程序将邮件发送到任何地址,而不是从ASP.NET应用程序?,.net,asp.net,smtp,winforms,smtpclient,.net,Asp.net,Smtp,Winforms,Smtpclient,从ASP.NET web应用程序通过SMTP服务器发送电子邮件时,我(对我来说)遇到了一个神秘的错误。我犯了一个著名的错误“无法中继”xxx@yyy.zzz". 对我来说很神秘的是,当我剪切并粘贴发送电子邮件的代码到一个普通的.NET Windows窗体应用程序中时,用这个应用程序发送电子邮件,一切正常。这使我认为,问题可能在于ASP.NET应用程序作为网络服务运行,而Windows窗体应用程序在域用户帐户上运行,但事实证明,我有另一个ASP.NET应用程序通过在同一IIS的网络服务器下运行的同

从ASP.NET web应用程序通过SMTP服务器发送电子邮件时,我(对我来说)遇到了一个神秘的错误。我犯了一个著名的错误“无法中继”xxx@yyy.zzz". 对我来说很神秘的是,当我剪切并粘贴发送电子邮件的代码到一个普通的.NET Windows窗体应用程序中时,用这个应用程序发送电子邮件,一切正常。这使我认为,问题可能在于ASP.NET应用程序作为网络服务运行,而Windows窗体应用程序在域用户帐户上运行,但事实证明,我有另一个ASP.NET应用程序通过在同一IIS的网络服务器下运行的同一SMTP服务器发送电子邮件,这个应用程序没有遇到这个问题

我还尝试通过SMTP服务器手动发送电子邮件,通过telnet将SMTP服务器连接到端口25,并手动运行SMTP协议,一切正常。SMTP服务器未配置任何类型的身份验证或SSL

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

因此,总结一下:

  • ASP.NET应用程序可以发送 从中的地址发送电子邮件 域到域中的地址, 但不适用于公司以外的地址 域名
  • 正在运行的Windows窗体应用程序 同一台计算机上的相同代码 可以从任何地址发送电子邮件到 任何地址
  • 上的另一个ASP.NET应用程序 相同的IIS在相同的服务器下运行 帐户(网络服务)可以发送 使用相同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;
            }
        }

据我所知,这应该是一个配置问题,而不是编码问题。有没有人知道问题可能是什么,以及如何解决这个问题?塔克斯

web.config中是否有impersonate=true

这样做:

new System.Net.NetworkCredential(txtUserName.Text, txtPassword.Text);
据我所知,需要将web.config设置为允许模拟

尝试将其添加到web.config(如果您没有)


您在web.config中是否有impersonate=true

这样做:

new System.Net.NetworkCredential(txtUserName.Text, txtPassword.Text);
据我所知,需要将web.config设置为允许模拟

尝试将其添加到web.config(如果您没有)


这听起来很像是身份验证问题,或者您不小心使用了两个不同的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>


这听起来很像是身份验证问题,或者,您不小心使用了两个不同的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>


冒着听起来愚蠢的风险,您使用的smtp服务器是什么?您是否使用相同的发件人地址进行了测试是的,我使用相同的发件人地址进行了测试。不幸的是,我不知道什么SMTP服务器正在使用。我敢打赌IIS中的那个…你可以通过远程登录看到SMTP的版本。在dos窗口中键入:telnet 25,返回该窗口的第一行通常会识别服务器,并告诉您它是什么版本。正确。SMTP服务器是ESMTP MailMarshall(v6.5.4.7535)。冒着听起来愚蠢的风险,您使用的SMTP服务器是什么?您是否使用相同的发件人地址进行了测试?是的,我使用相同的发件人地址进行了测试。不幸的是,我不知道什么SMTP服务器正在使用。我敢打赌IIS中的那个…你可以通过远程登录看到SMTP的版本。在dos窗口中键入:telnet 25,返回该窗口的第一行通常会识别服务器,并告诉您它是什么版本。正确。SMTP服务器是ESMTP MailMarshall(v6.5.4.7535)。我没有指定任何凭据。if(!(string.IsNullOrEmpty(txtUserName.Text))为false,因此不会命中这些行。但是,我确实在web.config文件中执行了建议的条目。然而,问题仍然存在。无论如何,谢谢你的提示!可以:(在我这方面,通常会发生的情况是,如果您确实使用该方法进行身份验证,并且您没有identity impersonate=true,那么Active directory票证无效,并会给您带来诸如无效用户ID/密码错误之类的问题。我也经常用telnet命令来解决SMTP问题,但听起来不会这样帮助您,因为它通过windows应用程序工作。我没有指定任何凭据。if(!(string.IsNullOrEmpty(txtUserName.Text))为false,因此这些行永远不会被命中。但是,我在web.config文件中执行了建议的条目。但是,问题仍然存在。无论如何,感谢您提供的提示!好的:(在我这方面通常发生的情况是,如果您确实使用该方法进行身份验证,并且您没有identity impersonate=true,那么Active directory票据