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

Django联系表单仅控制台发邮件,无法发送至邮箱(SMTPServerDisconnected错误)

Django联系表单SMTPServerDisconnected问题排查

练习Django开发时遇到联系表单功能异常:点击提交按钮后页面长时间加载,最终抛出SMTPServerDisconnected错误,无法将表单数据发送至网站关联邮箱。切换至console邮件后端时功能正常,尝试更换IMAP/POP3端口无效,需确认是代码逻辑错误还是需要联系主机服务商解决。

相关代码

forms.py

from django import forms


class ContactForm(forms.Form):
    name = forms.CharField(label='Your name', max_length=200,
                           widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'name'}))
    from_email = forms.EmailField(label='Your email', max_length=200, widget=forms.TextInput(
        attrs={'class': 'form-control', 'id': 'email'}))
    subject = forms.CharField(label='Enter a subject', max_length=200,
                              widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'subject'}))
    message = forms.CharField(label='Write here your message', max_length=500,
                              widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'message'}))

views.py(已替换为占位地址)

def home(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            subject = form.cleaned_data['subject']
            body = {
                'first_name': form.cleaned_data['name'],
                'email_from': form.cleaned_data['from_email'],
                'message': form.cleaned_data['message'],
            }
            message = "\n".join(body.values())
            try:
                send_mail(subject, message, 'example@example.com',
                          ['mydomainemail@example.net'], fail_silently=True)
            except BadHeaderError:
                return HttpResponse('Invalid header found')

    form = ContactForm()
    return render(request, 'index.html', {'form': form})

settings.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'mail.mydomain.net'
EMAIL_PORT = SmtpPort
EMAIL_HOST_USER = 'mydomainemail@example.net'
EMAIL_HOST_PASSWORD = 'my email password'

问题排查方向

代码逻辑修正点

  1. forms.py优化:message字段使用TextInput仅支持单行输入,建议替换为forms.Textarea更符合消息输入场景,但这不会导致SMTP连接失败。
  2. views.py调整:
    • 补充缺失的导入:send_mail需从django.core.mail导入,BadHeaderError、HttpResponse需从django.http导入,避免隐式依赖问题。
    • 暂时将fail_silently=True改为False,暴露具体SMTP错误信息,便于精准排查。
  3. settings.py修正:
    • 替换EMAIL_PORT = SmtpPort为实际端口:启用EMAIL_USE_TLS=True时对应标准端口587;若用SSL则设EMAIL_USE_SSL=True并改用465端口,两者不能同时启用。

主机服务商相关检查

console后端正常说明表单处理逻辑无问题,问题集中在SMTP连接环节:

  • 确认主机服务商是否允许第三方程序通过SMTP发送邮件,部分服务商默认禁用外部SMTP访问。
  • 检查服务器防火墙是否拦截了587/465端口的出站请求。
  • 核实邮箱账号密码:部分邮箱需使用授权码而非登录密码(如国内主流邮箱、Gmail)。
  • 用命令测试连通性:执行telnet mail.mydomain.net 587,若无法建立连接,说明网络或服务商限制问题。

处理建议

先修正代码中的配置错误(替换端口占位符、关闭静默失败),再测试SMTP连通性。如果连接测试失败,直接联系主机服务商确认SMTP服务状态、端口放行情况;若连接正常但仍报错,再进一步排查代码细节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:20:35