繁体   English   中英

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

[英]How can I schedule an email to be sent at some point in the future in django?

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

我怎么能在django或python中做到这一点?

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引擎任务队列来完成此任务 您可以为任务指定eta Google App引擎拥有丰厚的免费配额 在任务队列中,webhook使异步请求在您的服务器上获取用于发送电子邮件的URL。

我会设置一个cron工作,可以处理你想做的一切......

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

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

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

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

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

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

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

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

它有点复杂和复杂,但实际上并非如此。 如果这似乎是您想尝试的路径,请告诉我,我将使用一些代码进行编辑

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM