将asp.net中的简报发送到大约10000封电子邮件

时间:2010-06-28 15:51:11

标签: asp.net email smtp

我必须编写发送简报的申请。 发送简讯用户的最佳方式是什么? 我的要求是

  1. 每封邮件分别为:
  2. 每封邮件都有唯一的取消订阅链接
  3. 使用.net的SMTP邮件类是好的吗? 我看起来可能有问题,但不能决定我应该去哪个approcah? 有很多建议

    1. 多线程Windows服务
    2. 使用邮件服务器
    3. 在每次发送之间添加thread.sleep(2000)。
    4. 任何人都可以提出好的方法来讨论这种情况吗?

5 个答案:

答案 0 :(得分:8)

我不推荐使用asp.net网页发送,即使你是在一个单独的后台线程中启动它。我认为你冒着服务器在发送过程中回收你的进程的风险,这会搞砸它。您真的需要编写某种单独的服务或应用程序来发送您的电子邮件。

最简单的选择是创建一个快速而脏的控制台或Windows窗体应用程序。

此外,日志也很重要,就像另一张海报所说的那样。如果它失败了你想要确切地知道发送了什么以及停止了什么,这样当你重新启动它时,你不会邮寄所有它再次工作的人。您希望能够输入发送的起始点,因此如果您需要重新启动号码电子邮件#5000,您可以。

System.Net.Mail命名空间中的类可以很好地发送邮件。

最大的问题之一是找到一个可以让你发送这么多电子邮件的电子邮件主机。大多数电子邮件主机都有限制,有时它会根据服务器条件而改变,因此如果服务器使用频繁,那么电子邮件限制将更加严格,而且您每小时只能设置500封电子邮件。

我们有一份新闻通讯,大约20000人作为单独的电子邮件发送,我们不得不玩电子邮件之间的延迟,直到我们发现一个适用于我们的电子邮件主机的邮件。我们在电子邮件之间的结束时间为1.2秒,因此这可能是一个很好的起点。

我认为有电子邮件主机专门用于批量邮件,所以如果你得到其中一个可能不是问题。

此外,如果您托管自己的电子邮件,这可能不是问题。如果您确实托管了自己的邮件,您可以选择将邮件放在提取目录中,然后您可以根据需要将其全部转储到那里,然后让电子邮件服务按照自己的步调进行提取。 / p>

编辑:以下是添加到配置文件以设置拾取目录的设置

<system.net>
    <mailSettings>
        <smtp from="support@test.com" deliveryMethod="SpecifiedPickupDirectory" >
            <specifiedPickupDirectory pickupDirectoryLocation="Z:\Path\To\Pickup"/>
        </smtp>
    </mailSettings>
</system.net>

答案 1 :(得分:2)

绝对不要在ASP.NET中这样做。这是新Web开发人员犯的最大错误之一。

这需要是一个可以处理这么多音量的Windows应用程序或服务。

答案 2 :(得分:1)

我写的是发送电子邮件的页面,但不是你自己的卷。尽管如此,我会根据我过去实施的代码推荐以下内容:

  • 使用Web应用程序将电子邮件和所有收件人地址写出到数据库表中。

  • 让一个不在ASP.NET之外的进程实际发送电子邮件。这可以是设置为计划任务的vbs文件,或(优选地)Windows服务。该过程将采用电子邮件的文本,附加取消订阅链接,并在发送成功后将数据库记录标记为已发送。这样,如果发送失败,它可以稍后再试(发送过程循环遍历标记为未发送的所有记录)。

  • 如果需要记录发送的内容和时间,只需将发送的记录保存在数据库表中即可。否则,只需删除成功发送的记录。

恕我直言,在ASP.NET工作进程中发送电子邮件是一个坏主意,因为你不知道它需要多长时间,如果发送失败,那么在页面超时之前几乎没有机会重试。

答案 3 :(得分:1)

创建一个网页以“设计”时事通讯。当他们点击发送时,将时事通讯排到某处(数据库)并使用另一个程序(Windows服务等)发送排队的信件。如果设计得当,这将更有效并且具有潜在的容错能力。

答案 4 :(得分:1)

我在ASPNET MVC 2,Entity Framework和使用System.Net.Mail命名空间编写了一个Newsletter模块(作为更大系统的一部分)。它在视图中被启动,实际上只是在控制器中运行,并带有支持方法来执行发送。在发送每封电子邮件时,我会跟踪是否存在硬布料(抛出异常)并更新该数据库记录,说明发生异常,否则我更新记录表明成功。我们还进行个性化设置,因此我们将“标签”替换为数据库中的额外字段(为了灵活性而存储为XML)。这有助于处理取消订阅功能。

我的代码非常简单(请不要因使用异常处理作为业务逻辑而激怒我;)它就像魅力一样。

这一切都是在http://maximumasp.com的VPS上完成的,它还拥有4个流量相当不错的站点。我们使用他们的SMTP服务器。我们通知他们我们需要这项服务并且在关系方面没有任何问题。

我们在运行Windows 2008的计算机上有2GB内存,每秒发送6封电子邮件。我们将其提升到3GB,因为网站需要它,现在邮件大约每天20emails。我们的邮件范围从2,000到100,000个电子邮件地址。

简而言之,ASP.NET可用于处理邮件发送,如果您添加一些逻辑来处理记录更新,则可以减轻丢失中间发送方式的担忧。是的,可能有更明智的方法来做到这一点。我们正在寻找MQMS和线程,并将其分离到Windows服务,以使其更稳定和可扩展,因为我们放置了更多客户端和更大的列表,但是现在它可以正常工作,具有合理的报告和错误处理。