2012-07-12 86 views
1

我試圖使用以下代碼發送電子郵件並獲取上述錯誤。SMTP.SendMail錯誤 - 現有連接被遠程主機強制關閉

有兩封電子郵件發送第一個似乎得到罰款,下面的代碼似乎並沒有工作。

任何人都可以幫忙嗎?

 using (var mail = new MailMessage(fromEmail.Trim(), ToEmail.Trim())) 
     { 
      mail.IsBodyHtml = true; 

      bodyText = bodyText.Replace("**Message**", Message); 

      // populate the message 
      mail.Subject = subject; 
      mail.Body = bodyText; 

      // send it 
      var smtpClient = new SmtpClient(); 
      smtpClient.Send(mail); 
     } 

在配置:

<system.net> 
    <mailSettings> 
     <smtp from="[email protected]"> 
     <network defaultCredentials="true" port="25" host="127.0.0.1" password="" userName=""/> 
     </smtp> 
    </mailSettings> 
    </system.net> 
+1

接收服務器可能具有反垃圾郵件設置,這些設置會拒絕來自相同源的連接太靠近。作爲測試,在發送之間放入幾秒鐘的延遲。 – hatchet 2012-07-12 18:48:32

+1

請參閱http://stackoverflow.com/questions/8079605/why-cant-i-send-two-mails-in-a-row-with-c類似的問題。 – hatchet 2012-07-12 18:50:42

回答

3

代替放置MailMessage作爲using塊的主題,嘗試使SmtpClient的主題。

編輯: 如果你的.net版本是< 4.0,你需要做一些簡單的工作以確保smtp客戶端在嘗試發送另一條消息之前處置。

假設using塊也代表一個實例方法的主體中,一個幼稚測試可以是:

  1. 創建包含類
  2. 的一個實例通過呼叫發送所述第一消息發送到上述參考的類方法
  3. 設置參考= NULL(換言之,確保SmtpClient實際上已被標記/設置。你可能想/需要實例的手動處理,作爲進一步檢查)

    Jeff Tucker建議您將SmtpClient.Timeout的值設置爲2 - 有關更多信息,請參閱他的評論。

  4. 創建同一類
  5. 的新實例發送第二個消息

此之後(假設作品),你可以迭代步驟細化和縮小邏輯,直到你滿意它。

+2

MailMessage和SmtpClient都在.Net 4中實現了IDisposable,所以兩者都應該使用。在這兩者中,SmtpClient是正確處置的更重要的一個。 – hatchet 2012-07-12 18:38:46

+0

Smtp在我所針對的框架的版本中沒有實現IDisposable。有任何想法嗎? – Burt 2012-07-12 18:39:53

+2

將SmtplClient.Timeout值設置爲2,這會在您發送第一封電子郵件並強制將新連接添加到連接池後導致連接被破壞(可能)。你應該使用2的原因是因爲一個錯誤(在.NET 4中修復)使得1和0的值實際上是無窮大。 Smtp連接獨立於SmtpClient對象彙集,因此將其設置爲null或嘗試手動處理它將不起作用(並且它在4.0之前沒有Dispose方法)。 – 2012-07-12 19:15:32

相關問題