2013-03-20 52 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