iT邦幫忙

0

c# sendmail timeout

各位好,

我的客戶這邊在發mail時,會出現10分鐘timeout的情況。我寫了一支小程式測試,每半分鐘sendmail一次,都沒有錯誤,但到第20次,也就是10分鐘,就會出現4.4.1 connection timeout的訊息。請看圖片。

底下是我的程式碼。

using System;
using System.Net;
using System.Net.Mail;
using System.Threading;


namespace SendUscMail
{
    class Program
    {
        static void Main(string[] args)
        {

            int t = Convert.ToInt32(args[1]);
            for (int i = 0; i <= 35; i++)
            {
                CreateTestMessage4(args[0], args[2]);
                Console.Write(i.ToString());
                Thread.Sleep(t);
                
            }
            Console.ReadLine();
        }


        public static void CreateTestMessage4(string server,string mailTo)
        {
            MailAddress from = new MailAddress("abc@xxx.com");
            MailAddress to = new MailAddress(mailTo);
            MailMessage message = new MailMessage(from, to);
            message.Subject = "測試發信";
            message.Subject += "-測試發信測試發信測試發信測試發信";
            message.SubjectEncoding = System.Text.Encoding.Default;
            message.Body = @"測試發信";
            message.IsBodyHtml = true;
            message.BodyEncoding = System.Text.Encoding.Default;
            
            try
            {
                {
                    SmtpClient client = new SmtpClient(server);
                    client.UseDefaultCredentials = false;
                    Console.WriteLine("Sending an e-mail message to {0} by using SMTP host {1} port {2}.",
                         to.ToString(), client.Host, client.Port);
                    client.Send(message);
                    message.Dispose();
                }
                
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception caught in CreateTestMessage4(): {0}",
                      ex.ToString());
            }
        }
    }
}

請問這會是什麼地方的問題? (客戶的 mail server是 exchange 2010)

slime iT邦大師 1 級 ‧ 2014-11-05 13:29:20 檢舉
1. 查主機 log , 看看停掉的 10 分鐘有什麼記錄.
2. 看看主機或網路架構有沒有增設防 spam 機制.
4
外獅佬
iT邦大師 1 級 ‧ 2014-11-05 22:54:08
最佳解答

問題在於
你的SmtpClient沒有dispose
MSDN都跟你說了....
SmtpClient 類別實作會緩衝 SMTP 連線,使其能夠避免為每個訊息重新連線至同一個伺服器的負荷。
這表示什麼?
如果沒有去把你的SmtpClient給Dispose,就會出現Timeout
比較好的作法應該是

<pre class="c" name="code">
using(SmtpClient client = new SmtpClient(server))
{  
  client.UseDefaultCredentials = false;  
  Console.WriteLine("Sending an e-mail message to {0} by using SMTP host {1} port {2}.", to.ToString(), client.Host, client.Port);  
  client.Send(message);  
  message.Dispose();
} 
看更多先前的回應...收起先前的回應...

<pre class="c" name="code">catch (Exception ex){
略...
}

也請記得在 Exception Handling 內加上

&lt;pre class="c" name="code">message.Dispose();
Brandon iT邦新手 4 級 ‧ 2014-11-06 16:30:05 檢舉

我不行用 using 耶,compile 會出現
'System.Net.Mail.SmtpClient': 在 using 陳述式中使用的型別必須可以隱含轉換為 'System.IDisposable'
是不是因為我的framework是 .net 2.0 ?

.net 2.0 => 現在還有在用呦, 2.0 是沒提供 Dispose...
建議參考下列 Sample 的做法, 試看看
http://msdn.microsoft.com/zh-tw/library/system.net.mail.smtpclient%28v=vs.80%29.aspx

外獅佬 iT邦大師 1 級 ‧ 2014-11-08 01:47:51 檢舉

哇哩咧...using block不能用...不會自己寫dispose的咧....

Brandon iT邦新手 4 級 ‧ 2015-03-29 08:01:27 檢舉

我們試出來了:
SmtpClient client = new SmtpClient(server);
client.ServicePoint.MaxIdleTime = Convert.ToInt32(5000); //0.5 sec

2
丁丁 (Dean)
iT邦大師 6 級 ‧ 2014-11-05 13:28:42

你有把你的 IP 給 客戶的 MIS 嗎?!
可能是該 Mail Server 的 Mail Relay 限制!

Brandon iT邦新手 4 級 ‧ 2014-11-05 15:39:22 檢舉

比較奇怪的是,在出現TIMEOUT之前的MAIL, 都是正常的。也確認收件人有收到MAIL.
但10分鐘一到,就是TIMEOUT。
然後又可以繼續SENDMAIL。

FROM 跟 TO 都是內網,照他們說是不會判斷是否為 SPAM 的

0
darkslayer
iT邦好手 1 級 ‧ 2014-11-05 17:29:48

有些郵件主機會設定連續傳送幾封郵件後該寄件者就會被阻擋一段時間.

我要發表回答

立即登入回答