【问题标题】:How can I schedule an email to be sent at some point in the future in django?如何在 django 中安排将来某个时间发送的电子邮件?
【发布时间】:2011-06-11 12:17:25
【问题描述】:

我想安排在执行特定操作时向用户发送电子邮件。 但是,如果用户采取其他操作,我想取消该电子邮件并且不发送。

我将如何在 django 或 python 中做到这一点?

【问题讨论】:

    标签: python django email schedule


    【解决方案1】:

    【讨论】:

    • 我查看了 celery,但不确定它是否可以在共享主机上运行,​​因为它需要您启动守护进程等。据我了解,我的主机(dreamhost)会在一段时间后杀死进程。
    【解决方案2】:

    我会设置一个 cron 作业,它可以处理你想做的所有事情......

    【讨论】:

    • Cron 看起来不太好,原因如下:1) 共享主机,2) 难以维护且不是很优雅。
    • cron 作业的另一个问题是我希望在用户操作后 5 分钟左右发送一封电子邮件,而不是批量发送。
    【解决方案3】:

    豆茎

    如果您可以安装 beanstalkd 并从命令行运行 python 脚本,我会使用它来安排电子邮件。使用beanstalkc 客户端,您可以轻松完成此操作。在 ubuntu 上,您可能首先需要安装:

    • sudo apt-get install python-yaml python-setuptools

    consumer.py:

    进口豆茎c

    def main():
        beanstalk = beanstalkc.Connection(host='localhost', port=11300)
        while True:
            job = beanstalk.reserve()
            print job.body
            job.delete()
    
    
    if __name__ == '__main__':
        main()
    

    将在 producer.py 插入作业 5 秒后打印作业。当然,当您想要安排您的电子邮件时,这应该设置更长的时间,但出于演示目的,它会这样做。您不想在测试时等待半小时来安排消息;)。

    producer.py:

    进口豆茎c

    def main():
        beanstalk = beanstalkc.Connection(host='localhost', port=11300)
        jid = beanstalk.put('foo', delay=5)
    
    if __name__ == '__main__':
        main()
    

    GAE 任务队列

    您也可以使用Google App engine task queue 来完成此操作。您可以为您的Task 指定eta。谷歌应用引擎有一个慷慨的free quota。在任务队列 webhook 中创建 Asynchronous Requests 以在您发送电子邮件的服务器上获取 URL。

    【讨论】:

      【解决方案4】:

      如果您无权访问cron,您可以轻松做到这一点:

      1. 编写一个模型来存储电子邮件、发送时间和一个BooleanField,指示电子邮件是否已发送。
      2. 编写一个视图,选择所有尚未发送但现在应该发送的电子邮件,然后发送它们。
      3. 使用类似OpenACS UptimePingdom 或任何其他能够定期发送HTTP GET 请求的服务来调用该视图,并触发电子邮件发送。 (两者都是免费的,前者应该每 15 分钟请求一次,后者可以配置为最多每分钟请求一次,并且会从多个位置请求。)

      当然,这很不雅,但它是一种基本上适用于任何网络主机的方法。当我编写 PHP 应用程序以在大约 15 秒后杀死所有进程的主机上运行时,我曾经做过类似的事情。

      【讨论】:

      • +1 这对我来说非常有效,可以快速启动和运行。谢谢。
      【解决方案5】:

      您说您想通过 Python 或 Django 来完成,但似乎需要涉及其他一些事情。考虑到您在共享主机上,安装其他软件包也可能会出现问题。

      另一种可能的解决方案可能是这样的:

      使用可以设置定时事件、启动/取消它们等的 javascript 框架。我使用名为 ExtJS 的框架完成了定时事件。尽管 ExtJS 相当大,但我确信其他框架(例如 jQuery 甚至原始 javascript)也可以做类似的事情。

      为用户操作设置一个任务,该任务将在 5 分钟内执行。该操作可能是对发送电子邮件的 python 脚本的 ajax 调用...如果用户执行了需要停止任务的操作,只需取消该事件。

      这看起来有点复杂和令人费解,但事实并非如此。如果这似乎是您想尝试的路径,请告诉我,我将使用一些代码进行编辑

      【讨论】:

        猜你喜欢
        • 2014-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 2021-06-30
        • 2020-05-03
        • 2018-07-24
        相关资源
        最近更新 更多