【发布时间】:2011-05-31 08:42:19
【问题描述】:
在我目前正在编写的博客中,每当用户对某篇文章发表评论时,我都会向所有其他对该帖子发表评论的用户发送电子邮件。在这种情况下,同步或异步发送邮件的最佳方式是什么?任何人都可以共享一个代码 sn-p 用于在 .NET 中使用 System.Net.Mail 向用户列表发送电子邮件。
【问题讨论】:
在我目前正在编写的博客中,每当用户对某篇文章发表评论时,我都会向所有其他对该帖子发表评论的用户发送电子邮件。在这种情况下,同步或异步发送邮件的最佳方式是什么?任何人都可以共享一个代码 sn-p 用于在 .NET 中使用 System.Net.Mail 向用户列表发送电子邮件。
【问题讨论】:
您可能希望使用单独的网络服务来发送电子邮件。您的应用程序会将正文和电子邮件列表发送到网络服务。您可以使用 gzip 或 zip 压缩。这将使 web 服务调用非常高效(70%+ 压缩,因为数据是文本)。
现在在网络服务中,您可以使用多线程或异步操作来发送电子邮件。
编辑:如果您有专用服务器,则制作 Windows 服务可能是更好的选择。在 sql server 中创建两个表,Queued Emails 和 Send Emails(Archive)。因此,每当用户发表评论时,都要更新 Queued emails 表。现在 Windows 服务可以每 30 秒唤醒一次,从排队的电子邮件中提取所有行并异步发送所有这些行。发送电子邮件后,从表中移动/删除该行。
【讨论】:
看看这个
Sending Email with System.Net.Mail
MailMessage message = new MailMessage();
message.From = new MailAddress("sender@foo.bar.com");
message.To.Add(new MailAddress("recipient1@foo.bar.com"));
message.To.Add(new MailAddress("recipient2@foo.bar.com"));
message.To.Add(new MailAddress("recipient3@foo.bar.com"));
message.CC.Add(new MailAddress("carboncopy@foo.bar.com"));
message.Subject = "This is my subject";
message.Body = "This is the content";
SmtpClient client = new SmtpClient();
client.Send(message);
【讨论】:
我用它来异步发送邮件
SmtpClient smtp = new SmtpClient();
foreach(var mail in mailsToSend)
{
new Thread(() =>
{
smtp.Send(mail);
}
).Start();
}
【讨论】:
如果您正在考虑使用第三方服务,有一篇不错的文章介绍了 Amazon's SES Email using .NET 入门。
这对我来说效果很好,但请注意,SendGrid 刚刚宣布了与亚马逊 SES 相同的新定价,SendGrid 包含一个 SMTP 包装器,因此代码更加简单。
【讨论】:
我发布了另一个 StackOverflow 答案,解决了发送大量电子邮件的问题,clicking here 可以找到。
当然最好是异步发送电子邮件,以便能够在固定时间范围内最大限度地发送电子邮件。您可以自己执行此操作,也可以使用已编写的组件执行此操作。
我使用Fluent.NET Mail 构建和发送单个电子邮件,我使用MassMailer.NET 发送大量电子邮件。
Fluent.NET 邮件
new Mail()
.Html(new MessageTemplate()
.FromText("This is my email with {content} text")
.DataFrom(new { content = "html" })
.BetweenBraces())
.To(new MailBox(emailAddress))
.From(new MailBox(emailAddress))
.Subject("Fluent API .NET 2")
.Timeout(5000)
.SmtpServer("[your smtp server]")
.SendAsync();
MassMailer.NET
查看这篇文章,了解如何发送大量电子邮件的example。
【讨论】:
MailMessage message = new MailMessage();
message.From = new MailAddress("sender@foo.bar.com");
message.To.Add(new MailAddress("recipient1@foo.bar.com"));
message.To.Add(new MailAddress("recipient2@foo.bar.com"));
message.CC.Add(new MailAddress("carboncopy@foo.bar.com"));
message.Subject = "This is my subject";
message.Body = "This is the content";
SmtpClient client = new SmtpClient();
client.Send(message);
如果您需要使用NetworkCredential 进行身份验证,您可以找到更多信息here 或here。
同步发送?好吧,这取决于您必须发送多少。这可能很耗时。
在我必须发送大量电子邮件并且我不想挂起我的 Web 服务器的情况下,我开发了一个自定义 Windows 服务,它会定期扫描数据库、收集信息并发送电子邮件。
【讨论】: