解决了异步电子邮件发送问题。我想用芹菜和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
个应用启用了迁移功能。现在,使用默认的django send_mail
核心方法,不会发送电子邮件。
如果删除EMAIL_BACKEND
选项,则电子邮件发送有效,但速度非常慢。如果不是速度,我不会首先考虑排队这个过程。
我使用MySQL数据库作为数据库后端,并且它的错误日志文件在添加任务时没有显示任何内容,所以我假设,那部分没问题。在我看来,我错过了一些基本的安装或配置部分,很容易被经验丰富的芹菜或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分钟后(没有芹菜电子邮件发送通常需要大约10-15秒),我仍然得到:
>>> result[0].status
u'PENDING'
并且在最后一次检查后15分钟(总共20次):
>>> result[0].status
u'PENDING'
所以有人可以帮我解决这个问题吗?我坚信这很简单。
真诚的,谢尔盖·阿加内佐夫。
答案 0 :(得分:4)
尝试打开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
通常如果芹菜不能将任务发送到后端,它会抛出一个错误,但是任务仍然处于待处理状态,直到工人确认它为止。
答案 1 :(得分:0)
我遇到了与我的问题评论中提到的类似问题。在我的情况下,任务发送到不同于工作人员正在收听的队列。默认情况下,工作人员会侦听celery
队列,但可以使用' -Q'进行更改。选项。默认情况下,任务也会发送到celery
队列,但是我已经设置了队列'在CELERY_EMAIL_TASK_CONFIG
中选择其他东西,没有意识到这会破坏事情。您可以通过设置环境变量KOMBU_LOG_DEBUG=1
并尝试从manage.py shell发送电子邮件来调试您的任务发送到哪个队列。我删除了队列'设置和电子邮件开始工作。我不知道您是否遇到了同样的问题,但希望这有助于您的调试。