怀疑在MVC3中异步发送多个电子邮件

时间:2014-04-24 08:59:38

标签: c# asynchronous smtpclient

在我的应用程序中,我有一个保存和发布文章的功能。所以,当我点击"保存并发布"按钮发生了三件事:

  1. 发布的文章保存在数据库中。
  2. 通知电子邮件会向一组用户发送新文章。
  3. 发送电子邮件后,页面会重定向到"文章列表"页面没有显示电子邮件的任何成功或失败消息。
  4. 现在接收电子邮件的用户数量可能会有所不同,例如10,30,50等。我想异步发送通知电子邮件,以便在所有邮件都没有发送给接待员之前,页面不会被阻止。

    以下是来自" PublishArticle"的一段代码。行动方法

    foreach (string to in emailIds)
     {
      ArticleNotificationDelegate proc = Email.Send;                              
      IAsyncResult asyncResult = proc.BeginInvoke(subject, body, to, from, cc, null,     null, null);
     }           
    

    下面我定义了一个委托来调用Send方法

    private delegate bool ArticleNotificationDelegate (string subject, string body, string to, string from, string cc, string bcc = null);
    

    这是发送电子邮件的代码:

    public static bool Send(string subject, string body, string to, string from, string cc, string bcc = null)
        {
            bool response;
            MailMessage mail = new MailMessage();
            MailAddress fromAddress = new MailAddress(from);
            mail.To.Add(to);
            if (!string.IsNullOrWhiteSpace(cc))
            {
                mail.CC.Add(cc);
            }
            if (!string.IsNullOrWhiteSpace(bcc))
            {
                mail.Bcc.Add(bcc);
            }
            mail.From = fromAddress;
            mail.Subject = subject;
            mail.Body = body;
            mail.IsBodyHtml = true;
            mail.Priority = MailPriority.High;
    
            SmtpClient client = new SmtpClient();
            try
            {
                client.Send(mail);
                response = true;
            }          
            catch (Exception)
            {
                response = false;
            }
            finally
            {
                client.Dispose();
                mail.Dispose();
            }
            return response;
        }
    

    虽然这段代码工作正常,但我仍然想知道我的这种方法是否合适,以后不会引起任何问题。
    如果有更好的方法来实现我的目标,那么请建议我。

    注意:由于我使用的是.net framework 4.0,因此无法使用4.5中提供的Asyn await的新功能。
    我还使用了方法client.SendAsync,只需替换client.Send,我上面的Send方法中的其余代码都是相同的。在这个改变之后没有发送邮件,也没有任何例外。所以我没有接受这种改变。

1 个答案:

答案 0 :(得分:1)

  

我想异步发送通知电子邮件,以便在所有邮件都没有发送给接待员之前,页面不会被阻止。

这是一种非常危险的方法,因为如果没有活动请求,ASP.NET会随意拆除您的应用程序域。 ASP.NET不知道您已将工作排队到其线程池(通过BeginInvoke)。我建议您使用HangFire之类的解决方案可靠地发送电子邮件。