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'
问题排查方向
代码逻辑修正点
- forms.py优化:
message字段使用TextInput仅支持单行输入,建议替换为forms.Textarea更符合消息输入场景,但这不会导致SMTP连接失败。 - views.py调整:
- 补充缺失的导入:
send_mail需从django.core.mail导入,BadHeaderError、HttpResponse需从django.http导入,避免隐式依赖问题。 - 暂时将
fail_silently=True改为False,暴露具体SMTP错误信息,便于精准排查。
- 补充缺失的导入:
- 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
相关产品推荐
相关产品推荐

