Django:在后台发送电子邮件的最佳方法是什么?

8
我正在使用 Django(使用 Webfaction)发送电子邮件。但是这很慢,因此我想在后台发送电子邮件,即使尚未发送电子邮件也向用户返回响应。
有什么好的方法可以做到这一点吗?
我已经了解了 celery,但它似乎需要进行很多设置:http://markliu.me/2011/sep/29/django-celery-on-webfaction-using-rabbitmq/ 这没关系,但在尝试之前,我想知道这是否是正确的方法。
线程怎么样?http://www.artfulcode.net/articles/threading-django/ 还是 cron 作业?http://docs.webfaction.com/software/general.html 您有其他经验吗?

可能是cron作业。简单而无瑕疵。 - freakish
许多人使用 https://github.com/jtauber/django-mailer。 - dani herrera
4个回答

6

让我们简单概述一下可能的解决方案:

  1. 线程是不好的解决方案 - 因为它们只在你的响应发送之前存在。

  2. Celery - 是标准方式,很容易添加到django中(只需查看关于django-celery的大量教程之一,对于使用数据库作为代理的任务来说已经足够了)

  3. 定时任务 - 不是真正好的程序员方式,因为你的代码将存储在你的repo和系统crontab中。所以每次你都要考虑这个问题。

  4. 另一种方法是使用类似Eventlet或Gevent的东西。绿色线程将在闲置时工作,并且对于您的标准任务-非常容易添加。缺点:您应该了解有关greenlets的很多内容,您应该小心捕获greenlet中的错误。

我建议使用Celery,因为它现在很容易添加,有很多教程和文档。此外,它将很容易随着您的应用程序的增长而发展。


1
我会尝试使用Celery,并在之后评论它的表现。可能需要一段时间,因为我同时还在处理其他事情。 - user984003
因为它们只在您的响应未发送之前保持活动状态。 - ThiefMaster
1
@rustem,你能解释一下,“因为它们只在你的响应发送之前存在”吗? - Aniket Singla

2

我可能会选择使用Python RQ。这是一个比Celery更为简洁的替代方案,非常容易安装和使用。但它需要使用redis。


1
我强烈建议使用Celery。它并不像看起来那么复杂,是一个非常好的工具,用于执行任意异步任务。然而,使用Django和标准cron作业可以轻松地进行后台电子邮件处理。
首先,创建一个Django模型以保存要发送的电子邮件。
class EmailsToSend(models.Model):
  email = models.Email...
  .
  . 
  .

接下来,创建一个Django管理命令来发送未发送的电子邮件。请参阅Django文档以获取有关如何执行此操作的更多详细信息。以下代码为您提供了基本思路。
class Command(BaseCommand):

    def handle(self, *args, **options):
        emails = EmailsToSend.objects.all()
        for email in emails:
           send_my_email(email)
           email.delete()

然后您可以使用cron作业计划此命令。但是,我个人更喜欢使用Celery或类似工具。这需要一些额外的工作,但从长远来看会得到回报。


1

这取决于您的应用程序规模。如果计划保持最小和小型,则线程可以正常工作,cronjobs也可以。但是,您很快就会想要将许多工作委托给后台以加快请求/响应时间。因此,在Webfaction上设置celery+rabbit是一个半复杂的任务(我曾经在那里),但从长远来看,您将节省时间和精力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接