一、起因:celery收到发送邮件任务没反应(无限等待)- 阿里云ECS-CentOS7
最近用阿里云部署Django项目,用celery处理发送邮件任务,celery服务已经启动,能Received task,但是收到任务后无限等待,没有进行Task xxx succeeded in.
-
我一直以为是celery没有配置好的问题,百度各种无果。
以为是代码问题?看了又看,没问题啊、、、以为是 时区问题?AsiaShanghai? 没有效果。。。。。。 -
遂尝试放弃celery,开启一个线程去处理发送邮件的任务,发现线程一直在等待处理任务???那么就不是celery的问题了,是发送邮件的问题。
原来是如此,这damn的亲爱的阿里云把25端口给禁用了,导致无法发送邮件!!!
二、解决无法发送邮件的问题
Django项目的settings.py文件添加代码:
''' 阿里云Django邮件服务器配置 '''
# 其他配置不变,修改:
DEFAULT_FROM_EMAIL = 'xxxx@163.com' # 默认邮件发送方:和发送邮箱的用户名相同
EMAIL_PORT = 465 # 修改Email端口为465或587,二选一,用不了换另一个
EMAIL_USE_SSL = True # 使用SSL
# EMAIL_USE_TSL = False # 禁用TSL
配置之后,再次尝试!!!
启动发送邮件的celery任务
Linux启动celery任务
celery -A celery_tasks.tasks worker -l info
Windows启动celery任务
celery -A celery_tasks.tasks worker -l info -P eventlet
发送邮件测试
在项目路径下输入python3,进入python3交互环境。
[root@banana ~]# cd 你的项目路径
[root@banana 你的项目路径]# python3
>>> from celery_tasks.tasks import send_register_active_email
>>> to_email = 'xxxx@qq.com'
>>> username = 'helloworld'
>>> token = 'thistoken'
>>> send_register_active_email.delay(to_email, username, token)
<AsyncResult: e5122c2a-75b9-4b6a-bccf-650f5e8c41f2>
测试成功!
[2020-06-01 13:37:46,114: INFO/ForkPoolWorker-1] Task celery_tasks.tasks.send_register_active_email[c43f36a7-3c41-45a0-bac0-18b059c5ccdb]
succeeded in 3.290678153047338s: None
SSL和TSL的Django文档
EMAIL_USE_TLS(默认:False)
在与SMTP服务器通信时,是否使用TLS(安全)连接。这用于显式TLS连接,通常在端口587上。
EMAIL_USE_SSL(默认:False)
在与SMTP服务器通信时,是否使用隐式TLS(安全)连接。在大多数电子邮件文档中,这种类型的TLS连接称为SSL。它通常在端口465上使用。
注意: EMAIL_USE_TLS/EMAIL_USE_SSL 是互斥的,最多只能设置一个为True。