基于Django实现可用联系表单的技术求助
Django联系表单SMTP邮件发送问题修复方案
核心问题分析
你的代码存在两个关键问题导致邮件无法正常发送:
send_mail方法中发件人邮箱(from_email)为空字符串,SMTP服务器要求发件人必须是有效且与配置账户一致的地址- Outlook/Gmail的SMTP配置未满足平台安全验证规则(如应用密码、两步验证要求)
第一步:修复views.py中的邮件发送逻辑
修改vswContact函数的send_mail调用,并添加全面的异常捕获以排查错误:
from django.shortcuts import render, redirect from .forms import contactForm from django.core.mail import send_mail, BadHeaderError from django.http import HttpResponse from django.conf import settings # 新增导入配置模块 import smtplib # 新增导入SMTP异常模块 def vswPortfolio(request): return render(request, 'portfolio/home.html') def vswProject(request, pk): return render(request, 'portfolio/project.html') def vswContact(request): if request.method == 'POST': form = contactForm(request.POST) if form.is_valid(): subject = "Website Inquiry" body = { 'full_name': form.cleaned_data['full_name'], 'email': form.cleaned_data['email_address'], 'message': form.cleaned_data['message'], } message = "\n".join(body.values()) try: # 将发件人替换为配置的邮箱账户 send_mail(subject, message, settings.EMAIL_HOST_USER, ['myemail@email.com']) return redirect('contact') except BadHeaderError: return HttpResponse('Invalid header found.') except smtplib.SMTPException as e: # 返回具体SMTP错误信息,便于排查 return HttpResponse(f'邮件发送失败:{str(e)}') form = contactForm() return render(request, "portfolio/contact.html", {'form':form})
第二步:Outlook SMTP配置修正
确保settings配置符合以下要求:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = True EMAIL_HOST = 'smtp-mail.outlook.com' EMAIL_HOST_USER = '你的完整Outlook邮箱' # 例如:xxx@outlook.com EMAIL_HOST_PASSWORD = '应用密码' # 重点:若账户开启两步验证,必须使用微软账户生成的应用密码,而非登录密码 EMAIL_PORT = 587
Outlook应用密码生成步骤:
- 登录微软账户,进入「安全」设置页面
- 开启「两步验证」后,找到「应用密码」选项
- 生成专用应用密码,复制到
EMAIL_HOST_PASSWORD中
第三步:后续切换到Gmail的配置方案
切换到朋友的Gmail账户时,使用以下配置:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = True EMAIL_HOST = 'smtp.gmail.com' EMAIL_HOST_USER = 'friend@gmail.com' # 朋友的完整Gmail邮箱 EMAIL_HOST_PASSWORD = '应用密码' # 开启Gmail两步验证后生成的专用应用密码 EMAIL_PORT = 587
Gmail应用密码生成步骤:
- 登录朋友的Gmail账户,进入「账户安全」设置
- 开启「两步验证」
- 在两步验证设置中找到「应用密码」,生成专用密码用于Django配置
测试建议
- 本地运行项目,提交表单后查看返回的异常信息,根据错误提示排查问题
- 检查目标邮箱的垃圾邮件文件夹,避免邮件被误判
- 确保服务器防火墙允许587端口的出站连接
内容的提问来源于stack exchange,提问作者David Henson
相关产品推荐
相关产品推荐

