Django提交表单同步发送邮件时出现变量定义报错如何解决?
问题解决方法
报错根因
- 你调用
send_mail()时传入的subject、message、from_email三个变量没有提前定义,触发变量未定义错误 - 同时现有代码逻辑存在缺陷:表单校验失败的情况下仍然会执行数据保存操作,不符合预期
修复步骤
- 从Django导入settings模块,用来读取邮件配置里的发件人地址
- 调用
send_mail()前提前定义好主题、邮件内容、发件人三个参数 - 调整逻辑:把数据保存、发邮件的操作都放到
full_clean()校验通过的分支里,避免校验失败时仍执行异常操作 - 不要直接吞掉
ValidationError异常,需要把错误提示返回给前端方便排查问题
修改后完整views.py代码
from django.core.mail import send_mail from django.conf import settings from django.contrib import messages def gcreate(request): if request.method == 'POST': gmember = gunluk( adsoyad=request.POST['adsoyad'], adsoyad2=request.POST['adsoyad2'], vardiya=request.POST['vardiya'], aciklama=request.POST['aciklama'], incident=request.POST['incident'], alinanaksiyon=request.POST['alinanaksiyon'], ulasilmayanekip=request.POST['ulasilmayanekip'], ulasilmayanbilgisi=request.POST['ulasilmayanbilgisi'], ) try: gmember.full_clean() # 定义邮件参数,可根据需求调整内容 subject = f"新记录通知:提交人{gmember.adsoyad}" message = f""" 新增记录详情: 提交人:{gmember.adsoyad} 关联人:{gmember.adsoyad2} 班次:{gmember.vardiya} 描述:{gmember.aciklama} 事件:{gmember.incident} 已采取措施:{gmember.alinanaksiyon} 未联系到的团队:{gmember.ulasilmayanekip} 未联系说明:{gmember.ulasilmayanbilgisi} """ from_email = settings.EMAIL_HOST_USER # 发送邮件 send_mail(subject, message, from_email, ['admin@example.com']) # 校验通过再保存数据 gmember.save() messages.success(request, 'Ekleme İşlemi Başarılı!') return redirect('/gunlukistakibi') except ValidationError as e: # 把校验错误返回给前端展示 messages.error(request, f"提交失败:{str(e)}") return render(request, 'gcreate.html') else: return render(request, 'gcreate.html')
Gmail SMTP配置注意事项
- 目前Gmail默认禁止第三方客户端使用账号密码直接登录SMTP服务,需要先为Google账号开启两步验证,然后生成应用专用密码,把生成的16位应用专用密码填到
EMAIL_HOST_PASSWORD配置项才能正常发信 - 测试阶段如果发信失败,可以先把
EMAIL_BACKEND改为django.core.mail.backends.console.EmailBackend,在控制台查看邮件内容排查格式问题
内容的提问来源于stack exchange,提问作者thedoctor
相关产品推荐
相关产品推荐

