2014-03-06 43 views
0

我有一個下面的方法,我呼籲每個MAILMESSAGE:SmtpClient:併發連接的最大數目已超過極限

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個電子郵件-s的一次,其中兩個我mailclient.Send()發生以下錯誤: NOT OK:服務不可用,關閉傳輸通道。服務器響應爲: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; 
      } 

謝謝。

+0

*我無法測試它,我只能嘗試在生產。*你註定即可。抱歉。 –

+0

嘗試引入每個電話之間的輕微_delay_,說100毫秒(只是一個例子),看看它是否改變了一些東西。 – Tigran

+0

照常發送'()' - 方法塊,直到該消息被髮送(或發送失敗的),所以應該有發送消息32連續沒有問題。你使用線程來執行你的'SendEmail()'方法嗎? – Jehof

回答

2

您可以重新使用SmtpClient的實例發送電子郵件,這是一個很好的做法(請參閱MSDN),但我認爲它不會解決您的問題。

從MSDN

由SmtpClient 類到SMTP服務器的當前實例建立的連接可以被重新使用,如果應用程序希望 發送多條消息,以相同的SMTP服務器。當使用認證或加密建立到SMTP服務器的連接時,這尤其是 有用。驗證和建立TLS會話的過程可能是昂貴的操作。當向同一SMTP服務器發送大量電子郵件時,要求 爲每條消息重新建立連接可能會對性能產生顯着影響。有大量電子郵件發送電子郵件狀態更新,新聞稿分發, 或電子郵件警報的大量電子郵件 應用程序。此外,許多電子郵件客戶端應用程序支持離線模式,用戶可以編寫許多電子郵件,這些電子郵件在建立與SMTP服務器的連接後稍後發送,其中包含 。它是 典型的電子郵件客戶端發送所有SMTP郵件到特定的 SMTP服務器(由Internet服務提供商提供),然後 轉發此電子郵件到其他SMTP服務器。

SmtpClient類實現池中的SMTP連接,以便它可以避免重複建立到每個 消息連接到同一服務器的連接的開銷。應用程序可能會重複使用相同的 SmtpClient對象將多個不同的電子郵件發送到同一個SMTP 服務器和許多不同的SMTP服務器。因此,沒有確定何時使用SmtpClient對象完成應用程序的方法,並且應該清理它。

當一個SMTP會話結束,客戶希望終止 的連接,它必須發送一個退出消息給服務器,以指示 ,它沒有更多的消息要發送。這允許服務器釋放與來自客戶端的連接相關聯的資源並且處理由客戶端發送的消息 。

的SmtpClient類沒有定案方法,所以應用程序必須 調用Dispose明確地釋放資源。 Dispose方法 遍歷到在主機屬性中指定的SMTP服務器 所有建立的連接,併發送一個退出消息,隨後 正常結束TCP連接。 Dispose方法還釋放 由插座佔用的非託管資源,還可以處置的 託管資源。當您完成使用SmtpClient的 呼叫處置。 Dispose方法使SmtpClient處於不可用的狀態,即 狀態。調用Dispose之後,必須釋放所有對SmtpClient的引用,以便垃圾回收器可以回收SmtpClient佔用的內存。