2010-10-07 47 views
2

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

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

回答

4

你绝对可以在控制器中产生一个后台线程来异步处理电子邮件。

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

+1

对普通线程和'ThreadPool.QueueUserWorkItem'的任何偏好? – Omar 2010-10-08 02:27:00

0

每当类似的操作在事件发生时就会发生,总有可能出现问题。

在ASP.NET中,您可以产生多个线程并让这些线程执行操作。请确保你告诉它是一个后台线程的线程,否则可能ASP.NET路为线程渲染你的页面之前完成:

myThread.IsBackground = true; 

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

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

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

0

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

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

另一种选择是放入NServiceBus。用于这些类型的任务。

0

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

3

这可以通过许多不同的方式来完成,具体取决于您的应用程序有多大以及您需要哪种可靠性。所有的这些方法可以帮助你实现你想要的(基于复杂升序排列):

  • 如果您正在使用IIS SMTP服务器或支持一个拾取目录选择另一邮件服务器,你可以去那。使用此选项,不是直接发送电子邮件,而是先将其保存在拾取目录中。您的电话会在电子邮件保存在代答目录后立即返回,因此用户不必等到电子邮件发送完毕。另一方面,服务器将尽快发送电子邮件,一旦它被保存在提取目录中,所以它几乎是即时的(只是没有阻止呼叫)。

  • 您可以使用后台线程,如其他答案中所述。你需要小心这个选项,因为线程可以在它完成工作之前意外结束。您需要添加一些代码以确保它可靠地工作(个人而言,我不希望使用此选项)。

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

+0

用“消息队列”取代“消息报价” – 2010-10-12 09:42:52

+0

很好的答案! – 2010-10-12 09:43:14

+0

@Andrei,谢谢。固定。 – 2010-10-13 10:36:41

相关问题