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

Django发送邮件无报错却失败、页面跳转URL异常问题求助

问题根因

  • 前端表单未指定提交方法,默认使用GET请求
    你使用的form标签没有添加method="post"属性,浏览器默认会用GET方式提交表单,所有表单参数都会直接拼接在URL后,后端request.method == 'POST'的判断永远不成立,根本不会执行发邮件的逻辑,这是页面跳转异常、邮件未发送的核心原因。
  • form.cleaned_data调用错误
    cleaned_data是表单实例的属性,不是可调用方法,你写的cd=form.cleaned_data()会触发属性调用异常,就算走到POST分支也会报错,不会执行后续发邮件逻辑。
  • 发件人地址和配置不匹配
    Gmail SMTP服务要求发件人必须和EMAIL_HOST_USER配置的账号完全一致,你settings里配置的发件账号是fhjfhfjs@gmail.com,但send_mail函数里传的发件人是jfsdhfsdjk@gmail.com,会被Gmail接口直接拒绝,邮件发送失败。
  • Gmail低安全性应用权限已失效
    Google在2022年5月就全面停止了个人账号的「低安全性应用」访问权限,就算开启该开关也无法正常使用SMTP服务,必须用应用密码或者OAuth2认证才能发信。

解决步骤

1. 修正前端表单配置

给form标签添加method="post"属性,修改后的表单代码如下:

<form method="post">
    {{form.as_p}}
    {%csrf_token%}
    <input type="submit" class="btn btn-primary btn-lg" value="Send Mail">
</form>

2. 修正视图中cleaned_data的调用

把cd=form.cleaned_data()改为cd=form.cleaned_data即可。

3. 统一发件人配置

把send_mail里的发件人改成settings中配置的邮箱,也可以直接引入settings配置避免硬编码不一致:

from django.conf import settings
# 调用send_mail时替换发件人参数
send_mail('sub','message', settings.EMAIL_HOST_USER, [cd['to']])

4. 更换Gmail SMTP认证方式

如果你的谷歌账号开启了两步验证,先创建应用专用密码,然后把EMAIL_HOST_PASSWORD的值替换成生成的16位应用密码即可。如果未开启两步验证,需要先开启才能生成应用密码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 15:06:02