2012-11-12 139 views
1

我有ASP.NET MVC应用程序,我需要在用户离开页面后以“X”分钟(每个用户时间不同)发送电子邮件。 我该怎么办?如何延迟发送电子邮件?

+0

嗯。这不会是直接的。你可以实现一个cron作业,让一个url发送电子邮件,并从你的服务器X分钟呼叫这个URL。这只有在你的服务器上有这种控制的情况下才有效。或者,如果你有不错的流量,在每一个新的请求你检查以前的记录,看看是否已经通过这些分钟,然后你发送你的邮件。 – gideon

+0

这应该委托给某种服务。 –

+0

Downvotes应该被评论。我没有看到这个问题有什么问题。如果您认为解决方案具有挑战性,那并不意味着问题就不好。我可以清楚地明白他在问什么。 – AaronLS

回答

3

Http是无状态的,并且时间响应被发送给页面执行完成。您需要一个application that will be sending mail even website is not accessed by some body for a significant time interval。您可以将需要在一段时间后发送的邮件放入数据库中。另一个应用程序可能是一个windows服务,它会在固定的时间间隔(例如30秒)后汇集数据库,并发送已达到发送时间的邮件。

+0

我同意。如果这些电子邮件很重要,那么将它们放入数据库表中非常重要,这样您的服务即可读取表格并发送电子邮件,从而可以在事务中执行此操作。如果你没有使用数据库,并将它们排队到某种服务中,那么它们只存在于内存中,直到时间流逝,并且它们被发送。因此,如果服务停止,排队的电子邮件将会丢失。这取决于这些电子邮件的重要性。它也会比服务必须跟踪电子邮件表现更好。相反,它只是轮询表并查看哪些SendAtTime <= DateTime.Now(或UTC?) – AaronLS

1

我会选择的解决方案取决于您所要构建的系统所需的规模和可靠性。

如果它是一个低规模(即1服务器在同一时间不太多的用户),非关键任务系统(即它是确定是否时不时一些邮件实际上并未发送,例如,如果你的服务器崩溃),那么解决方案可以像管理内存中的队列一样简单,使用线程可以定期唤醒,以便将电子邮件发送给最近离开页面的用户。

如果您需要构建一些非常可靠且可能需要在短时间内发送大量电子邮件的东西,并且如果您的系统需要扩展到很多机器,那么您会希望构建一种基于某些存储中的队列的解决方案,其中尽可能多的机器会挑选物品并处理它们。如果您需要真正的高规模和可靠性,则Windows Azure队列服务等API可以很好地适用于此。