解决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
相关产品推荐
相关产品推荐

