Asp.net 发送电子邮件,但不是现在

Asp.net 发送电子邮件,但不是现在,asp.net,sql,smtp,Asp.net,Sql,Smtp,我正在编写一个应用程序,用户将创建一个约会,并立即收到一封确认其约会的电子邮件。我还想在他们约会的那天发一封电子邮件,提醒他们实际到场 我正在使用MS SQL上的ASP.NET(2.0)。即时电子邮件没有问题,但我不确定处理提醒电子邮件的最佳方式。基本上,我可以想到三种方法: 设置每晚运行的SQL作业,向当天有约会的人发送SQL电子邮件 以某种方式发送带有“请勿提前交付”标志的电子邮件,尽管这似乎是我可能发明的东西 编写另一个每晚在特定时间运行的应用程序 我错过了什么明显的东西吗?我怎样才能做到

我正在编写一个应用程序,用户将创建一个约会,并立即收到一封确认其约会的电子邮件。我还想在他们约会的那天发一封电子邮件,提醒他们实际到场

我正在使用MS SQL上的ASP.NET(2.0)。即时电子邮件没有问题,但我不确定处理提醒电子邮件的最佳方式。基本上,我可以想到三种方法:

  • 设置每晚运行的SQL作业,向当天有约会的人发送SQL电子邮件
  • 以某种方式发送带有“请勿提前交付”标志的电子邮件,尽管这似乎是我可能发明的东西
  • 编写另一个每晚在特定时间运行的应用程序

  • 我错过了什么明显的东西吗?我怎样才能做到这一点呢?

    你的选择2显然像是你正在发明的东西。我知道,如果你给我发这样的邮件,我的邮件系统将不会保存邮件以备将来发送


    我认为你没有遗漏任何明显的东西。你需要一些在约会当天运行的东西来发送电子邮件。作为SQL作业还是作为单独的应用程序更好,取决于您的应用程序体系结构。

    我推荐第一种选择,使用SQL或其他应用程序每天自动运行以发送电子邮件。这很简单,而且很有效。

    Microsoft Office具有延迟交付功能,但我认为这是Outlook的功能,而不是Exchange/Mail服务器的功能,因此您必须选择选项1或3。或者选择4编写一个服务。这样,您就不必担心要运行option 3应用程序所需的预定任务。

    选择#1将是最好的选择,创建一个要发送的电子邮件表,并在发送每封电子邮件时更新该表。最好不要删除条目,而是将其标记为已发送,因为你永远不知道有一天什么时候会出现问题并想重新发送电子邮件,我在类似的设置中见过多次这种情况。

    一个警告-在web应用程序中紧密耦合初始电子邮件的传输可能会导致脆弱的体系结构(例如SMTP服务器不可用)-和丢失的邮件

    您可以通过MSMQ为初始和提醒电子邮件引入一个抽象层,并让一个服务按计划扫描队列。初始消息可以用一个表示“立即发送”的属性标记,提醒消息可以标记为“已计划”-清扫器只需发送其发现的属于“立即发送”或“已安排”且toBeSentDate>=当前日期的任何消息。消息成功发送后,可通过从队列中删除消息来结束工作单元

    这种方法确保消息不会丢失,并通过调整服务轮询间隔将负载分配到非高峰时间

    正如Rob Williams指出的那样——我对MSMQ的建议对于这个特定问题来说有点过头了……但当您开始考虑规模问题时,请记住这是一种可行的方法——您希望(或需要)最小化/减少数据库读/写活动(尤其是在处理高峰期)


    给Rob小费。

    对于每个较大的项目,我通常也会创建一个执行常规或定期任务的服务

    该服务更新其状态和数据库中某个位置的上次执行时间,以便该信息可供应用程序使用

    例如,应用程序将命令发布到命令队列,服务在计划时间处理这些命令

    我发现此解决方案比SQL Server任务或作业更容易处理,因为您只需要安装一个服务,而不需要确保正确设置所有必需的作业

    此外,由于该服务是用C#编写的,因此我手头有一种比T-SQL更强大的编程语言(加上库)


    如果需要处理的是纯T-SQL内容,则会有一个Execute_Daily存储过程,该服务将在日期更改时调用该存储过程。

    按照其他人的建议创建一个单独的批处理服务,但使用它发送所有电子邮件

    web应用程序应在数据库表中记录发送即时通知和提醒通知的需要,并用所需的发送日期/时间注释这两个记录

    使用MSMQ太过分了——您已经有了一个数据库和一个简单的应用程序。随着复杂性的增加,MSMQ或类似的东西可能有助于提高复杂性和可伸缩性

    该服务应定期(每隔几分钟到几小时)扫描数据库表,以便在不久的将来发送通知(电子邮件),发送通知,并在成功时将其标记为已发送。您最终可以利用此功能发送文本消息(SMS)或即时消息(IMs)等


    您在使用它时,应该考虑使用该服务并将其作为可重用的命令执行器。最近我用Web应用程序完成了这项Web应用程序,它需要保持与第三方提供商同步的不动产列表(MLS)数据。,那么我建议在应用程序启动时在Global.asax中剥离一个worker线程,让它睡眠、唤醒、发送电子邮件、睡眠

    因为您将无法在SQL Server计算机上运行某些内容,并且无法安装自己的服务


    我这样做,效果很好。

    关于“标记为已发送”而不是“删除”的观点非常好!我必须记住这一点…如果出于某种原因,您需要验证邮件是否已发送或重新发送某个时间段的邮件,则存储邮件发送的日期和时间可能也会很有用。Rob-您是对的-MSMQ对于他的特定问题有点过火-我的目的是介绍