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

基于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应用密码生成步骤:

  1. 登录微软账户,进入「安全」设置页面
  2. 开启「两步验证」后,找到「应用密码」选项
  3. 生成专用应用密码,复制到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应用密码生成步骤:

  1. 登录朋友的Gmail账户,进入「账户安全」设置
  2. 开启「两步验证」
  3. 在两步验证设置中找到「应用密码」,生成专用密码用于Django配置

测试建议

  1. 本地运行项目,提交表单后查看返回的异常信息,根据错误提示排查问题
  2. 检查目标邮箱的垃圾邮件文件夹,避免邮件被误判
  3. 确保服务器防火墙允许587端口的出站连接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:50:44