You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:35:11