如何通过ASP.NET发送许多电子邮件而不延迟响应

时间:2010-10-07 21:35:54

标签: asp.net-mvc email

根据用户在我的网站上执行的特定操作,必须将大量邮件发送到不同的电子邮件。是否有可能让一个单独的线程或工作人员负责发送多封电子邮件,以避免服务器的响应需要一段时间才能返回,如果有大量电子邮件需要发送?

我想避免使用系统进程或计划任务,电子邮件队列。

5 个答案:

答案 0 :(得分:4)

您绝对可以在控制器中生成后台线程,以异步处理电子邮件。

我知道你想要避免队列,但我过去做过的另一件事就是写一个Windows服务,它从数据库队列中提取电子邮件并以一定的时间间隔处理它。这样,如果要发送大量电子邮件,您可以将2个应用程序分开。

答案 1 :(得分:3)

这可以通过多种不同的方式完成,具体取决于您的应用程序的大小以及您想要的可靠性。任何这些方法都可以帮助您实现您想要的目标(基于复杂性的升序):

  • 如果您使用的是IIS SMTP服务器或支持拾取目录选项的其他邮件服务器,则可以使用它。使用此选项,它们不会直接发送电子邮件,而是首先保存在拾取目录中。电子邮件保存在取件目录后,您的电话将立即返回,因此用户无需等到电子邮件发送完毕。另一方面,服务器会在保存在拾取目录中时立即尝试发送电子邮件,这样几乎可以立即发送(只是不会阻止呼叫)。

  • 您可以使用其他答案中描述的后台线程。您需要小心使用此选项,因为线程可能会在完成其工作之前意外终止。您需要添加一些代码以确保其可靠运行(个人而言,我不想使用此选项)。

  • 使用MSMQ之类的消息队列服务器。这是更多的工作,如果你有一个大规模的应用程序或者有充分的理由不使用第一个选项和拾取目录,你可能只应该考虑这个。

答案 2 :(得分:0)

每当类似的操作取决于事件时,总会有可能出现问题。

在ASP.NET中,您可以生成多个线程并让这些线程执行操作。确保告诉线程它是后台线程,否则ASP.NET可能会在呈现页面之前完成线程:

myThread.IsBackground = true;

我知道你说你不想使用系统进程或计划任务,但是Windows服务也是一种可行的方法。方法是使用MS Queue,或者在DataBase表中保存需要完成的操作。然后每隔一分钟检查一次Windows服务并执行这些操作。

这样,如果某些内容失败(电子邮件服务器关闭),那些电子邮件/操作仍然可以完成。 它们也将被记录下来进行审计(这是非常好的)。

此方法允许您将网站作为网站运行,同时将这些任务卸载到其他服务。您需要的最后一件事是用于等待电子邮件发送的多个ASP.NET进程。让其他东西处理。

答案 3 :(得分:0)

有几种方法可以做到这一点。

您可以在数据库中存储有关消息的足够详细信息,并编写一个Windows服务来循环遍历它们并发送电子邮件。当用户提交表单时,它只是插入有关消息的所需数据,并相信服务将提取它。几乎是一个你说你不想要的电子邮件队列,但是你几乎可以在任何解决方案中排队等候。

另一种选择是放入NServiceBus。用于执行这些任务。

答案 4 :(得分:0)

我通常编译邮件正文并将其存储在数据库的表中,以及from和to地址,主题和指示电子邮件发送时间的时间戳。然后我有一个后台任务定期检查表并拉出任何尚未发送的表。此任务尝试发送每封电子邮件并相应地更新时间戳。预先存储已编译的消息体的一个优点是后台任务不必对上下文特定的数据进行任何处理,因此可能非常简单。