我在{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 = False
和MAILQUEUE_QUEUE_UP = False
成功发送电子邮件。
但是,如果发生异常,则会导致应用程序失败。这就是为什么我要使用 Celery 在后台发送电子邮件的原因。
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))
答案 0 :(得分:1)
可以将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作业以运行管理命令。