我们使用优秀的AuthSMTP服务来处理来自MVC应用程序的外发邮件。在我们升级到.Net 4.5.1之前,我们使用SmtpMail.SendAsync通过IIS7一次发送多封电子邮件。 IIS7设置为通过AuthSMTP中继邮件。
目前,.Net中的异步代码似乎有所不同。我们回滚到SmtpMail.Send,这减缓了发送多封邮件的网站。我们正在考虑以下选项。
重写代码以使用基于任务的异步模式。我们对此感到相当困惑,但如果这是一个不错的选择,我们可以坚持下去。
将电子邮件保存到数据库,并使用作为计划任务触发的控制台应用程序发送电子邮件。我们喜欢这个选项,因为它为我们提供了已发送电子邮件的存档另一方面,我们需要点击数据库来存储电子邮件,这可能比要求IIS将传出邮件转储到队列文件夹要慢。
让IIS将外发邮件保存到队列文件夹,并编写控制台应用程序来处理该队列。我们可以将每条消息归档到磁盘上,这是一种比存储在数据库中更糟糕的归档解决方案。
其他。
有人能根据他们的经验告诉我们最高性能的解决方案吗?
谢谢!
答案 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, "");
}
}