使用Celery和Amazon SES在Django中安排电子邮件

时间:2013-12-07 14:36:46

标签: python django email celery

我发现很难在Django中安排电子邮件。我一直在互联网上进行研究,但还未能解决这个问题。也许你可以帮我解决这个问题,或者至少指出我正确的方向,找出如何做到这一点。

例如,当您使用Mailgun时,您可以指定发送如下电子邮件:

def send_scheduled_message():
    return requests.post(
        "https://api.mailgun.net/v2/samples.mailgun.org/messages",
        auth=("api", "key-3ax6xnjp29jd6fds4gc373sgvjxteol0"),
        data={"from": "Excited User <me@samples.mailgun.org>",
              "to": "bar@example.com",
              "subject": "Hello",
              "text": "Testing some Mailgun awesomness!",
              "o:deliverytime": "Fri, 25 Oct 2011 23:10:10 -0000"})

我想在Django上发送类似的东西来发送电子邮件,我可以指定交货时间,就像之前的情况一样。

到目前为止,我已经安装了django-SES,我可以通过Amazon SES发送电子邮件。我还安装了Celery并且过去常常使用django-celery,但似乎不再需要从Celery 3.1开始。

总而言之,我如何使用send_mail告诉Celery等待特定日期和时间将电子邮件发送到django-SES以便他们按时交付?

谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

编写Python脚本并安排cron作业:)为什么应用程序服务器需要了解电子邮件工作?如果是,请通过具有ACID合规性的共享数据存储进行通知。

这些想法被封装在一个非常好的架构实践中,separation of mechanism from policy

基本上我们有以下内容:

  1. 该机制可能是数据库,策略将是存储在数据库中的数据,用于指示发送电子邮件的时间和发送时间。
  2. 下一个机制是python脚本,策略是python脚本中的代码。这应该至少做好工作,并指出失败或成功。
  3. 第三个是“cronjob”,其中发送时间的策略包含在crontab中,机制是读取crontab并触发效果的cron守护程序。
  4. 当然,有时候不能完全分离,但是部分分离比紧密耦合更好。最好的部分是它们中的每一个也相互分离(大多数情况下,除了可能通过互联网或操作系统)。

    对于一些复杂的问题,芹菜是一个非常大的锤子,应该避免使用大锤子恕我直言。 Django在某种程度上也是一个大锤子,它解决了许多更简单的问题,但是以一种适合一大群人的方式(我认为它试图解决的真正问题,但你必须判断或者不是适合当前工作的合适工具。)

    完成上述步骤后,每个步骤都是非常直接的任务,您将拥有一个易于理解的独立部分,因此易于修改,扩展和替换。

答案 1 :(得分:2)

基本上,我同意Derek Litz的回答。但是,根据您的要求,您可能希望查看使用cron + Django管理命令。如果这是一个非常简单的基于文本的电子邮件,那么我可能会选择Derek的解决方案。但是,如果电子邮件是基于HTML的,或者需要为每个用户提供动态,那么我可能会利用django模型和模板引擎的强大功能。我经常这样做,效果很好。