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

解决Django中send_mail触发smtplib.SMTPServerDisconnected错误

解决Django send_mail触发smtplib.SMTPServerDisconnected错误

针对你用Django post_save信号触发邮件发送时出现的连接断开错误,按以下步骤排查解决:

1. 修复Gmail SMTP权限配置

Gmail当前禁止直接使用账号密码登录SMTP服务,必须通过以下方式处理:

  • 先给你的Gmail账号开启两步验证,然后在账号安全设置中生成应用专用密码,将这个密码替换配置里的EMAIL_HOST_PASSWORD。
  • 若未开启两步验证,可尝试开启"不太安全的应用访问"(注:该功能已逐步被Gmail淘汰,优先推荐应用专用密码方案)。

2. 核对SMTP配置参数

确保配置参数完全正确,以下是标准Gmail SMTP配置:

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = "miriamotuss@gmail.com"
EMAIL_HOST_PASSWORD = '生成的应用专用密码'  # 替换为实际值
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

注意:587端口对应TLS加密,465端口对应SSL加密,不要混淆;EMAIL_USE_TLS必须设为True。

3. 排查网络连通性

从报错信息看你的服务运行在Docker容器中,需检查:

  • 容器是否能访问外部网络,可在容器内执行telnet smtp.gmail.com 587测试连通性。
  • 宿主机防火墙或云服务商安全组是否拦截了587端口的出站请求。

4. 优化邮件发送逻辑

同步在post_save信号中发送邮件容易阻塞请求并增加连接超时风险,建议改用异步任务(如Celery)发送:

# 定义Celery异步任务
from celery import shared_task
from django.core.mail import send_mail

@shared_task
def send_welcome_email(subject, message, from_email, recipient_list):
    send_mail(subject, message, from_email, recipient_list)

# 修改信号处理函数
@receiver(post_save, sender=midas_user)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        logger.info("New user created: %s", instance.name)
        # 调用异步任务发送邮件
        send_welcome_email.delay(
            "欢迎注册",
            "Here is the message",
            "miriamotuss@gmail.com",
            ["ah2600381@gmail.com"]
        )

5. 单独测试邮件功能

在Django Shell中直接测试邮件发送,定位问题范围:

python manage.py shell
from django.core.mail import send_mail
send_mail("测试邮件", "测试内容", "miriamotuss@gmail.com", ["ah2600381@gmail.com"])
  • 若Shell中发送失败:问题出在配置或网络
  • 若Shell中发送成功:检查信号触发时的环境变量或事务状态

内容的提问来源于stack exchange,提问作者Mir1a

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:03:25