django邮件队列电子邮件未与芹菜一起发送

时间:2019-01-10 04:33:04

标签: django celery django-celery

我在{strong> Django 2.x

中使用Django Mail Queue

该应用程序托管在 Heroku 上,并使用 redis 后端用于 Celery

settings.py 文件包含

##################
# CELERY STUFF
##################
BROKER_URL = os.getenv('REDIS_URL', 'redis://localhost:6379')
CELERY_RESULT_BACKEND = os.getenv('REDIS_URL', 'redis://localhost:6379')
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

#######################
# Django mail queue
#######################
MAILQUEUE_CELERY = True
MAILQUEUE_QUEUE_UP = False

并发送类似电子邮件

new_message = MailerMessage()
new_message.subject = subject
new_message.to_address = to
new_message.from_address = from_email
new_message.content = text_content
new_message.html_content = html_content
new_message.app = 'Koober'
new_message.save()

在发送电子邮件时,它已保存在数据库中,并显示在“管理”页面上,但未发送。

设置MAILQUEUE_CELERY = FalseMAILQUEUE_QUEUE_UP = False成功发送电子邮件。

但是,如果发生异常,则会导致应用程序失败。这就是为什么我要使用 Celery 在后台发送电子邮件的原因。

enter image description here

app / celery.py

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'koober.settings')
app = Celery('koober')

app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

1 个答案:

答案 0 :(得分:1)

来自documentation

  

可以将cron作业设置为以下两种方式之一:使用管理   命令或HTTP请求。两种方法都运行邮件队列,   抓取电子邮件并将其发送。为了减少负载,它仅尝试发送   一次30封电子邮件。该数字可以通过使用来更改   设置中的MAILQUEUE_LIMIT

这个想法是将消息排队等待发送,并且您必须手动触发工作程序发送消息。首选方法是通过运行send_queued_messages管理命令来完成此操作:

python manage.py send_queued_messages

根据您的评论:

  

按照文档中的这一行,而不是使用cron作业   芹菜任务工作者将在保存电子邮件后尝试发送电子邮件。的   cron job会清除所有丢失的电子邮件。我不需要运行   MAILQUEUE_CELERY = True.

时的管理命令

默认情况下,该应用程序不需要celery即可工作。它同步(同时)工作-这是django的默认邮件功能的工作方式。

应用程序到达发送邮件的代码后,它将尝试发送邮件并暂停直到收到响应为止,然后继续执行其余的请求。

另一个选择是推迟发送电子邮件,而不是使用与Web相同的过程,而同时使用辅助过程(工作程序)。设置MAILQUEUE_CELERY = True时会发生这种情况。

如果您将MAILQUEUE_QUEUE_UP = True设置为已完成,则现在消息已被接受但已排队,并且必须使用管理命令或cron发送消息。

因此,如果您希望立即发送邮件,请将MAILQUEUE_QUEUE_UP设置为False

如果要间歇发送消息,请将MAILQUEUE_QUEUE_UP设置为True,然后设置cron作业以运行管理命令。