【问题标题】:sending an email, but not now发送电子邮件,但不是现在
【发布时间】:2010-09-24 05:56:00
【问题描述】:

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

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

  1. 设置每晚运行的 SQL 作业,将 SQL 电子邮件发送给当天有约会的人。
  2. 以某种方式发送带有“之前不发送”标志的电子邮件,尽管这似乎是我可能正在发明的东西。
  3. 编写另一个在每晚特定时间运行的应用程序。

我是否遗漏了一些明显的东西?我怎样才能做到这一点?

【问题讨论】:

    标签: asp.net sql smtp


    【解决方案1】:

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

    【讨论】:

    • 关于“标记为已发送”而不是“删除”的观点非常好!我必须记住这一点......
    • 如果出于某种原因您需要验证消息是否已发送或在某个时间段内重新发送消息,则存储发送消息的日期和时间也可能很有用。
    【解决方案2】:

    一个注意事项 - 在 Web 应用程序中紧密耦合初始电子邮件的传输可能会导致架构脆弱(例如 SMTP 服务器不可用) - 并丢失消息。

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

    此方法可确保消息不会丢失 - 并通过调整服务轮询间隔将负载分配到非高峰时段。

    正如 Rob Williams 指出的那样——我对 MSMQ 的建议对于这个特定问题有点矫枉过正……但当你开始考虑规模问题时,这是一种可行的方法——并且你想要(或需要) ) 以最小化/减少数据库读/写活动(尤其是在高峰处理期间)。

    向 Rob 致敬。

    【讨论】:

      【解决方案3】:

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

      该服务会在数据库中的某处更新其上次执行的状态和时间,以便应用程序可以使用这些信息。

      例如,应用程序将命令发布到命令队列,然后服务在计划时间处理它们。

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

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

      如果真的是纯 T-SQL 的东西需要处理,就会有一个 Execute_Daily 存储过程,服务将在日期更改时调用它。

      【讨论】:

        【解决方案4】:

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

        网络应用程序应在数据库表中记录发送通知的需要,包括即时通知和提醒通知,这两个记录都标有所需的发送日期/时间。

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

        该服务应定期(每隔几分钟到几个小时)扫描数据库表以查找在不久的将来要发送的通知(电子邮件),发送它们,如果成功则将它们标记为已发送。您最终可以利用它来发送短信 (SMS) 或即时消息 (IM) 等。

        当您使用它时,您应该考虑使用Command design pattern,并将此服务实现为可重用的命令执行器。我最近使用需要与第三方提供商保持房地产列表 (MLS) 数据同步的 Web 应用程序来完成此操作。

        【讨论】:

        • Rob - 你是对的 - 对于他的具体问题,MSMQ 有点矫枉过正 - 我的意图是引入一些替代思维。
        • Rob - 您能否提供有关此命令设计模式以及如何将此服务作为可重用命令执行器的更多信息?这听起来很有趣。我也在考虑 MSMQ。
        【解决方案5】:

        您的选项 2 确实看起来像是您正在发明的东西。我知道如果您要向我发送类似的邮件,我的邮件系统将不会保留邮件以供将来投递。

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            Microsoft Office 具有传递延迟功能,但我认为这是 Outlook 的事情,而不是 Exchange/Mail Server 的事情,所以你将不得不选择选项 1 或 3。或者选项 4 是写一项服务。这样您就不必担心计划任务来运行选项 3 应用程序。

            【讨论】:

              【解决方案8】:

              如果您打算将此应用程序托管在便宜的托管服务(如 GoDaddy)上,那么我建议您在 Application_Start 的 Global.asax 中分离一个工作线程并让它休眠、唤醒、发邮件,睡觉...

              因为您将无法在 SQL Server 机器上运行某些东西,并且您将无法安装自己的服务。

              我这样做了,效果很好。

              【讨论】:

                猜你喜欢
                • 2020-05-03
                • 2011-09-16
                • 1970-01-01
                • 2010-11-26
                • 2019-04-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-03-09
                相关资源
                最近更新 更多