一、起因: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 = '[email protected]' # 默認郵件發送方:和發送郵箱的用戶名相同
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 = '[email protected]'
>>> 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。