Django重置密码接口出现SMTPServerDisconnected连接意外关闭错误
解决SMTPServerDisconnected: Connection unexpectedly closed错误
以下是针对你遇到问题的排查方向和解决办法:
1. 替换Yahoo邮箱密码为应用专用密码
Yahoo现在禁止第三方客户端直接使用账户登录密码,必须用应用专用密码:
- 先给你的Yahoo账户开启两步验证
- 进入账户安全设置,生成一个针对Django的应用专用密码
- 把settings.py里的
EMAIL_HOST_PASSWORD换成这个生成的密码
2. 修复手动管理SMTP连接的代码问题
你代码里手动调用connection.open()是多余的,send_mail会自动处理连接的开闭,手动操作反而可能导致连接状态异常。修改代码如下:
# 删掉这三行手动操作连接的代码 # connection = get_connection() # connection.open() # connection.connection.set_debuglevel(1) # 如果需要调试SMTP交互,用Django自带的debug配置 connection = get_connection() connection.debug = 1 # 开启后会在控制台输出SMTP对话细节 send_mail( subject, email_content, settings.DEFAULT_FROM_EMAIL, [user.email], fail_silently=False, connection=connection )
3. 验证Yahoo SMTP配置正确性
确认参数是否符合Yahoo要求:
EMAIL_HOST设置为smtp.mail.yahoo.com是对的- 可以尝试切换端口和加密方式:把
EMAIL_PORT=587+EMAIL_USE_TLS=True换成EMAIL_PORT=465+EMAIL_USE_SSL=True(注意TLS和SSL不能同时开启) - 确保
DEFAULT_FROM_EMAIL和EMAIL_HOST_USER完全一致
4. 排查网络环境问题
- 测试服务器能否访问Yahoo的SMTP端口:执行
telnet smtp.mail.yahoo.com 587,如果连不上就是网络被拦截 - 本地开发的话,暂时关闭防火墙或代理试试;云服务器要确认服务商没封禁SMTP出站端口
5. 开启详细日志定位问题
在settings.py中添加日志配置,查看SMTP交互的完整过程:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': {'class': 'logging.StreamHandler'}, }, 'loggers': { 'django.core.mail': { 'handlers': ['console'], 'level': 'DEBUG', }, }, }
运行后看控制台输出的SMTP对话,能精准找到连接断开的具体原因。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

