我正在编写一个用户将创建约会的应用程序,并立即收到确认其约会的电子邮件。我还想在预约当天发送电子邮件,提醒他们实际出现。
我在MS SQL上使用ASP.NET(2.0)。即时电子邮件没问题,但我不确定解决提醒电子邮件的最佳方式。基本上,我可以想到三种方法:
我错过了一些明显的东西吗?我怎么能做到这一点?
答案 0 :(得分:8)
选择#1将是最佳选择,创建要发送的电子邮件表,并在发送每封电子邮件时更新表。最好不要删除条目,但将其标记为已发送,您永远不知道何时会出现问题,并希望重新发送电子邮件,我已经在类似的设置中多次发生这种情况。
答案 1 :(得分:5)
一个警告 - 在Web应用程序中紧密耦合初始电子邮件的传输可能会导致脆弱的体系结构(例如SMTP服务器不可用) - 以及丢失的消息。
您可以通过MSMQ为初始和提醒电子邮件引入抽象层 - 并让服务按计划扫描队列。初始消息可以用一个属性来标记,这个属性意味着“现在发送” - 提醒消息可以被标记为“已安排” - 并且清扫者只需要发送它发现的“现在发送”或者是“现在发送”的任何消息“SCHEDULED”并且有一个toBeSentDate> =当前日期。消息成功发送后 - 可以通过从队列中删除消息来结束工作单元。
这种方法可确保消息不会丢失 - 并通过调整服务轮询间隔,使负载分配到非高峰时段。
正如罗伯·威廉姆斯所指出的那样 - 我对MSMQ的建议对于这个具体问题来说有点过分了......但是当你开始研究规模问题时你应该记住这个问题 - 你想要(或者需要) )最小化/减少数据库读/写活动(特别是在峰值处理期间)。
向Rob提示。
答案 2 :(得分:2)
对于每个大型项目,我通常还会创建一项执行常规或定期任务的服务。
该服务更新其在数据库中某处的状态和上次执行时间,以便该信息可供应用程序使用。
例如,应用程序将命令发布到命令队列,服务在计划时处理它们。
我发现这个解决方案比SQL Server任务或作业更容易处理,因为它只需要安装一个服务,而不是确保正确设置所有必需的作业。
此外,由于服务是用C#编写的,因此我手边有比T-SQL更强大的编程语言(加上库)。
如果它是真正需要处理的纯T-SQL内容,那么服务将在日期更改时调用Execute_Daily存储过程。
答案 3 :(得分:2)
像其他人建议的那样创建单独的批处理服务,但使用它来发送所有电子邮件。
Web应用程序应记录在数据库表中发送通知的需要,包括立即通知和提醒通知,两个记录都标有所需的发送日期/时间。
使用MSMQ是过度的 - 你已经有了一个数据库和一个简单的应用程序。随着复杂性的增加,MSMQ或类似的东西可能有助于提高复杂性和可扩展性。
服务应定期(每隔几分钟到几个小时)扫描数据库表,以便在不久的将来发送通知(电子邮件),发送它们,并在成功时将它们标记为已发送。您最终可以利用它来发送短信(SMS)或即时消息(IM)等。
当您使用它时,您应该考虑使用Command design pattern,并将此服务实现为可重用的命令执行程序。我最近使用一个Web应用程序完成了这项工作,该应用程序需要将房地产列表(MLS)数据与第三方提供商保持同步。
答案 4 :(得分:0)
你的选择2肯定似乎是你正在发明的东西。我知道我的邮件系统不会保留邮件以供将来发送,如果你要发给我这样的东西。
我认为你没有遗漏任何明显的东西。您将需要在约会当天运行的电子邮件。作为SQL作业还是单独的应用程序,这可能会更好地取决于您的应用程序架构。
答案 5 :(得分:0)
我建议使用第一个选项,使用SQL或其他应用程序每天自动运行以发送电子邮件。它很简单,而且很有效。
答案 6 :(得分:0)
Microsoft Office有一个传递延迟功能,但我认为这是一个Outlook而不是Exchange / Mail服务器的东西,所以你将不得不选择选项1或3.或选项4将是写一项服务。这样,您就不必担心计划任务可以运行选项3应用程序。
答案 7 :(得分:0)
如果您计划将此应用程序托管在廉价的托管服务(如GoDaddy)上,那么我建议的是在Application_Start中剥离Global.asax中的工作线程并让它睡眠,唤醒,发送电子邮件,睡觉......
因为您将无法在SQL Server计算机上运行某些内容,并且您将无法安装自己的服务。
我这样做,而且效果很好。