2011-12-07 7 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); 
      } 
     } 
    } 

をしかし、私は96通の電子メールを送信しようとすると、ASP.NET MVC 2で開発された私のウェブサイト上で、それらのほんの数は、受信されています

このクラスは、電子メールを送信するために、デリゲート関数を使用しています。私の最初のテストでは、私は52の電子メールを受信し、2番目の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では同じことを行います。つまり、Exceptionを '食べる'ことができます。例外については決して知りません。 に私は同期SendEmailコールを使用して(SendEmail方法で)彼のコードを変更しますあなたの問題をデバッグする

ませキャッチ例外ので、呼び出し先(あなたは)何が起こったのかを知っています。例:

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

送信オブジェクトを変更しました。最初のメッセージで確認できます。しかし、私はログファイルにエラーはありません。私の最後の試行で、私は96で34のEメールを受信しました。 – Fred

+0

SAMEのメールアドレスに送信すると、毎回同じ数の受信メールが届いていますか、それともそれは異なりますか? – wal

+0

私は96メールを同じメールアドレス(私のGmailアドレス)に送信します。そして私は同じ数の電子メールを受け取ることはありません:x – Fred

関連する問題