【发布时间】:2011-03-09 05:08:48
【问题描述】:
我必须编写发送时事通讯的应用程序。 发送新闻通讯成千上万的用户的最佳方式是什么? 我的要求是
- 每封邮件都单独作为收件人:
- 每封邮件都有唯一的退订链接
.net的SMTP邮件类好用吗? 我看起来可能有问题,但无法决定我应该去哪条路? 有很多建议
- 多线程 Windows 服务
- 使用邮件服务器
- 在每次发送之间添加 thread.sleep(2000)。
任何人都可以提出一个好的方法来实现这个吗?
【问题讨论】:
我必须编写发送时事通讯的应用程序。 发送新闻通讯成千上万的用户的最佳方式是什么? 我的要求是
.net的SMTP邮件类好用吗? 我看起来可能有问题,但无法决定我应该去哪条路? 有很多建议
任何人都可以提出一个好的方法来实现这个吗?
【问题讨论】:
我不建议发送 asp.net 网页,即使您确实在单独的后台线程中启动它。我认为您冒着服务器在发送过程中回收您的进程的风险,这会搞砸它。您确实需要编写某种单独的服务或应用程序来发送您的电子邮件。
最简单的选择是创建一个快速而肮脏的控制台或 Windows 窗体应用程序。
正如其他发帖人所说,日志记录也很重要。如果它失败了,您想确切地知道发送了什么以及它停止的位置,这样当您重新启动它时,您就不会再次向所有为它工作的人发送邮件。您希望能够输入发送的起始点,因此如果您需要在号码 email #5000 处重新启动,您可以。
System.Net.Mail 命名空间中的类可以正常发送邮件。
最大的问题之一是找到一个可以让您发送如此多电子邮件的电子邮件主机。大多数电子邮件主机都有限制,有时它会根据服务器条件而变化,因此如果服务器被大量使用,那么电子邮件限制将更加严格,您每小时可能只能设置 500 封电子邮件。
我们有一份时事通讯作为单独的电子邮件发送给大约 20000 人,我们不得不解决电子邮件之间的延迟问题,直到我们找到适合我们的电子邮件主机的电子邮件。我们最终在电子邮件之间有 1.2 秒,所以这可能是一个很好的起点。
我认为有一些电子邮件主机专门处理批量邮件,所以如果你收到其中一个可能不是问题。
此外,如果您托管自己的电子邮件,这可能不是问题。如果您确实托管自己的邮件,您将可以选择将邮件放在取件目录中,您可以将其全部转储到那里,然后让电子邮件服务按照自己的节奏取件。
编辑:这是添加到配置文件以设置拾取目录的设置
<system.net>
<mailSettings>
<smtp from="support@test.com" deliveryMethod="SpecifiedPickupDirectory" >
<specifiedPickupDirectory pickupDirectoryLocation="Z:\Path\To\Pickup"/>
</smtp>
</mailSettings>
</system.net>
【讨论】:
绝对不要在 ASP.NET 中这样做。这是新 Web 开发人员犯的最大错误之一。
这需要是可以处理这么大容量的 Windows 应用或服务。
【讨论】:
我已经编写了发送电子邮件的页面,但还没有达到您想要的数量。尽管如此,我还是会根据我过去实现的代码推荐以下内容:
使用 Web 应用程序将电子邮件和所有收件人地址写入数据库表。
让 ASP.NET 之外的进程实际发送电子邮件。这可以是一个设置为计划任务的 vbs 文件,或者(最好是)一个 Windows 服务。该过程将获取电子邮件的文本,附加取消订阅链接,并在成功发送后将数据库记录标记为已发送。这样,如果发送失败,它可以稍后再试(发送过程循环所有标记为未发送的记录)。
如果您需要记录发送的内容和时间,您只需将发送的记录保存在数据库表中。否则,发送成功后删除记录即可。
恕我直言,在 ASP.NET 工作进程中发送电子邮件是个坏主意,因为您不知道需要多长时间,而且如果发送失败,在页面超时之前几乎没有机会重试。
【讨论】:
创建一个网页来“设计”简报。当他们点击发送时,将简报排队到某个地方(数据库)并使用另一个程序(Windows 服务等)发送排队的信件。如果设计得当,这将提高许多倍的效率和潜在的容错能力。
【讨论】:
我在 ASPNET MVC 2、Entity Framework 中使用 System.Net.Mail 命名空间编写了一个 Newsletter 模块(作为更大系统的一部分)。它在视图中启动,实际上只是在具有支持方法的控制器中运行以进行发送。在发送每封电子邮件时,我会跟踪是否有硬弹(抛出异常)并更新该数据库记录,说明异常失败,否则我更新记录说明成功。我们还进行个性化,因此我们有“标签”,这些“标签”会被数据库中的一个额外字段(为了灵活性而存储为 XML)所取代。这有助于处理取消订阅功能。
我的代码非常简单(请不要因为我使用异常处理作为业务逻辑而责骂我;)而且它的工作原理很吸引人。
这一切都是在http://maximumasp.com 的 VPS 上完成的,该 VPS 还托管 4 个网站,流量相当可观。我们使用他们的 SMTP 服务器。我们通知他们我们需要这项服务,并且在关系方面没有任何问题。
我们在运行 Windows 2008 的机器上有 2GB 的 RAM,它每秒处理 6 封电子邮件。当网站需要它时,我们将它增加到 3GB,现在邮件输出的速度约为 20 电子邮件/秒。我们的邮件发送范围从 2,000 到 100,000 个电子邮件地址。
简而言之,ASP.NET 可用于处理邮件发送,如果您添加一些逻辑来处理记录更新,则可以减轻发送中途丢失的担忧。是的,可能有更巧妙的方法可以做到这一点。我们正在研究 MQMS 和线程,并将其分离到 Windows 服务中,以使其在我们放置更多客户端和更大列表时更加稳定和可扩展,但目前它在合理的报告和错误处理方面工作得很好。
【讨论】: