2011-12-07 37 views
2

我使用特定的類異步發送電子郵件。你可以找到原始類別here爲什麼我在C#中異步發送郵件後沒有收到所有電子郵件?

這個類使用委託函數來發送郵件:

public class Email 
    { 
     public bool SendEmail(MailMessage message) 
     { 
      try 
      { 
       SmtpClient smtpClient = new SmtpClient(); 
       smtpClient.Host = "smtp.gmail.com"; 
       smtpClient.Port = 587; 
       smtpClient.EnableSsl = true; 
       ... 
       smtpClient.Send(message); 
      } 
      catch (Exception ex) 
      { 
       ErrorLogger.SaveLog(ex); 
      } 
      return true; 
     } 
     public delegate bool SendEmailDelegate(MailMessage message); 

     public void GetResultsOnCallback(IAsyncResult ar) 
     { 
      SendEmailDelegate del = (SendEmailDelegate)((AsyncResult)ar).AsyncDelegate; 
      try 
      { 
       bool result = del.EndInvoke(ar); 
      } 
      catch (Exception ex) 
      { 
       ErrorLogger.SaveLog(ex); 
      } 
     } 

     public void SendEmailAsync(MailMessage message) 
     { 
      try 
      { 
       SendEmailDelegate dc = new SendEmailDelegate(this.SendEmail); 
       AsyncCallback cb = new AsyncCallback(this.GetResultsOnCallback); 
       IAsyncResult ar = dc.BeginInvoke(message, cb, null); 
      } 
      catch (Exception ex) 
      { 
       ErrorLogger.SaveLog(ex); 
      } 
     } 
    } 

但在我的網站在ASP.NET MVC 2的發展,當我嘗試發送電子郵件96,只有少數被接收。在我的第一次測試中,我收到了52封電子郵件和第二封57封電子郵件。

我有這個靜態類調用發送電子郵件對象

public static class EmailSender 
{ 
    private static void SendEmail(MailMessage mail) 
    { 
    Email sender = new Email(); 
    sender.SendEmailAsync(mail); 
    } 

    public static void SendRevival(UserViewModel user){ 
    ... 
    SendEmail(mailMessage); 
    } 
} 

而且我用它是這樣的:

foreach(UserViewModel user in users){ 
    EmailSender.SendRevival(user); 
} 

沒有錯誤,無論從應用還是從服務器。

有誰知道發生了什麼事?

Thx。

+1

你看過進出郵件服務器的HTTP流量嗎? – scottheckel

+2

您確認您的郵件服務器不會將它們當作垃圾郵件處理,還是因爲您使用請求「淹沒」服務器而拒絕它們? –

+4

您是否將Web服務器實例的時間足夠長,以便將它們全部發送出去。如果你關閉了這個過程,那麼它會停止發送。 –

回答

1

你看你通話到

sender.SendEmailAsync(mail); 

返回的結果,看看郵件實際發送?

我只是看着這個方法的源代碼,它這樣做:

public bool SendEmailAsync(string toEmail, string toName) 
     { 
      try 
      { 
       SendEmailDelegate dc = new SendEmailDelegate(this.SendEmail); 
       AsyncCallback cb = new AsyncCallback(this.GetResultsOnCallback); 
       IAsyncResult ar = dc.BeginInvoke(toEmail, toName, cb, null); 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
      return true; 
     } 

也就是說,代碼捕獲拋出的任何異常,只是返回false。不僅如此,在AsyncCallback中它也做同樣的事情,也就是說,它的'吃'異常,你永遠不會知道任何異常。

調試你的問題我會使用同步SendEmail電話,他的代碼(在SendEmail方法)更改爲捕獲異常,所以被調用者(你)知道發生了什麼。例如

private static void SendEmail(MailMessage mail) 
{ 
    Email sender = new Email(); 
    sender.SendEmail(mail);//modify this method as well! 
} 
+0

我改變了發送對象,你可以在第一條消息中看到它。但是我的日誌文件中沒有錯誤。通過我的最後一次嘗試,我只收到了96封電子郵件。 – Fred

+0

如果您發送到同一電子郵件地址,您是否每次都收到相同數量的收到電子郵件,或者是否有所不同? – wal

+0

我發送96郵件到相同的郵件地址(我的Gmail地址)。我從來沒有收到相同數量的電子郵件:x – Fred