我正在使用send_mass_email将电子邮件发送到用户列表。它工作正常,直到我一次发送到200多封电子邮件。 实际上电子邮件正在交付而没有问题。但是我从nginx收到超时错误,因为向所有200多封电子邮件发送电子邮件需要很长时间(超过2分钟)。
在后台运行send_mass_mail的最佳方法是什么?
答案 0 :(得分:3)
您需要将任务移至后台(因此它们不会阻止Web进程)。最常用的方法之一是使用消息传递/任务队列。
Celery是最受欢迎的分布式任务队列之一,再加上django-celery应用程序使这一点变得微不足道。
首先你需要设置芹菜(就像pip install -U celery
一样简单);以及它支持的众多消息传递代理之一。最受欢迎的是RabbitMQ;但是对于快速和脏的设置,您还可以使用existing database作为消息代理。
最后,因为这是celery + django解决的常见问题,所以有django-celery-email来处理剩下的事情。
答案 1 :(得分:3)
您可能希望查看封装此功能的django-mailer项目 - 它通过crons执行此操作,而不是使用任务队列。我已经使用了一段时间并取得了良好的效果。
答案 2 :(得分:1)
您可以在单独的帖子中发送邮件,例如:
t = threading.Thread(target=send_mass_email,
args=[messages],
kwargs={'fail_silently': True})
t.setDaemon(True)
t.start()
或者只使用cron和django管理命令=) https://docs.djangoproject.com/en/dev/howto/custom-management-commands/
答案 3 :(得分:0)
您可以将其设为管理命令,然后设置定期的cron作业以发送电子邮件,参考management command docs