2013-03-20 96 views
9

我尝试使用端口465,主机“smtp.gmail.com”发送电子邮件在我的Asp.Net C#应用程序,但整个应用程序挂起(保持加载)挂起。调试时,它停留在SmtpClient.Send(msg)。SmtpClient没有抛出异常,如果错误的端口指定

不管指定的凭证,它不抛出任何异常赶上或任何超时错误。我必须关闭或刷新页面才能重新访问该页面。

如果我把端口587,而不是那么每一件事情正常工作和SmtpClient.Send响应,发送电子邮件或返回一个适当的异常,如操作超时或失败的基础上,凭据发送电子邮件。

我简化下面的示范的代码:

var smtp = new SmtpClient 
         { 
          Host = "smtp.gmail.com", 
          Port = 465, 
          EnableSsl = true, 
          Timeout = 200, // or any value it doesn't solve the problem 
          DeliveryMethod = SmtpDeliveryMethod.Network, 
          UseDefaultCredentials = false, 
          Credentials = new NetworkCredential("[email protected]", "password") 
         }; 

var msg = new MailMessage("[email protected]", "[email protected]", "Any subject", "Any body"); 
smtp.Send(msg); // stuck here 
smtp.Dispose(); // never reached 
msg.Dispose(); 

我试图SendAsync和减少超时间隔但这并没有解决问题。我认为问题在于已达到smtp.gmail.com,但未正确响应端口465,这就是为什么该方法卡住了。

我要避免这种行为,因为我的应用程序允许的SMTP服务器信息动态设置,我不希望整个应用程序中的错误信息的情况下挂了输入。

谢谢

enter image description here

+0

奇怪,我从来没有遇到过问题,它看起来不错。听起来有点像这个问题http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/99d6812c-9efe-4d0c-94d0-493c688450f7/,但我不认为他真的有一个解决方案。您可以使用任何其他应用程序向您的网络发送出站邮件吗? – devshorts 2013-03-20 21:44:14

+0

'使用(var smtp = ...)'和'使用(var msg = ...)' – 2013-03-20 21:49:33

+0

@devshorts我只使用Wireshark捕获TCP流量,这足够吗? – 2013-03-21 08:54:49

回答

3

发现这个答案的情况下,任何人都送过来

SmtpClient Timeout doesn't work

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
IAsyncResult result = socket.BeginConnect("192.168.1.180", 25, null, null); 
// Two second timeout 
bool success = result.AsyncWaitHandle.WaitOne(2000, true); 
if (!success) { 
    socket.Close(); 
    throw new ApplicationException("Failed to connect server."); 
} 
+0

我们做什么,如果它是成功的,即我们如何通过此套接字发送消息? – mcmillab 2014-11-19 03:36:32

-1

包装你SmptClient在using声明,以确保调用Dispose 。

我不知道这是否是原因或者您的问题或没有,但我有同样的问题(正确发送一日一次,事后往往失败)在这个已经纠正对我来说。

+0

如果'发送'挂起,'Dispose'永远不会被调用。 – NathanAldenSr 2015-06-28 02:06:10