【问题标题】:Schedule emails in Django using Celery and Amazon SES使用 Celery 和 Amazon SES 在 Django 中安排电子邮件
【发布时间】:2013-12-24 21:43:38
【问题描述】:

我发现在 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,以便它们能够准时送达?

感谢您的帮助!

【问题讨论】:

  • Periodic tasks 对你有用吗?
  • @hack.augusto 我会调查的。谢谢。

标签: python django email celery


【解决方案1】:

编写一个 Python 脚本并安排一个 cron 作业 :) 为什么应用程序服务器需要了解电子邮件程序作业?如果有,请使用符合 ACID 的共享数据存储通知它。

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

基本上我们有以下几点:

  1. 机制可能是数据库,策略将是存储在数据库中的数据,用于指示电子邮件的发送时间和发送时间。
  2. 下一个机制是python脚本,策略是python脚本中的代码。这至少应该完成工作,并指示失败或成功。
  3. 第三个是“cronjob”,其中何时发送的策略包含在 crontab 中,机制是读取 crontab 并触发效果的 cron 守护程序。

当然,有时无法实现完全分离,但部分分离比紧密耦合的混乱要好。最好的部分是它们中的每一个也相互解耦(大部分情况下,除了可能通过互联网或操作系统)。

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

完成上述步骤后,每个步骤都是一项非常简单的任务,您将获得一个很好的解决方案,该解决方案的各个部分都易于理解,因此易于修改、扩展和替换。

【讨论】:

  • 在这种情况下,您认为 cron 作业是否比使用 Celery 更好?为什么?
  • 我实际上需要更多地了解您的问题和环境。您是否每小时发送 10,0000,000 封电子邮件?你需要多久运行一次?发送电子邮件的关键时间是什么?我只是假设因为您没有提到这些事情,这可能是一个简单的案例,可以有效地利用简单的抽象。在这种情况下会更好,因为实施、理解和维护会更快。当您需要改用 celery 时,您可以并且将会更好地理解您可能需要这样做的原因。
  • 我提到切换,有些人暗示这是浪费时间,这是不正确的。最难的部分是需求,你的简单 python 电子邮件脚本将很好地封装几乎所有需求,一旦你添加了一个需要 celery 的严格需求,你就会走得更远,并且可以重用这些知识。
  • 谢谢你的回答,德里克。我有大约 5,000 名用户,我需要安排在每天一大早提醒他们每个人。因此,它每天大约在同一时间或某个时间窗口(例如,从早上 5 点到早上 6 点)发送 5,000 封个性化电子邮件。
  • 是的,cron 可以轻松做到这一点。通过首先制作简单的脚本来测试它,看看它是否满足您的需求(错误处理、日志记录等),您甚至不需要连接 cron 或发送那么多电子邮件即可开始测试。如果您在 cronjob 完成运行时发送通知,并且如果它没有显示出来,那么您超级偏执,那就是有问题 :) 从那里迭代并使其越来越好地满足您的个人需求。
【解决方案2】:

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

【讨论】:

  • 你说得对,我正在考虑为每个收件人定制的 HTML 电子邮件。我可以请您更具体地说明您实际上是如何做到的吗?谢谢。
  • 你对哪一部分感到困惑?
  • 可以在独立的 python 脚本中使用 django 模板,对吗?如果不是(老实说,我不知道为什么不,我对 django 的模板语言不太熟悉),只需使用 mako 或 cheetah。这些是基于文本的模板语言,没有任意限制。
  • 大卫,我知道该怎么做。谢谢!
  • 好。作为 SO 用户,您应该选择一个答案,或者创建自己的答案来记录您为解决问题所做的工作。
猜你喜欢
  • 2020-08-28
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2016-12-10
  • 1970-01-01
相关资源
最近更新 更多