2010-02-05 190 views
11

這裏是我的代碼smtpclient「發送郵件失敗」

for(int i = 0; i < number ; i++) 
{ 
MailAddress to = new MailAddress(iMail.to); 
MailAddress from = new MailAddress(iMail.from, iMail.displayName); 
string body = iMail.body; 
string subject = iMail.sub; 
oMail = new MailMessage(from, to); 
oMail.Subject = subject; 
oMail.Body = body; 
oMail.IsBodyHtml = true; 
oMail.Priority = MailPriority.Normal; 
oMail.Sender = from; 
s = new SmtpClient(smtpServer); 
if (s != null) 
{ 
 s.Send(oMail); 
} 
oMail.Dispose(); 
s = null; 
} 

這個循環將超過60000電子郵件。但我的問題是,我在某些電子郵件中發送「發送郵件失敗」的次數是5000次,而其他一些郵件的發送次數少了一次。並且我檢查了所有這些錯誤,電子郵件有有效的電子郵件地址。不知道是什麼問題。我真的需要幫助。

編輯:這是我的異常跟蹤

Error - Failure sending mail.; Inner Ex - System.IO.IOException: Unable to read data from the transport connection: net_io_connectionclosed. at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine) at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine) at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller) at System.Net.Mail.CheckCommand.Send(SmtpConnection conn, String& response) at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, String from) at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException& exception)

+0

我相信這可以幫助任何人誰也有類似的問題。 http://support.microsoft.com/kb/2183292/en-us – curiousBoy 2013-08-27 18:00:50

回答

3

顯然這個問題得到了只是我的第三方SMTP服務器上增加隊列的大小來解決。 但聶的答案聽起來像它也是相當有用的

1

你得到了什麼錯誤是一個SmtpFailedrecipientException?如果是這樣,您可以檢查innerexceptions列表並查看StatusCode以獲取更多信息。下面的鏈接有一些很好的信息

MSDN

編輯新信息

THISIS從我所看到的,找到你的SMTP服務器問題,但你說,這只是發生在一些電子郵件。你是否使用多個smtp服務器,如果是這樣的話,也許你可以將問題簡化爲一個特別的問題,如果不是這樣,可能是因爲你發送的郵件的速度/數量正在導致你的smtp服務器出現問題。

+0

謝謝Pharabus,我修改了我的問題,例外trace.it說「net_io_connectionclosed」,這是什麼意思? – Nnp 2010-02-05 19:39:06

+0

謝謝Pharabus,我只用一個smtp服務器。我發現這個 http://forums.asp.net/t/924682.aspx,在這個論壇的最後一篇文章有​​人說使用lient.ServicePoint.MaxIdleTime = 1;那有意義嗎? – Nnp 2010-02-05 20:03:54

+0

我肯定會看看,你可以做的另一件事是在循環中放置一秒鐘左右的時間,具體取決於你想要如何使用循環(顯然,1秒暫停與60,000循環相比,增加了相當多的延遲過程) – Pharabus 2010-02-05 20:18:26

8

好了,「失敗時發送電子郵件」應該希望有更多的細節。但有幾件事可能會導致這種情況。

  1. 在 「發件人」 地址限制。如果您使用的地址不同,有些可能會被SMTP服務阻止,無法發送。
  2. 您的SMTP服務防洪可能會阻止電子郵件外出。

無論是這些還是其他錯誤之一,您都會想要查看異常和內部異常以獲得更多詳細信息。

+0

感謝Mitchel,我使用同一個「from」電子郵件地址,但其中大多數已交付。這意味着選項(2)不需要檢查? – Nnp 2010-02-05 19:14:47

+0

是的,這是非常可能的。許多SMTP服務具有X Y配置來限制。如果您捕捉到完整的例外情況(包括內部例外情況),則應該能夠更清楚地瞭解情況。 – 2010-02-05 19:39:01

+0

謝謝Mitchel,我修改了我的問題,但有異常trace.it說「net_io_connectionclosed」,這是什麼意思? – Nnp 2010-02-05 19:40:03

2

我發送大量電子郵件時經歷了同樣的問題。將deliveryMethod屬性設置爲PickupDirectoryFromIis爲我解決了這個問題。 也不要每次創建一個新的SmtpClient。

+0

謝謝聶,你使用本地smtp服務器?在我的如果我有第三方smtp(與固定ip),這項工作是否修復與第三方服務器的工作? – Nnp 2010-02-09 17:44:33

+0

好吧,與'PickupDirectoryFromIis'設置,EML文件被保存到目錄從IIS拿起電子郵件發送。您仍然可以通過更改您的本地smtp配置來進行測試:IIS->默認SMTP服務器 - >屬性 - >傳遞 - >高級,然後您可以將智能主機設置爲您的三方IP地址。 – Romhein 2010-02-09 18:20:33

1

對於我們來說,一切都很好,電子郵件是非常小的,並沒有很多他們發送和sudently它給這個錯誤。看起來,一位技術員安裝了ASTARO,它阻止了電子郵件的發送。我們得到這個錯誤,所以是的錯誤是有點神祕,但我希望這可以幫助其他人。

1

看到你的循環發送電子郵件,你只要有唯一的解決辦法的錯誤。
聲明郵件對象不在循環中,並將fromaddress指定爲用於發送郵件的循環。 fromaddress字段在您的問題的循環中一次又一次地分配。當Web服務器無法訪問郵件服務器會出現

0

此錯誤。確保Web服務器可以訪問郵件服務器,例如ping它。

0

五年後(我希望這個開發商是不是仍然在等待一個修復這個..)

我有同樣的問題,引起了同樣的錯誤:我宣佈在循環內SmtpClient

解決方法是簡單的 - 申報一次,在循環外...

MailAddress mail = null; 
SmtpClient client = new SmtpClient(); 
client.Port = 25; 
client.EnableSsl = false; 
client.DeliveryMethod = SmtpDeliveryMethod.Network; 
client.UseDefaultCredentials = true; 
client.Host = smtpAddress;  // Enter your company's email server here! 

for(int i = 0; i < number ; i++) 
{ 
    mail = new MailMessage(iMail.from, iMail.to); 
    mail.Subject = iMail.sub; 
    mail.Body = iMail.body; 
    mail.IsBodyHtml = true; 
    mail.Priority = MailPriority.Normal; 
    mail.Sender = from; 
    client.Send(mail); 
} 
mail.Dispose(); 
client.Dispose();