为什么我在C#中异步发送电子邮件后没有收到所有电子邮件?

时间:2011-12-07 22:13:00

标签: c# email asynchronous delegates

我使用特定的类异步发送电子邮件。您可以找到原始课程here

此类使用委托函数发送电子邮件:

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 个答案:

答案 0 :(得分: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方法中)更改为 NOT 捕获异常,以便被调用者(您)知道发生了什么。例如

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