[英]SmtpClient: The maximum number of concurrent connections has exceeded a limit
我有一個以下方法,我為每個MailMessage調用:
public static string SendEmail(MailMessage email)
{
string rez = "";
try
{
var smtpserver = "10.xxx.xx.xx";
using (SmtpClient mailclient = new SmtpClient())
{
mailclient.Host = smtpserver;
mailclient.Send(email);
}
rez = "OK";
}
catch (Exception ex)
{
rez = "NOT OK: " + ex.Message;
}
return rez;
}
我一次發送32封電子郵件,其中兩封我從mailclient.Send()收到以下錯誤: 不行:服務不可用,關閉傳輸通道。 服務器響應為:4.3.2最大並發連接數已超過限制,關閉傳輸通道
我想知道這是因為我為每封郵件創建了一個新的SmtpClient實例嗎?
以下更改是否會解決問題,因為只有一個SmtpClient實例。 不幸的是我無法測試它,我只能在生產中試用它。
public static SmtpClient mailclient = new SmtpClient("10.xxx.xx.xx");
public static string SendEmail(MailMessage email)
{
string rez = "";
try
{
mailclient.Send(email);
rez = "OK";
}
catch (Exception ex)
{
rez = "NOT OK: " + ex.Message;
}
return rez;
}
謝謝。
您可以重用SmtpClient的實例來發送電子郵件,這是一個很好的做法(請參閱MSDN ),但我認為它不會解決您的問題。
來自MSDN
如果應用程序希望將多個消息發送到同一SMTP服務器,則可以重新使用由SmtpClient類的當前實例建立到SMTP服務器的連接。 當使用身份驗證或加密建立與SMTP服務器的連接時,這尤其有用。 驗證和建立TLS會話的過程可能是昂貴的操作。 在向同一SMTP服務器發送大量電子郵件時重新建立每條消息的連接的要求可能會對性能產生重大影響。 有許多高容量電子郵件應用程序可以發送電子郵件狀態更新,新聞稿分發或電子郵件警報。 此外,許多電子郵件客戶端應用程序支持離線模式,用戶可以撰寫許多電子郵件,這些郵件將在以后建立與SMTP服務器的連接時發送。 通常,電子郵件客戶端將所有SMTP郵件發送到特定的SMTP服務器(由Internet服務提供商提供),然后將此電子郵件轉發到其他SMTP服務器。
SmtpClient類實現匯集了SMTP連接,因此可以避免為同一服務器的每條消息重新建立連接的開銷。 應用程序可能會重復使用相同的SmtpClient對象將許多不同的電子郵件發送到同一SMTP服務器和許多不同的SMTP服務器。 因此,無法確定何時使用SmtpClient對象完成應用程序,並且應該清除它。
當SMTP會話結束並且客戶端希望終止連接時,它必須向服務器發送QUIT消息以指示它沒有更多要發送的消息。 這允許服務器從客戶端釋放與連接相關聯的資源,並處理客戶端發送的消息。
SmtpClient類沒有Finalize方法,因此應用程序必須調用Dispose以顯式釋放資源。 Dispose方法遍歷所有已建立的與Host屬性中指定的SMTP服務器的連接,並發送QUIT消息,然后正常結束TCP連接。 Dispose方法還釋放Socket使用的非托管資源,並可選擇處理托管資源。 使用完SmtpClient后調用Dispose。 Dispose方法使SmtpClient處於不可用狀態。 在調用Dispose之后,必須釋放對SmtpClient的所有引用,以便垃圾收集器可以回收SmtpClient占用的內存。
我找不到一種方法將SMTPClient限制為一定數量的連接,我發現這個問題試圖跟蹤它。 我找到了一種從不同線程同時發送多封電子郵件的方法,讓它們堆疊起來並通過使用一個連接的共享SMTPClient運行,釋放下一條要使用AutoResetEvent發送的消息。
請在此處查看我對Stack Overflow的回答。 在一個相關的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.