怀疑是否在MVC3中异步发送多封电子邮件

本文关键字:电子邮件 异步 是否 MVC3 怀疑 | 更新日期: 2023-09-27 17:59:54

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

  1. 已发布的文章将保存在数据库中
  2. 一封通知电子邮件发送给一组用户,通知他们有新文章可用
  3. 发送电子邮件后,页面被重定向到"文章列表"页面,不显示任何电子邮件的成功或失败消息

现在,将收到电子邮件的用户数量可能会有所不同,比如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.Send使用了方法client.SendAsync,并且我在上述Send方法中的其余代码也是相同的。在这次更改之后,没有发送任何邮件,也没有抛出任何异常。所以我没有同意这个改变。

怀疑是否在MVC3中异步发送多封电子邮件

我想异步发送通知电子邮件,这样页面就不会被屏蔽,直到所有的邮件都没有送到他们的前台。

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