django邮件队列电子邮件不使用芹菜发送

django邮件队列电子邮件不使用芹菜发送,django,celery,django-celery,Django,Celery,Django Celery,我正在与Django 2.x一起使用 该应用程序托管在Heroku上,并使用redis作为芹菜的后端 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')

我正在与Django 2.x一起使用

该应用程序托管在Heroku上,并使用redis作为芹菜的后端

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))
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\u芹菜=False
MAILQUEUE\u QUEUE\u UP=False
将成功发送电子邮件

但这会在出现异常时导致应用程序失败。这就是为什么我想用芹菜在后台发送电子邮件的原因

app/芹菜.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))
从:

可以将cron作业设置为两种方式之一:使用管理 命令或HTTP请求。这两种方法都运行 抓取并发送电子邮件。为了减少负载,它只会尝试发送 一次30封电子邮件。可以使用更改此号码 设置中的邮件队列限制

其思想是消息排队等待发送,并且您必须手动触发工作者发送消息。首选方法是通过运行
send\u queued\u messages
management命令:

python manage.py send_queued_messages
根据您的评论:


按照文档中的这一行,而不是使用cron作业 芹菜任务工作人员将在保存后尝试发送电子邮件。这个 cron job将清理丢失的所有电子邮件。我不需要跑步
MAILQUEUE\u芹菜=True时的管理命令。

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

一旦应用程序到达发送邮件的代码,它将尝试发送邮件并暂停,直到收到响应,然后继续处理请求的其余部分

另一种选择是推迟电子邮件的发送,而不是使用与web相同的进程,而是同时使用辅助进程(worker)。这就是设置
MAILQUEUE\u芹菜=True
时发生的情况

如果您像以前那样设置
MAILQUEUE\u QUEUE\u UP=True
,则现在消息已被接受但已排队,并且必须使用管理命令或cron发送消息

因此,如果希望立即发送消息,请将
MAILQUEUE\u QUEUE\u UP
设置为
False


如果要按时间间隔成批发送消息,请将
MAILQUEUE\u QUEUE\u UP
设置为
True
,然后设置cron作业以运行管理命令。

芹菜日志中是否有错误?你试过用芹菜运行另一个简单的任务吗?我在app/Celery.py上创建了一个Celery.py文件(有问题的更新)。如何记录芹菜日志。我第一次使用芹菜,我想这可能是个问题,因为芹菜应该作为一个单独的进程运行。阅读此处如何在另一个终端选项卡中运行它您是否确实发送排队的消息
python manage.py发送队列消息
?@BurhanKhalid这是可行的。在heroku
heroku中执行时,请运行python manage.py send\u queued\u messaged
。那么,我需要以Cron的身份运行该命令吗?但是我不能每次都运行管理命令。因此,我需要设置Cron job来运行此命令?根据文档
中的这一行,芹菜任务工作人员将在保存时尝试发送电子邮件,而不是使用Cron job。cron作业将清除丢失的所有电子邮件。
当MAILQUEUE\u芹菜=True时,我不需要运行管理命令。我注意到,当MAILQUEUE\u芹菜=True时,即使是管理命令也无法发送消息。甚至在从管理界面添加到队列后也不会。如果您使用同步模式(默认),则它将自动发送。但是,您使用的是异步(排队),这意味着您需要通过管理命令手动发送批。是的,我了解您的概念。但在我的例子中,我有
MAILQUEUE\u芹菜=True
MAILQUEUE\u QUEUE\u UP=False
。所以,它应该在后台异步发送电子邮件,而不是排队等待管理命令。但当
MAILQUEUE\u芹菜=True