来自ASP.NET MVC应用程序的SMTP邮件:数据库,队列文件夹还是异步?

时间:2014-05-14 10:02:09

标签: c# asp.net asp.net-mvc email smtp

我们使用优秀的AuthSMTP服务来处理来自MVC应用程序的外发邮件。在我们升级到.Net 4.5.1之前,我们使用SmtpMail.SendAsync通过IIS7一次发送多封电子邮件。 IIS7设置为通过AuthSMTP中继邮件。

目前,.Net中的异步代码似乎有所不同。我们回滚到SmtpMail.Send,这减缓了发送多封邮件的网站。我们正在考虑以下选项。

  1. 重写代码以使用基于任务的异步模式。我们对此感到相当困惑,但如果这是一个不错的选择,我们可以坚持下去。

  2. 将电子邮件保存到数据库,并使用作为计划任务触发的控制台应用程序发送电子邮件。我们喜欢这个选项,因为它为我们提供了已发送电子邮件的存档另一方面,我们需要点击数据库来存储电子邮件,这可能比要求IIS将传出邮件转储到队列文件夹要慢。

  3. 让IIS将外发邮件保存到队列文件夹,并编写控制台应用程序来处理该队列。我们可以将每条消息归档到磁盘上,这是一种比存储在数据库中更糟糕的归档解决方案。

  4. 其他。

  5. 有人能根据他们的经验告诉我们最高性能的解决方案吗?

    谢谢!

1 个答案:

答案 0 :(得分:4)

在单独的帖子中调用您的电子邮件功能,该功能将在后台发送电子邮件 试试这段代码。

public static void SendEmail(string from, string[] to, string[] CC, string[] BCC, string subject, string body, SMTPSettings _smtp = null)
{
    Thread email = new Thread(delegate()
    {
        SendAsyncEmail(from, to, CC, BCC, subject, body, _smtp);
    });
    email.IsBackground = true;
    email.Start();
}

private static void SendAsyncEmail(string from, string[] to, string[] CC, string[] BCC, string subject, string body, SMTPSettings _smtp = null)
{
    try
    {
        MailMessage message = new MailMessage();
        SmtpClient client = new SmtpClient();       
        if (_smtp != null)
        {
            client.Host = _smtp.SMTPServer;
            client.Port = Convert.ToInt32(_smtp.SMTPPort);
            client.EnableSsl = _smtp.SMTPEnableSSL;
            client.Credentials = new System.Net.NetworkCredential(_smtp.SMTPUserEmail, SMTPPassword);
        }

        message.From = new MailAddress(from);
        message.Subject = subject;
        message.Body = body;
        message.IsBodyHtml = true;
        foreach (string t in to)
        {
            message.To.Add(new MailAddress(t));
        }

        if (CC != null)
            foreach (string c in CC)
            {
                message.CC.Add(new MailAddress(c));
            }

        if (BCC != null)
            foreach (string b in BCC)
            {
                message.Bcc.Add(new MailAddress(b));
            }
        client.Send(message);
    }
    catch (Exception ex)
    {
        ErrorLogRepository.LogErrorToDatabase(ex, null, null, "");
    }
}