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
相关产品推荐
相关产品推荐

