9

在解决异步电子邮件发送问题时遇到了一些困难。我想使用 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

我确实为应用程序运行了djcelery迁移komby。现在,使用默认的 djangosend_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'

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

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

4

2 回答 2

6

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

它应该是一种标准的芹菜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 无法将任务发送到后端,它会引发错误,但任务会一直挂起,直到工作人员确认它。

于 2013-07-03T07:25:10.180 回答
0

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

于 2016-07-15T04:33:06.220 回答