Django密码重置异常:未调用password_reset_confirm模板且未发送重置邮件问题排查
排查Django密码重置邮件未发送问题
我刚碰到过类似的Gmail SMTP配置坑,结合你的代码和场景,咱们一步步来排查:
1. 优先检查Google账号的安全验证设置
这是Gmail SMTP最常见的问题:
- 如果你的Google账号开启了两步验证(2FA),绝对不能用普通登录密码作为
EMAIL_HOST_PASSWORD,必须生成应用专用密码(App Password):
登录Google账号 → 进入「安全」设置 → 找到「应用专用密码」(需要先开启2FA才能看到)→ 创建一个专为Django使用的密码,把这个密码填入config.PASS。 - 如果没开2FA,现在Google已经逐步取消了「不太安全的应用访问」选项,还是建议开启2FA后用App Password,这是最可靠的方式。
2. 验证环境变量是否正确加载
你用了config.EMAIL和config.PASS读取配置,先确认这些变量真的拿到了正确的值:
打开Django shell(运行python manage.py shell),执行:
from django.conf import settings print(settings.EMAIL_HOST_USER) print(settings.EMAIL_HOST_PASSWORD)
如果输出的不是你的邮箱和正确的App Password,说明环境变量加载有问题,检查你的配置文件(比如.env)有没有拼写错误,或者config模块有没有正确读取变量。
3. 直接测试邮件发送功能
在Django shell里手动发送测试邮件,能快速定位错误:
from django.core.mail import send_mail send_mail( "Django 测试邮件", "这是一封测试邮件,用来验证SMTP配置是否正常", settings.EMAIL_HOST_USER, ["你的目标测试邮箱@xxx.com"], fail_silently=False, )
如果执行时报错,比如SMTPAuthenticationError,说明认证失败(大概率是密码/App Password不对);如果是连接超时,检查你的网络是否能访问smtp.gmail.com,或者有没有被防火墙拦截。
4. 查看Django日志细节
如果测试邮件没报错但还是收不到,添加日志配置看看邮件发送的具体过程:
在settings.py里加入:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': {'class': 'logging.StreamHandler'}, }, 'loggers': { 'django.core.mail': { 'handlers': ['console'], 'level': 'DEBUG', }, }, }
然后重启服务器,触发密码重置,看控制台输出的日志,能看到邮件是否真的被发送,有没有被服务商拒绝。
5. 检查垃圾邮件文件夹
有时候邮件会被邮箱服务商判定为垃圾邮件,先去收件邮箱的「垃圾邮件」「促销邮件」文件夹里找找,别漏了这一步。
另外,你的URL配置看起来没问题,既然能正常跳转到password-reset/done/,说明路由和视图逻辑是正常的,问题大概率出在邮件配置环节。
内容的提问来源于stack exchange,提问作者user14827309
相关产品推荐
相关产品推荐

