通过C#网页发送大量电子邮件的最佳方式是什么?

时间:2010-12-06 17:30:06

标签: c# asp.net email

我有一个项目的一部分,我需要从网页发送1到最多2000封电子邮件。一个开源的bug跟踪器使用Thread发送电子邮件,但它充满了bug。

所以,只是想知道是否有人对如何创建一个可以发送多达2000封电子邮件的程序有任何想法?

我的一位同事告诉我,将其作为一个流程(正常例程一次发送一封电子邮件),因为无论如何处理所有电子邮件都不会花费很长时间。似乎不对,我想使用线程...也许我喜欢复杂的例程?

[额外] 我有类似的东西: foreach(在emailAddresses中的字符串电子邮件) { MailMessage mailMessage = new MailMessage(); mailMessage.To.Add(...) ... SmtpClient客户端=新的SmtpClient(); client.Send(MAILMESSAGE); }

4 个答案:

答案 0 :(得分:3)

使用System.Net.Mail发送消息;但是,您应该使用.NET 4来避免任何连接问题,因为Connect网站上存在一个错误,导致您的邮件无法发送。

不要使用线程有三个原因:

原因1 :MTA用于处理邮件重试并可以处理失败。您的代码可能不够强大,无法处理此问题。 System.Net.Mail无法开箱即用。

原因2:如果您确实使用了线程,那么您将淹没目标SMTP服务器,它将阻止您。大多数Windows SMTP中继具有超过15(或25?)个并发连接的默认块。

如果您正在处理Exchange 2010或2007,那么如果您每分钟发送超过x条消息,则会激活一个限制功能。这是每个MTA设置,需要进行调整以适应您的情况。

原因3 :执行此操作的首选方法是使用专用的IIS SMTP服务器(或Exchange ...),以允许高容量的并发连接。只需使用Sys.Net.Mail将传递任务交给邮件基础结构。邮件基础设施不需要太多。只需拥有一个允许您转发的MTA,它将代表您“智能主持”到互联网。

有关如何设置MTA的更多问题可以在@ serverfault回答。

<强>然而

如果您从ASP.NET网页发送电子邮件,则可能需要使用线程...否则会阻止UI。除此之外,我认为不需要为电子邮件生成任务运行并发线程。

最后,如果您向多个收件人发送相同的邮件,则可以使用通讯组列表或将多个目标收件人附加到同一邮件中。

答案 1 :(得分:1)

您可能不希望在为http请求提供服务的线程上发送2000封电子邮件。提交请求的用户将等待服务器响应,直到电子邮件发送,并且这是可用于处理来自其他用户的请求的一个较少的线程。如果您有许多此类请求,则可能会降低服务器性能。

相反,我会将请求发布到消息队列,并从队列中分离出服务处理项并发送电子邮件。

在asp.net应用程序中创建后台线程是另一种可能性,但最终你会遇到以下情况:

  1. 您必须拥有自己的任务队列,与正常线程池使用的任务队列分开。
  2. 您的电子邮件任务正在与提供http请求的任务竞争并可能挨饿。
  3. 话虽如此,有部署方案(共享服务器,客户部署),其中不希望引入第二个过程。但是,如果您没有这些限制,我会选择“单独的流程”,因为如果它专注于提供UI请求并将“履行”任务留给不同的服务,那么扩展您的网站会更容易。

答案 2 :(得分:0)

我认为2000需要很长时间(如果它是一个网页而用户正在等待该页面)。这取决于您的实现,但是您经常这样做,您可能希望拥有一个已经创建的“电子邮件线程”。如果没有要发送的电子邮件,则可以暂停该线程,而不是消耗任何资源。然后,当需要发送电子邮件时,您填写一个包含这些电子邮件的电子邮件队列并唤醒线程以开始发送(如果它还没有这样做)。

答案 3 :(得分:0)

如果您一次发送的邮件超过50个,则需要签订合同以便为您执行此操作。否则,您的邮件将最终出现在人们的垃圾邮件文件夹中。