django+celery+redis+send_mail 来发送邮件
当直接 console 启动 django 项目和 celery 时候,既如下情况时候可以正常邮件发送:
启动 django
[root@vultrvpn vpnWeb]# python run.py Performing system checks... System check identified no issues (0 silenced). March 17, 2017 - 11:09:42 Django version 1.10.6, using settings 'vpnWeb.settings' Starting development server at http://0.0.0.0:9000/ Quit the server with CONTROL-C. [17/Mar/2017 11:11:51] "GET /admin/ HTTP/1.0" 200 6274[17/Mar/2017 11:11:54] "GET /admin/app/userpay/ HTTP/1.0" 200 7052 [17/Mar/2017 11:11:55] "GET /admin/jsi18n/ HTTP/1.0" 200 3217 [17/Mar/2017 11:12:00] "POST /admin/app/userpay/ HTTP/1.0" 200 3168 启动 celery
[root@vultrvpn vpnWeb]# celery -A vpnWeb worker -l info /usr/lib/python2.7/site-packages/celery/platforms.py:793: RuntimeWarning: You're running the worker with superuser privileges: this is absolutely not recommended! Please specify a different user using the -u option. User information: uid=0 euid=0 gid=0 egid=0 uid=uid, euid=euid, gid=gid, egid=egid, -------------- celery@vultrvpn v4.0.2 (latentcall) ---- **** ----- --- * *** * -- Linux-4.10.2-1.el7.elrepo.x86_64-x86_64-with-centos-7.3.1611-Core 2017-03-17 11:09:32 -- * - **** --- - ** ---------- [config] - ** ---------- .> app: vpnWeb:0x234a450 - ** ---------- .> transport: redis://localhost:6379/0 - ** ---------- .> results: redis://localhost:6379/0 - *** --- * --- .> concurrency: 1 (prefork) -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) --- ***** ----- -------------- [queues] .> celery exchange=celery(direct) key=celery [tasks] . app.emailTask.sendEmal . vpnWeb.celery.debug_task [2017-03-17 11:09:32,548: INFO/MainProcess] Connected to redis://localhost:6379/0 [2017-03-17 11:09:32,557: INFO/MainProcess] mingle: searching for neighbors [2017-03-17 11:09:33,571: INFO/MainProcess] mingle: all alone [2017-03-17 11:09:33,578: INFO/MainProcess] celery@vultrvpn ready. [2017-03-17 11:14:55,514: INFO/MainProcess] Received task: app.emailTask.sendEmal[618eb32c-0c34-4cf7-9c0f-9020f6d72242] [2017-03-17 11:14:58,385: INFO/PoolWorker-1] Task app.emailTask.sendEmal[618eb32c-0c34-4cf7-9c0f-9020f6d72242] succeeded in 2.868786066s: None 当项目调用到 send_mail 时候可以正常进行邮件发送
发送邮件代码
from django.core.mail import send_mail import time from time import sleep @celery_app.task def sendEmal(tomail): send_mail( u'账号信息', u'发送目标邮箱', '[email protected]', [tomail], fail_silently=False, ) 但当用 supervisor 进行守护进程部署 django 以及 celery 也部署了守护进程(按以下方式部署守护进程)
http://docs.celeryproject.org/en/latest/userguide/daemonizing.html#daemonizing 拷贝这个文件( https://github.com/celery/celery/blob/3.1/extra/generic-init.d/celeryd )内容到 /etc/init.d/celeryd
邮件就无法发送了。
守护进程时候 celery 调用发送邮件 task 的时候打印日志内容:
[2017-03-17 10:58:30,190: INFO/MainProcess] mingle: all alone [2017-03-17 10:58:30,197: INFO/MainProcess] djangoCelery1@vultrvpn ready. [2017-03-17 10:58:49,185: INFO/MainProcess] Received task: app.emailTask.sendEmal[1c9ff6d0-2962-42ce-ba35-151c73980ffb] [2017-03-17 11:06:51,331: INFO/MainProcess] Received task: app.emailTask.sendEmal[7b71fa6c-0554-44c3-a030-20f14885f001] [2017-03-17 11:07:44,339: INFO/MainProcess] Connected to redis://localhost:6379/0 [2017-03-17 11:07:44,347: INFO/MainProcess] mingle: searching for neighbors [2017-03-17 11:07:45,361: INFO/MainProcess] mingle: all alone [2017-03-17 11:07:45,367: INFO/MainProcess] djangoCelery1@vultrvpn ready. [2017-03-17 11:30:44,493: INFO/MainProcess] Connected to redis://localhost:6379/0 [2017-03-17 11:30:44,499: INFO/MainProcess] mingle: searching for neighbors [2017-03-17 11:30:45,526: INFO/MainProcess] mingle: all alone [2017-03-17 11:30:45,532: INFO/MainProcess] djangoCelery1@vultrvpn ready. [2017-03-17 11:31:04,372: INFO/MainProcess] Received task: app.emailTask.sendEmal[680f3ae0-a85f-4b7c-a9d7-9c64d1788aa2] 后有经过测试, django 部署守护进程, celery 用 console 启动,就可以正常发送邮件。
那么现在要怎么调整才能在 celery 使用守护进程部署的时候也能进行邮件发送的?
