Django 3.1.2默认PasswordResetView无法发送重置邮件问题
Django 3.1 内置密码重置功能无法发送邮件问题排查与修复
核心故障原因
密码重置表单未声明提交方法为POST,浏览器默认使用GET方式提交表单,所有表单参数拼接在URL查询字符串中,完全没有触发PasswordResetView的POST处理逻辑,因此不会发送重置邮件。
提交后URL出现?csrfmiddlewaretoken=xxx&email=xxx格式的查询参数,就是GET请求提交的典型特征,正常POST提交的参数不会暴露在URL中。
修复方案
1. 修正表单属性
给<form>标签补充method="POST"属性,修正后的表单代码如下:
<form class="form" method="POST"> {% csrf_token %} {{ form.as_p }} <div class="form-group"> <button type="submit" class="btn btn-pill btn-outline-white font-weight-bold opacity-90 px-15 py-3 m-2">Reset</button> </div> </form>
如果该模板不是
PasswordResetView直接渲染的默认模板,还需要补充action="{% url 'password_reset' %}"属性,确保提交地址指向密码重置接口。
2. 功能验证
修改完成后重新提交表单:
- 正常提交后页面会自动跳转到
/password_reset/done/路由对应的提示页,不会停留在原地址带查询参数 - 此时检查目标邮箱即可收到密码重置邮件
补充排查项(修复表单后仍异常时可验证)
- 检查
settings.py是否配置DEFAULT_FROM_EMAIL参数,Django内置认证模块的邮件默认使用该值作为发件人,未配置时Gmail SMTP会直接拒信:DEFAULT_FROM_EMAIL = '你的Gmail发信账号@gmail.com' - 确认Gmail账号已开启低安全应用访问权限,若账号开启了两步验证,需要生成专用应用密码填入
EMAIL_HOST_PASSWORD配置,否则Gmail会拦截SMTP发信请求。 - 临时将邮件后端改为控制台后端,验证视图逻辑是否正常触发:
配置后触发密码重置流程,邮件内容会直接打印在Django服务运行控制台,若能看到完整重置邮件内容,说明视图逻辑无异常,问题出在SMTP连接配置环节。# 测试阶段临时替换EMAIL_BACKEND配置 EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
内容的提问来源于stack exchange,提问作者Valentin Garreau
相关产品推荐
相关产品推荐

