You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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发信请求。
  • 临时将邮件后端改为控制台后端,验证视图逻辑是否正常触发:
    # 测试阶段临时替换EMAIL_BACKEND配置
    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
    
    配置后触发密码重置流程,邮件内容会直接打印在Django服务运行控制台,若能看到完整重置邮件内容,说明视图逻辑无异常,问题出在SMTP连接配置环节。

内容的提问来源于stack exchange,提问作者Valentin Garreau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:06:28