Django发送邮件报错ConnectionRefusedError[WinError10061]求助
Django邮件发送ConnectionRefusedError([WinError 10061]) 修复方案
核心问题分析
「目标计算机积极拒绝连接」错误本质是SMTP服务器连接失败,再加上代码中参数传递、逻辑缩进、字段拼写等多处错误,导致邮件发送逻辑完全无法正常执行。
分步修复方案
1. 修正SMTP服务器配置(settings.py)
你的EMAIL_HOST末尾多了一个空格,这会导致Django无法解析正确的SMTP服务器地址:
# 错误写法 EMAIL_HOST = "smtp.gmail.com " # 修正后 EMAIL_HOST = "smtp.gmail.com"
额外注意Gmail SMTP的权限要求:
- 若使用普通密码,需开启「低安全性应用访问」(不推荐);推荐开启2FA后使用应用专用密码
EMAIL_PORT=587和EMAIL_USE_TLS=True是Gmail TLS端口的标准配置,无需修改
2. 修复视图函数的逻辑错误(views.py)
视图中存在缩进、参数传递、字段匹配等多处错误,修正后代码如下:
from django.core.mail import send_mail from django.conf import settings # 必须导入settings模块 def contact(request): if request.method == "POST": # 匹配表单字段拼写,或后续修正表单的name属性为firstname firstname = request.POST.get('fistname', '') lastname = request.POST.get('lastname', '') email = request.POST.get('email', '') msg = request.POST.get('msg', '') # 将send_mail缩进在POST判断内,避免非提交请求触发发送 send_mail( '用户留言通知', # 自定义邮件主题 f"来自用户的留言:\n姓名:{firstname} {lastname}\n邮箱:{email}\n内容:{msg}", # 用变量填充邮件内容 settings.EMAIL_HOST_USER, # 引用settings变量,而非字符串字面量 [email], # 用表单提交的邮箱作为收件人,而非字符串'email' fail_silently=False, ) return render(request,'core/contact.html')
关键修正点:
send_mail必须缩进在if request.method == "POST"代码块内,避免每次访问页面都触发邮件发送- 发件人、邮件内容、收件人需使用变量而非字符串字面量
- 用
request.POST.get()替代直接索引,避免表单字段缺失时抛出KeyError
3. 修正HTML表单的字段拼写错误
表单中firstname输入框的name属性拼写错误,修正后确保和视图中的字段名匹配:
<!-- 错误写法 --> <input type="text" class="form-control" placeholder="First name" style="height: 50px;" name="fistname"> <!-- 修正后 --> <input type="text" class="form-control" placeholder="First name" style="height: 50px;" name="firstname">
额外验证步骤
可以用Python自带库测试SMTP连接是否正常:
import smtplib try: server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login('你的邮箱地址', '应用专用密码/账号密码') print("SMTP连接成功") server.quit() except Exception as e: print(f"连接失败:{e}")
内容的提问来源于stack exchange,提问作者Shivam Pandey
相关产品推荐
相关产品推荐

