Django调用send_email发送邮件报错:ConnectionResetError连接被重置
Django发送邮件出现ConnectionResetError问题排查与解决
问题描述
在Django中使用send_email发送邮件时,尝试Gmail、Hotmail及私人邮箱均返回相同错误,核心异常为ConnectionResetError: [Errno 54] Connection reset by peer,最终触发smtplib.SMTPServerDisconnected。
当前配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'mail.privateemail.com' EMAIL_HOST_USER = 'info@custumemail.com' EMAIL_HOST_PASSWORD = 'xxxxxx' EMAIL_USE_TLS = False EMAIL_PORT = 465
错误日志
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/smtplib.py", line 398, in getreply line = self.file.readline(_MAXLINE + 1) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/socket.py", line 707, in readinto return self._sock.recv_into(b) ^^^^^^^^^^^^^^^^^^^^^^^ ConnectionResetError: [Errno 54] Connection reset by peer 在处理上述异常期间,发生了另一个异常: Traceback (most recent call last): File "/Volumes/mac-etended/pytonDjango/django-example-4/blog/venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 56, in inner response = get_response(request) ^^^^^^^^^^^^^^^^^^^^^ File "/Volumes/mac-etended/pytonDjango/django-example-4/blog/venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Volumes/mac-etended/pytonDjango/django-example-4/blog/blog/views.py", line 64, in post_share send_mail(subject, message, 'ddddd@gmail.com', [cd['to']]) File "/Volumes/mac-etended/pytonDjango/django-example-4/blog/venv/lib/python3.12/site-packages/django/core/mail/__init__.py", line 87, in send_mail return mail.send() ^^^^^^^^^^^ File "/Volumes/mac-etended/pytonDjango/django-example-4/blog/venv/lib/python3.12/site-packages/django/core/mail/message.py", line 298, in send return self.get_connection(fail_silently).send_messages([self]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Volumes/mac-etended/pytonDjango/django-example-4/blog/venv/lib/python3.12/site-packages/django/core/mail/backends/smtp.py", line 124, in send_messages new_conn_created = self.open() ^^^^^^^^^^^ File "/Volumes/mac-etended/pytonDjango/django-example-4/blog/venv/lib/python3.12/site-packages/django/core/mail/backends/smtp.py", line 80, in open self.connection = self.connection_class( ^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/smtplib.py", line 255, in __init__ (code, msg) = self.connect(host, port) ^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/smtplib.py", line 343, in connect (code, msg) = self.getreply() ^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/smtplib.py", line 401, in getreply raise SMTPServerDisconnected("Connection unexpectedly closed: " smtplib.SMTPServerDisconnected: Connection unexpectedly closed: [Errno 54] Connection reset by peer
解决方案
1. 修正SMTP端口与加密方式匹配
端口465对应SSL加密,当前配置未启用SSL导致协议不匹配,修改配置:
EMAIL_USE_TLS = False EMAIL_USE_SSL = True # 启用SSL加密 EMAIL_PORT = 465
若服务商支持TLS,也可改用587端口:
EMAIL_USE_TLS = True EMAIL_PORT = 587
2. 验证邮箱账号权限
- 确认
EMAIL_HOST_PASSWORD正确,部分私人邮箱需使用应用专用密码而非登录密码 - 检查邮箱服务商是否已开启SMTP服务,部分默认关闭需手动开启
3. 排查网络限制
- 本地防火墙或代理可能阻断465/587端口,尝试关闭防火墙或切换网络测试
- 部分云服务器/ISP会封禁SMTP端口,需联系服务商确认
4. 统一发件人账号
send_mail调用中使用的发件人ddddd@gmail.com与配置的EMAIL_HOST_USER不一致,部分服务商要求发件人必须匹配SMTP登录账号:
from django.conf import settings send_mail(subject, message, settings.EMAIL_HOST_USER, [cd['to']])
5. 测试基础SMTP连接
在终端直接测试连接,排除Django代码问题:
python -c "import smtplib; s = smtplib.SMTP_SSL('mail.privateemail.com', 465); s.login('info@custumemail.com', 'xxxxxx'); s.quit()"
若此命令报错,问题出在网络或邮箱配置,而非Django逻辑。
内容的提问来源于stack exchange,提问作者gmal m hafiz
相关产品推荐
相关产品推荐

