Django使用send_mail发邮件出现ConnectionResetError远程主机强制断开连接错误
修复步骤
- 修正
settings.py中的错误配置
你当前的配置存在两个核心错误:
EMAIL_HOST填写了本地IP,该参数必须为邮箱服务商提供的SMTP发件服务器地址,Rambler邮箱对应SMTP地址为smtp.rambler.ruEMAIL_PORT使用了字符串格式,Django要求该参数为整数类型,需去掉引号
修正后的配置参考:
EMAIL_HOST = 'smtp.rambler.ru' EMAIL_PORT = 465 EMAIL_HOST_USER = 's...6@rambler.ru' # 你的邮箱地址保持不变 EMAIL_HOST_PASSWORD = '.....' # 若普通登录密码失效,可在Rambler邮箱安全设置中生成应用专用密码填入 EMAIL_USE_TLS = False EMAIL_USE_SSL = True # 新增以下两个配置,避免被邮件服务商判定为异常发送 DEFAULT_FROM_EMAIL = EMAIL_HOST_USER SERVER_EMAIL = EMAIL_HOST_USER
- 调整
views.py的发件逻辑
多数邮件服务商(包括Rambler)会校验发件人地址和认证账号的一致性,你原来用用户提交的邮箱作为发件人会触发校验拦截,修改逻辑如下:
from django.shortcuts import render from django.core.mail import send_mail from .forms import ContactForm from django.conf import settings def contact(request): form = ContactForm if request.method == 'POST': message_name = request.POST.get('name') message_email = request.POST.get('email') message = f"留言人姓名:{message_name}\n联系邮箱:{message_email}\n留言内容:{request.POST.get('message')}" send_mail( subject=f"网站新留言:{message_name}", message=message, from_email=settings.EMAIL_HOST_USER, recipient_list=['s****6@rambler.ru'], reply_to=[message_email] # 设置后直接回复邮件即可发送给留言用户 ) return render(request, 'contact.html', {'form': form})
- 额外排查项
如果修改后仍报错,可依次检查:
- 本地防火墙、杀毒软件是否拦截了465端口的出站连接
- 你所在的网络运营商是否封禁了465端口的对外连接
- Rambler邮箱是否开启了第三方客户端登录权限,若开启后仍失效,请使用应用专用密码而非账号登录密码
内容的提问来源于stack exchange,提问作者Badabuska
相关产品推荐
相关产品推荐

