【问题标题】:django-celery-email task isn't executeddjango-celery-email 任务未执行
【发布时间】:2013-06-30 18:45:40
【问题描述】:

在解决异步电子邮件发送问题时遇到了一些困难。我想使用 celery 和 django 数据库作为后端。因为目前我唯一想使用此队列管理工具的就是电子邮件,所以我也安装了 django-celery-email。

按照说明,我已对我的设置文件进行了此类更新:

import djcelery
djcelery.setup_loader()

INSTALLED_APPS += ('kombu.transport.django',
                   'djcelery',
                   'djcelery_email')

BROKER_URL = 'django://'
EMAIL_BACKEND = 'djcelery_email.backends.CeleryEmailBackend'

我正在使用具有此类设置的默认 django SMTP:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'cs*****@gmail.com'
EMAIL_HOST_PASSWORD = '*********'
EMAIL_PORT = 587

我确实为djcelerykomby 应用程序运行了迁移。现在,使用默认的 django send_mail 核心方法,不会发送电子邮件。

如果删除EMAIL_BACKEND 选项,电子邮件发送工作,但非常慢。如果不是为了速度,我首先不会寻找排队这个过程。

我使用 MySQL 数据库作为数据库后端,它的错误日志文件在添加任务时没有显示任何内容,所以我认为这部分很好。在我看来,我错过了一些基本的安装或配置部分,经验丰富的 celery 或djcelery 用户很容易发现,但像我这样的新手可能会错过。

更新 django shell 解决方法:

>>> from django.core.mail import send_mail
>>> from django.conf import settings
>>> result = send_mail('test send', 'test_send_body_text', settings.EMAIL_HOST_USER,    'hornswf@gmail.com')
>>> result[0].status
u'PENDING'
>>> result[0].ready()
False
>>> result[0].failed()
False
>>> result[0].info
>>> result[0].result

等待 5 分钟后(没有 celery 邮件发送通常需要大约 10-15 秒),我仍然得到:

>>> result[0].status
u'PENDING'

15 分钟后形成最后一次检查(总共 20 个):

>>> result[0].status
u'PENDING'

那么任何人都可以帮助我解决这个问题吗?我坚信这很简单。

此致,谢尔盖·阿加尼佐夫。

【问题讨论】:

  • 在没有 celery 的情况下使用当前后端发送电子邮件是否适合您?
  • 嗯,不确定您是否理解正确。如果我在settings 文件中评论EMAIL_BACKEND 行,那么电子邮件发送就可以了,尽管需要大量时间来处理这样的查看请求......
  • 我也遇到了这个问题,使用 celery 4.0.0rc3 和 django-celery-email 1.1.4。我想我已经验证了调用 send_mail 会导致发送 AMQP 消息(使用 RabbitMQ Web Admin 界面),但由于未知原因,工作人员似乎没有收到它(AMQP 消息留在队列中)。我已验证任务已正确注册,并且发件人和工作人员都在与同一个经纪人交谈。不确定如何进一步调试。

标签: python django django-celery


【解决方案1】:

我在对您的问题的评论中提到了类似的问题。在我的情况下,任务发送到与工作人员正在收听的队列不同的队列。默认情况下,worker 侦听celery 队列,但可以使用“-Q”选项进行更改。默认情况下,该任务还将发送到celery 队列,但是我已将CELERY_EMAIL_TASK_CONFIG 中的“队列”选项设置为其他内容,但没有意识到这会破坏事情。您可以通过设置环境变量 KOMBU_LOG_DEBUG=1 并尝试从 manage.py shell 发送电子邮件来调试您的任务发送到哪个队列。我删除了“队列”设置,电子邮件开始工作。我不知道您是否遇到同样的问题,但希望这对您的调试有所帮助。

【讨论】:

    【解决方案2】:

    尝试打开 shell,尝试使用 djcelery 电子邮件后端发送电子邮件并检查 result

    它应该是标准的 celery AsyncResult,它可以为您提供有关正在发生的事情的更多信息。

    引用文档

    results will be a list of celery AsyncResult objects that you may ignore, or use to check the status of the email delivery task, or even wait for it to complete if want. You have to enable a result backend and set ignore_result to False in CELERY_EMAIL_TASK_CONFIG if you want to use these. See the Celery docs for more info.

    编辑

    PENDING 状态通常用于等待执行或未知的任务。

    Task is waiting for execution or unknown. Any task id that is not known is implied to be in the pending state.

    仔细检查您是否已经启动了您的工作人员:

    ./manage.py celeryd -B
    

    通常,如果 celery 无法将任务发送到后端,它会引发错误,但任务会一直挂起,直到工作人员确认它。

    【讨论】:

    • 我明白你在说什么。我已经用 django-shell 的信息表更新了我的问题。
    • 那么如果你有CELERY_EMAIL_TASK_CONFIG = { 'ignore_result': False,} 并仔细检查了......我没有更多线索,对不起。
    • 得到了答复,服务器端的时间完全错误,与一个模块冲突,不允许 celery 执行。
    • 我现在正在解决同样的问题。看起来 djcelery 不再为现代 django 安装服务。 Celery 现在直接支持 django,以防其他人偶然发现。