Celery执行send_verify_email任务触发TimeoutError连接超时求助
Django + Celery 发送邮件连接超时问题排查
问题描述
终端启动Celery后触发发送邮件任务,等待后出现连接超时。已完成配置文件配置,前端请求可正常接收,后端服务器运行状态正常,Django中邮箱地址配置正确,但仍触发TimeoutError(110, 'Connection timed out')错误。
报错详情
[2024-05-13 23:09:54,387: INFO/MainProcess] Task send_verify_email[dea32c62-98b6-4418-93af-5c5d0f0f20ad] received [2024-05-13 23:12:05,560: ERROR/ForkPoolWorker-1] Task send_verify_email[dea32c62-98b6-4418-93af-5c5d0f0f20ad] raised unexpected: TimeoutError(110, 'Connection timed out') Traceback (most recent call last): File "/home/admin/.virtualenvs/haoke_mall/lib/python3.10/site-packages/celery/app/trace.py", line 453, in trace_task R = retval = fun(*args, **kwargs) File "/home/admin/.virtualenvs/haoke_mall/lib/python3.10/site-packages/celery/app/trace.py", line 736, in __protected_call__ return self.run(*args, **kwargs) File "/home/admin/haoke18/hk18/celery_tasks/email/tasks.py", line 27, in send_verify_email send_mail(subject, "", EMAIL_FROM, [to_email], html_message=html_message) File "/home/admin/.virtualenvs/haoke_mall/lib/python3.10/site-packages/django/core/mail/__init__.py", line 61, in send_mail return mail.send() File "/home/admin/.virtualenvs/haoke_mall/lib/python3.10/site-packages/django/core/mail/message.py", line 284, in send return self.get_connection(fail_silently).send_messages([self]) File "/home/admin/.virtualenvs/haoke_mall/lib/python3.10/site-packages/django/core/mail/backends/smtp.py", line 102, in send_messages new_conn_created = self.open() File "/home/admin/.virtualenvs/haoke_mall/lib/python3.10/site-packages/django/core/mail/backends/smtp.py", line 62, in open self.connection = self.connection_class(self.host, self.port, **connection_params) File "/usr/lib/python3.10/smtplib.py", line 255, in __init__ (code, msg) = self.connect(host, port) File "/usr/lib/python3.10/smtplib.py", line 341, in connect self.sock = self._get_socket(host, port, self.timeout) File "/usr/lib/python3.10/smtplib.py", line 312, in _get_socket return socket.create_connection((host, port), timeout, File "/usr/lib/python3.10/socket.py", line 845, in create_connection raise err File "/usr/lib/python3.10/socket.py", line 833, in create_connection sock.connect(sa) TimeoutError: [Errno 110] Connection timed out
排查与解决步骤
核对SMTP服务器配置
确认邮箱服务商的SMTP地址和端口:比如QQ邮箱为smtp.qq.com(端口465/587),阿里云邮箱为smtp.aliyun.com。检查Django配置中的EMAIL_HOST和EMAIL_PORT是否完全匹配,SSL协议用465端口,TLS协议用587端口,避免混用。测试服务器网络连通性
在服务器终端执行命令测试SMTP端口是否可访问:telnet smtp.example.com 465 # 或用nc命令 nc -zv smtp.example.com 465如果无法连通,说明服务器防火墙限制了出站端口,或者邮箱服务商封禁了服务器IP。此时可尝试切换端口(比如从25改到465),或联系服务器提供商开放对应端口。
验证邮箱授权码
多数邮箱服务商需使用授权码替代登录密码(如QQ、163邮箱),确认Django配置中的EMAIL_HOST_PASSWORD是最新生成的授权码,而非普通登录密码。同时登录邮箱后台,确保SMTP服务已开启。确认Celery加载正确配置
启动Celery时需指定Django配置文件,比如:celery -A hk18 worker -l info --settings=hk18.settings可在Celery任务中打印配置参数验证:
from django.conf import settings print(settings.EMAIL_HOST, settings.EMAIL_PORT)确保Celery使用的配置与Django项目配置一致。
延长连接超时时间
在Django配置中添加EMAIL_TIMEOUT参数,延长连接超时阈值,避免网络波动导致的超时:EMAIL_TIMEOUT = 30 # 单位:秒
内容的提问来源于stack exchange,提问作者Benjamin
相关产品推荐
相关产品推荐

