2014-02-19 178 views
4

可以實例化一次SMTP客戶端並同步發送2000封電子郵件嗎?發送2000封電子郵件

我們收到以下錯誤,實例化一個SMTP客戶端時爲每一封郵件我們發送郵件使用的代碼粘貼也是在這個崗位結束:

System.Net.Mail.SmtpException:服務不可用,傳輸通道關閉 。服務器的迴應是:4.4.1連接時間 出

我懷疑實例化每個消息的SMTP客戶端導致這一點,但不知道。代碼如下。

List<MailMessage> messages = GetMailMessages(); 
foreach(MailMessags m in messages) 
{ 
    try 
    { 
     SmtpClient client = new SmtpClient();//SHOULD THIS BE PLACED OUTSIDE AND BEFORE THE LOOP 
     client.Send(m); 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

編輯1:

我剛剛發現這個MSDN上。 (http://msdn.microsoft.com/en-us/library/ee706942%28v=vs.110%29.aspx)。 因此,當使用大量電子郵件發送時,您似乎只能實例化SMTP客戶端一次,並將其重用於所有多個MailMessage。

由SmtpClient 類到SMTP服務器的當前實例建立可以是 的連接重新使用,如果應用程序希望多個消息發送到同一個SMTP服務器。這是
當使用身份驗證或加密建立與SMTP 服務器的連接時特別有用。驗證和建立TLS會話的過程可能是昂貴的操作。 A 要求在發送大量電子郵件到 時爲每條消息重新建立連接,同一個SMTP服務器可能會對性能產生重大影響。有多個 大容量電子郵件應用程序發送電子郵件狀態更新,新聞稿分發或電子郵件 警報。

+3

是的,絕對實例化循環外的客戶端,併爲每個郵件重新使用它。在消息之間休息幾秒鐘可能會很好。 – HaukurHaf

+0

使用單個'SmtpClient'來處理所有消息,並在完成時調用'Dispose()'(使用'using'語句)。 –

+0

你可以嘗試在發送後使用SmtpClient - '使用(var client = new SmtpClient()){client.Send(m); }' – Win

回答

0

你真的應該更友善到您的郵件服務器,但SMTP客戶端可以處理多個電子郵件,如果你做了,你會得到更好地利用服務器硬件的這種異步像這樣......

async Task SendMail(ICollection<MailMessage> messages) 
{ 
    using (var client = new SmtpClient()) 
    { 
     foreach (MailMessags m in messages) 
     { 
      try 
      { 
       await client.SendAsync(m); 
      } 
      catch (Exception) 
      { 
       throw; 
      } 
     } 
    } 
} 

我懷疑此時拋出異常的原因是由於重複連接嘗試,所以服務器可能「表現出來」作爲「停止重複連接戳我」的方式。

上面的代碼示例將確定代表您要創建多少個連接,並且與服務器進行「禮貌」溝通,正如您所指出的那樣,文檔指出了其他方案更適合的其他方案至。

相關問題