簡體   English   中英

SmtpClient.SendAsync()沒有收到我發送的所有郵件

[英]SmtpClient.SendAsync() not receiving all messages I sent

我剛剛編寫了一些測試代碼,查看System.Net.Mail.SmtpClient向我自己發送相同的消息。

int numClients = 10;
List<SmtpClient> mailClients = new List<SmtpClient>();
for (int i = 0; i < numClients; i++) {
    mailClients.Add(new SmtpClient(smtpHost));
}

MailMessage msg = new MailMessage("myAddress@eg.com", "myAddress@eg.com", "test message", "" );
foreach (SmtpClient c in mailClients) {
    c.SendAsync(msg, null);
}

這一切都很好並且執行沒有任何問題,只是我只收到'n - 1'消息。 即如果我發送10條消息,我只在收件箱中收到9條消息。 如果我發送50我只收49等

注意:如果我更改代碼以使用阻止發送,那么我將始終收到正確數量的消息。 例如

foreach (SmtpClient c in mailClients) {
    c.Send(msg);
} 

有任何想法嗎?

以下是一些可能有用的觀察結果:

  • 只創建一個SmtpClient。
  • 改為創建多條消息。
  • SmtpClient實現了IDisposable。 包裹它使用
  • MailMessage還實現了IDisposable。

我懷疑你可能遇到了多個SmtpClient實例的錯誤/問題,這些實例都包裝了同一個SMTP服務器。 使用單個實例可以解決問題。

UPDATE

每個MSDN:

調用SendAsync后,必須等待電子郵件傳輸完成后再嘗試使用Send或SendAsync發送另一封電子郵件。

http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx

因此,根據您的情況,使用SendAsync over Send幾乎沒有任何好處。 您的循環可能正在踩東西,因為您不等待以前的SendAsync完成。

以下是一些想法:

  • 如果您要發送大量電子郵件,SendAsync將執行與Send幾乎相同的操作。 只需使用發送。
  • 如果需要並行發送,請使用生產者/消費者模式。 一個(或多個)生成線程將內容轉儲到隊列中以發送,並且多個消費線程各自使用一個SmtpClient來發送消息。 使用BlockingCollection實現這種模式非常簡單。 請參閱MSDN中的示例http://msdn.microsoft.com/en-us/library/dd267312.aspx
  • 如果使用足夠的線程,則SMTP服務器將成為瓶頸。 注意你何時超載它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM