使用Django与Bootstrap构建的联系表单无法发送邮件如何解决?
问题根因及修复方案
1. 视图逻辑致命错误(最核心原因)
你views.py的contact函数里,获取完POST参数后直接加了一行return redirect('contact'),这行代码会直接中断后续所有逻辑,发邮件的代码完全不会被执行,直接删除这行即可。
2. 视图缩进错误
return render(request,'home_app/home.html',{}) 当前缩进在if request.method == "POST"分支内部,会导致GET请求访问页面时没有返回值报错,要把这行代码调整到和if request.method == "POST"同级的位置。
3. 发件人配置缺失
你构造EmailMessage对象时第三个参数(发件人地址)留了空字符串,要改成和settings.py里EMAIL_HOST_USER一致的邮箱地址,否则Gmail会拒绝发信请求。
4. Gmail专属配置调整
谷歌现在不支持直接用账号密码作为EMAIL_HOST_PASSWORD发信,需要先完成以下配置:
- 先给你的Gmail账号开启两步验证
- 前往谷歌账号安全页生成应用专用密码,把生成的16位密码填到
EMAIL_HOST_PASSWORD字段 - 确认你的网络环境可以正常连接Gmail的SMTP服务
优化建议
- 表单里的主题输入框
type写错成了tel,建议改成text,避免部分浏览器限制输入内容 - 不要用裸
except捕获异常,可以打印异常信息方便后续排查问题,示例:
import traceback try: email.send() return redirect("/?valid") except Exception as e: print(traceback.format_exc()) return redirect("/?notvalid")
修复后的views.py参考:
from django.http import HttpResponse from django.shortcuts import render, redirect from django.core.mail import EmailMessage from django.conf import settings def contact(request): if request.method == "POST": name = request.POST.get('name') subject = request.POST.get('subject') email = request.POST.get('email') message = request.POST.get('text') email=EmailMessage("Message from Django", "User: {} Subject: {} Address: {} Message:\n\n {}".format(name,subject,email,message), settings.EMAIL_HOST_USER,["你的收件邮箱地址"],reply_to=[email]) try: email.send() return redirect("/?valid") except: return redirect("/?notvalid") return render(request,'home_app/home.html',{})
内容的提问来源于stack exchange,提问作者Shifter
相关产品推荐
相关产品推荐

