Django配置雅虎SMTP发邮件报SMTPServerDisconnected错误
Django对接雅虎SMTP发信报
Connection unexpectedly closed修复方案 该错误发生在SMTP登录认证阶段,由雅虎服务器主动断开连接触发,和之前尝试修改的端口、host参数无关,核心是认证逻辑不符合雅虎邮箱的安全规则,按以下步骤修复即可:
- 替换登录凭证为雅虎应用专用密码
雅虎邮箱默认禁止第三方客户端使用账号日常登录密码走SMTP发信,必须使用单独生成的应用专用密码,这是90%以上该报错的诱因:- 登录雅虎邮箱网页端,进入账户安全设置页
- 先开启账号两步验证,未开启两步验证的账号无法生成应用专用密码
- 找到「生成应用密码」入口,应用类型选「其他」,自定义备注名(比如Django业务站),生成16位长度的专用密码
- 将
settings.py中EMAIL_HOST_PASSWORD字段的值替换为该16位密码,不要保留输入时的空格
- 补全邮箱配置的缺失参数
现有配置缺少超时、默认发件人等雅虎SMTP强制校验的参数,将邮箱配置段替换为如下内容:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = True # 增加连接超时配置,避免握手阶段被静默断开 EMAIL_TIMEOUT = 30 EMAIL_HOST = 'smtp.mail.yahoo.com' EMAIL_PORT = 587 # 这里填完整的雅虎邮箱地址,不要省略@yahoo.com后缀 EMAIL_HOST_USER = '你的雅虎邮箱全称' # 这里填上一步生成的16位应用专用密码,不要填日常登录密码 EMAIL_HOST_PASSWORD = '生成的16位应用专用密码' # 显式指定默认发件人,和认证账号保持一致,避免被雅虎判定为伪造发件人 DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
- 优化视图层发信逻辑,避免直接抛500错误
现有代码未做参数校验和异常捕获,不仅发信失败会返回500,传入的商品类型ID不存在时也会触发索引报错,将post方法的发信逻辑调整为如下内容:
from django.conf import settings from django.core.mail import EmailMessage from django.contrib import messages def post(self,request): user_email = request.POST.get('mail') type_pk = request.POST.get('type') # 先校验必填参数 if not user_email or not type_pk: messages.error(request, "提交信息不完整,请重新填写") return redirect('/') try: prod_type = models.ProductTypes.objects.get(pk=type_pk) email = EmailMessage( subject='Qazpoligraph', body=prod_type.name, from_email=settings.DEFAULT_FROM_EMAIL, to=[user_email] ) # 调试阶段可保持fail_silently=False打印详细错误,正式环境可改为True email.send(fail_silently=False) messages.success(request, "订单提交成功") except Exception as e: # 可自行添加日志记录逻辑,不要直接抛出异常导致500 messages.error(request, "提交失败,请稍后重试") return redirect('/')
- 网络连通性排查
如果完成上述配置后依然报错,切换手机热点测试连接,部分本地运营商、公司网络会默认拦截587/465等SMTP常用端口,导致连接被中途切断。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

