如何从ASP.NET发送大量电子邮件?

7
我为客户建立了一个网站,他们想要一个定制的通讯工具。建立工具很容易,但我不确定如何发送电子邮件。
我设置了一个测试页面,并使用System.Net.Mail命名空间成功向自己发送了一封测试电子邮件。我试图将此代码应用于通讯页面上的循环,但这证明是一项相当困难的任务。电子邮件发送循环会锁定整个网站约一个小时,而它正在发送电子邮件。有时它会在中途中止循环,其中一些电子邮件将无法发送。
我尝试在另一个线程上启动循环。
protected void btnSendNewsletter_Click(object sender, EventArgs e)
{
    Thread t = new System.Threading.Thread(new ThreadStart(SendEmails));
    t.Start();
}

但这仍然会使网站变慢,并且有中途中止的习惯。发送大量电子邮件的常见方法是什么?我确定我做得不对。
我在.NET中非常新于电子邮件领域。

6
使用服务而不是 asp.net 页面发送电子邮件。 - Joe Phillips
你使用的是哪个邮件服务器? - Caspar Kleijne
有点相关:http://stackoverflow.com/questions/3905734/how-to-send-100-000-emails-weekly/3905805#3905805 - Piskvor left the building
@Caspar,@Joe 我正在使用Arvixe主机和他们的电子邮件托管服务。在共享主机环境中创建一个服务是否可行,还是需要购买自己的服务器? - Chev
1个回答

6
对于这种任务,最好将一堆作业添加到队列中。然后运行一个线程从队列中提取x个作业进行处理(例如发送电子邮件),然后休眠一段时间。这会给你的web应用程序一些缓冲空间。
如果你使用数据库,可以创建一个电子邮件队列表来存储作业。与内存相比,我更喜欢使用此类存储方式,以防应用程序由于某些原因重新启动或抛出异常...至少你可以从上次离开的地方继续。
通常,运行工作线程的进程不会是Web应用程序本身。它将是Windows服务或类似的东西。如果你在共享主机上,则可能无法实现。

非常详细而简洁。谢谢。您知道有哪些第三方API可以注册,将负载转嫁给它们,并让它们发送电子邮件吗? - Chev
同意。虽然Chevex无法创建服务(共享主机),但您指定的方法仍将在主系统中起作用。 - IAmTimCorey
我认为最便宜的选择是让第三方处理电子邮件负载。我似乎找不到一个好的大规模电子邮件API。有没有一个流行的API是大多数人使用的? - Chev
@Chevex 在上面链接的问题的答案中推荐了一些第三方提供商:http://stackoverflow.com/q/3905734/310112 - Joel C
1
过去我曾使用MailChimp http://www.mailchimp.com/,但这需要我的应用程序从CMS创建电子邮件模板,使用名称和称呼等令牌。然后将单个令牌化的模板传递给MailChimp。 MailChimp将通过将所有令牌替换为正确的数据并发送它们来创建所有电子邮件。您可以将用户列表托管在MailChimp上,或者他们可能提供API以通过某种代理访问远程数据库。 - Lee Gunn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接