为什么是邮发送给任何地址,从Windows形式应用程序,但不能从ASP.NET 应用程序,两者都使用相同的SMTP server?
-
23-09-2019 - |
题
我遇到一个神秘的(对我)的错误,当发送电子邮件的通过SMTP server从ASP.NET 网络应用程序。我得到着名的错误"无法继电器xxx@yyy.zzz".什么神秘的我是当我剪切和粘贴完全相同的代码发送电子邮件到一个通常的。净Windows形式的应用,发送电子邮件,与这个应用程序,它工作得很好。这让我觉得问题也许是的ASP.NET 应用程序的运作网络的服务,同时Windows形式的应用程序运行在一领域的用户账户,但事实证明,我还有一个ASP.NET 申请发送电子邮件的通过同样的SMTP server下运行的网络服务器在同一IIS,而这个应用程序不会遇到这个问题。
我还试图发送电子邮件通过SMTP server手动telnet SMTP-服务器的端口25和运行SMTP协议手,而这一切工作正常。SMTP-服务器是不是配置任何类型的认证或SSL。
另一个神秘的事实是ASP.NET 应用程序可以发送电子邮件地址在同一领域的电子邮件地址在同一领域,但不对任何地址以外的领域。但Windows形式的应用程序,使用完全相同的代码,可以发送电子邮件是从任何地址的任何地址之内和之外的领域。
因此,要总结:
- 的ASP.NET 应用程序可以发送 电子邮件地址在 域名的地址内域, 但是不到的地址以外的 域。
- Windows形式运行的应用程序 同样的代码,在同一台计算机上 可以发送电子邮件是从任何地址 任何地址。
- 另一个ASP.NET 应用上的 同IIS下运行的相同的 帐户(网络服务)可以发送 电子邮件使用相同的SMTP server 从任何地址的任何地址。
- 没有认证配置 在SMTP Server。
- 既ASP.NET 应用程序和 Windows形式应用程序的利用 该系统。网。邮件。SmtpClient类 发送 系统。网。邮件。邮.
代码发送电子邮件按摩是:
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;
}
}
尽我所能理解,这应该是一个问题的结构,而不是编码的问题。这样做的人有一个想法是什么问题可能是,也许这可能是解决?感谢名单!
解决方案
这肯定是听起来像一个身份验证问题或者,你是无意中使用2种不同的SMTP服务器。
我建议你启用记录在这两个应用程序,并查看记录。当你查看日志,你应该可以看到的差异,并希望追踪到你的代码。
到enalbe登录系统。网。邮件,你需要添加一些条目。配置文件。
<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>
这里是一个链接的详细信息:
其他提示
你有模拟=true。config?
这样做:
new System.Net.NetworkCredential(txtUserName.Text, txtPassword.Text);
就我所知要求的网络。config被设定为允许模仿。
尝试加入这个给你网。配置(如果你没有它有)
<system.web>
<identity impersonate="true" />