如何在django中预定将来某个时间发送的电子邮件?

时间:2011-01-19 03:16:32

标签: python django email schedule

我想安排在特定操作后发送给用户的电子邮件。 但是,如果用户采取了其他操作,我想取消该电子邮件并将其发送。

我如何在django或python中执行此操作?

5 个答案:

答案 0 :(得分:4)

Beanstalkd

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

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

<强> consumer.py:

import beanstalkc

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:

import beanstalkc

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。 Google App引擎有一个慷慨的free quota。在任务队列中,webhook使Asynchronous Requests获取服务器上用于发送电子邮件的URL。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

如果您无法访问cron,则可以轻松执行此操作:

  1. 编写一个存储电子邮件的模型,发送时间以及表明电子邮件是否已发送的BooleanField
  2. 编写一个视图,选择尚未发送但现在应该已发送的所有电子邮件,然后发送。
  3. 使用类似OpenACS UptimePingdom或任何其他能够定期发送HTTP GET请求的服务来调用该视图,并触发电子邮件发送。 (两者都是免费的,前者应该每15分钟请求一次,后者可以配置为每分钟请求一次,并且将从多个位置请求。)
  4. 当然,它不够优雅,但它是一种适用于任何网络主机的方法。当我编写PHP应用程序以在15秒之后杀死所有进程的主机上运行时,我曾经做过类似的事情。

答案 3 :(得分:0)

你正在使用芹菜吗?如果为true,请参阅http://ask.github.com/celery/userguide/executing.html#eta-and-countdown

答案 4 :(得分:0)

你说你想通过Python或Django来做,但似乎还需要其他东西。考虑到您在共享主机上,有可能安装其他软件包也可能是个问题。

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

使用javascript框架可以设置定时事件,启动/取消等等。我使用名为ExtJS的框架完成了定时事件。虽然ExtJS相当大,但我确定其他框架,如jQuery甚至原始javascript,你可以做类似的事情。

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

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