我似乎找不到导致此问题的原因.
有时,我将以下c#代码用于.net-4.0时引发了SmtpException“ 4.7.0超时,等待客户端输入”:
using System;
using System.Net.Mail;
namespace SendMail
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
string html = "<h1>TEST</h1>";
using (MailMessage mail = new MailMessage("sender@domain.com", "receiver@domain.com"))
{
mail.Subject = "Test";
mail.IsBodyHtml = true;
mail.Body = html;
using (SmtpClient client = new SmtpClient("<internal ip address>"))
{
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential("<user name>", "<password>");
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(mail);
}
}
}
}
}
}
它通常在第二次尝试时崩溃(i == 1).
我知道我应该创建一个SmtpClient实例并在循环中重用它,但是出于演示目的,为了尽可能接近真实代码,必须采用这种方式.虽然上面的代码与我的生产代码不太一样,但确实存在相同的随机问题.我认为,如果我可以用这段代码解决问题,那么我将知道如何处理我的实际代码,因为这确实是一个编码问题.我怀疑服务器配置问题晦涩难懂,但对于可能的问题我一无所知.
奇怪的是:尽管存在超时问题,但异常抛出的速度非常快;没有任何延迟可以暗示实际的超时问题.
邮件服务器是运行在windows-server-2008 SP2上的MS exchange-server-2007. app.config文件中没有指定其他SMTP设置.
我试图将代码放入Do … While循环中,该循环在使线程进入睡眠状态一秒钟后尝试五次发送回电子邮件.不幸的是,这无济于事:当它失败时,它也会在下次尝试时失败.
我还尝试在每次调用client.Send(message)之前使用Thread.Sleep(< delay>),但没有明显的区别.
我们的网络管理员坚决要求网络正常运行,不会出现任何问题(没有错误的MTU设置或类似情况引起的数据包丢失).他用一个事实来证明这一点,即我的代码似乎只有问题(他是对的),并且它不仅发生在网络的一部分上(也是对的).
防火墙也不可能引起这种情况,因为我的应用发送的每封邮件都使用内部地址.
有人在这里有线索吗?将不胜感激.
更新:
我似乎每次使用默认凭据时都可以重现该问题:
using (SmtpClient client = new SmtpClient("<internal ip address>"))
{
client.UseDefaultCredentials = true;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(mail);
}
更新2:
不.并非每次.现在,一切都会再次生效(直到下一次).
我真的无法动弹.
更新3:
今天有趣的新开发:我试图在MS Outlook中使用与Exchange相同的地址创建一个新帐户.仅这次,我没有将其添加为MS Exchange地址,而是尝试将其设置为POP3 / SMTP帐户.这是测试连接时发生的事情:
它是法语的,但请看最后一行:这是我在代码中得到的完全相同的错误消息.这向我明确表明问题不在我的代码内.
当然,这也意味着整个线程不应该使用SO.不过,我希望这项额外的测试可以帮助那些正在努力解决类似问题的开发人员.
解决方法:
这绝对听起来像是服务器或网络问题.引用此serverfault帖子,例如:https://serverfault.com/questions/344684/exchange-2007-email-error-451-4-7-0-timeout-waiting-for-client-input
如果您的计算机和交换服务器之间存在防火墙,则可能是防火墙问题.防火墙会阻止ip地址之间的端口,这与电子邮件的发送位置无关.防火墙是我编写程序的祸根,因此绝对要询问您的网络管理员,服务器之间是否有防火墙,并请他检查防火墙是否正常工作.
也可能是服务器上的NIC(网卡)损坏,甚至电缆也损坏.是的,您的网络管理员说网络坚如磐石……但永远不要相信网络管理员.