各位好,
我的客戶這邊在發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)
問題在於
你的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 內加上
<pre class="c" name="code">message.Dispose();
我不行用 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
哇哩咧...using block不能用...不會自己寫dispose的咧....
我們試出來了:
SmtpClient client = new SmtpClient(server);
client.ServicePoint.MaxIdleTime = Convert.ToInt32(5000); //0.5 sec
你有把你的 IP 給 客戶的 MIS 嗎?!
可能是該 Mail Server 的 Mail Relay 限制!