项目启动报错:远程主机强迫关闭了一个现有的连接

本文分享了一个常见的项目启动问题解决方案:当控制台显示远程关闭现有连接时,这通常是因为项目未完全关闭就尝试二次启动。文章提供了解决办法,即通过任务管理器结束相关线程来避免此问题。

当你启动项目后,控制台没有显示启动成功,反而给你显示一个远程关闭现有连接…

当时还是小白的我,一度无法解决,就重启eclipse,再后来不管用就重启电脑,最后终于明白了是由于项目并未关闭就第二次启动,才会出现这个情况。

在这里插入图片描述

解决办法很简单,打开任务管理器,把线程都沙雕(杀掉)就没问题了。

你遇到的错误: > **`Connection unexpectedly closed: [WinError 10054] 远程主机强迫关闭一个现有连接`** 这是一个非常常见的网络通信错误,尤其是在使用 Python 发送邮件(SMTP)、连接数据库、爬虫请求或与服务器交互时。 --- ## ✅ 错误解释 ### 🔍 错误代码:`WinError 10054` - 中文含义:**远程主机强迫关闭一个现有连接** - 英文原文:`An existing connection was forcibly closed by the remote host` - 对应 Linux/Unix 系统中的 `ECONNRESET` ### 📌 本质原因: > **对方服务器主动断开了 TCP 连接**,而你的程序还在尝试读取或写入数据。 这通常不是本地问题,而是**远程服务端拒绝了你的连接行为**。 --- ## ⚠️ 常见触发场景(以 SMTP 发邮件为例) ```python import smtplib server = smtplib.SMTP('smtp-mail.outlook.com', 587) server.starttls() server.login('user@outlook.com', 'password') # 报错:Connection unexpectedly closed: [WinError 10054] ``` 在这种情况下,可能的原因包括: | 原因 | 说明 | |------|------| | ❌ 账户未开启双重验证 | Outlook 要求必须开启 MFA 才允许应用登录 | | ❌ 没有使用“应用密码” | 使用普通密码会导致认证失败,服务器直接断开 | | ❌ 使用了已被禁用的基本身份验证(Basic Auth) | 微软已于 2022 年全面停用 | | ❌ IP 被临时封禁 | 频繁尝试登录导致被限流 | | ❌ TLS 握手失败 | 客户端不支持现代加密协议 | | ❌ 防火墙或杀毒软件拦截 | 如 Windows Defender、360 等中断连接 | --- ## ✅ 解决方案(按优先级排序) ### ✅ 方案 1:确认是否启用了「双重验证」+「应用密码」 这是最常见也是最容易忽略的问题! #### 步骤如下: 1. 打开浏览器访问:[https://account.microsoft.com/security](https://account.microsoft.com/security) 2. 登录你的 Outlook/Hotmail 邮箱 3. 查看是否提示:“你需要设置两步验证才能继续” 4. 如果没有开启,请点击「开启」 5. 设置完成后,进入「高级安全选项」→ 「创建新的应用密码」 6. 复制生成的 16 位密码(如 `abcd efgh ijkl mnop`) 7. 在 Python 脚本中使用这个密码代替你的普通密码 📌 注意:**每次修改应用密码后,旧密码立即失效!** --- ### ✅ 方案 2:检查 SMTP 配置是否正确 ```python import smtplib from email.mime.text import MIMEText # ✅ 正确配置示例 SENDER_EMAIL = "yourname@outlook.com" APP_PASSWORD = "abcd efgh ijkl mnop" # ← 应用密码,去掉空格也可 RECIPIENT_EMAIL = "friend@example.com" try: print("正在连接 SMTP 服务器...") server = smtplib.SMTP('smtp-mail.outlook.com', 587) # ✅ 端口 587 server.set_debuglevel(1) # 可选:显示详细通信过程 print("启动 TLS 加密...") server.starttls() # 必须调用 starttls() print("正在登录...") server.login(SENDER_EMAIL, APP_PASSWORD.replace(" ", "")) # 去掉空格 msg = MIMEText("测试内容") msg["Subject"] = "测试邮件" msg["From"] = SENDER_EMAIL msg["To"] = RECIPIENT_EMAIL print("发送中...") server.sendmail(SENDER_EMAIL, RECIPIENT_EMAIL, msg.as_string()) server.quit() print("✅ 邮件发送成功!") except Exception as e: print(f"❌ 发生异常: {e}") ``` 📌 关键点: - 必须使用 `starttls()` 启用加密 - 必须使用正确的服务器地址和端口 - 密码必须是“应用密码” --- ### ✅ 方案 3:更换网络环境(解决 IP 封禁问题) 微软会对频繁失败的登录尝试进行限制。 #### 推荐操作: - 断开当前 Wi-Fi,改用手机热点 - 或等待 1~2 小时后再试 - 不要循环快速重试(会加重封禁) 💡 提示:你可以先在浏览器中尝试登录 [https://outlook.com](https://outlook.com),如果也无法登录,说明账户可能被锁定。 --- ### ✅ 方案 4:关闭防火墙或杀毒软件(临时测试) 某些安全软件(如 360、腾讯电脑管家、卡巴斯基)会主动拦截 SMTP 连接。 #### 测试方法: 1. 暂时关闭防火墙和杀毒软件 2. 再次运行脚本 3. 如果成功 → 说明是安全软件干扰 📌 解决方案: - 将你的 Python 脚本添加为信任程序 - 或改用更安全的 OAuth2 + Graph API 方式 --- ### ✅ 方案 5:升级 Python 和 SSL/TLS 支持 老旧版本的 Python(如 3.6 以下)可能不支持现代 TLS 1.2+ #### 检查方法: ```python import ssl print(ssl.OPENSSL_VERSION) # 输出应类似:OpenSSL 1.1.1k 25 Mar 2021 ``` 👉 推荐使用 **Python 3.8+** 版本,并确保系统更新到最新补丁。 --- ### ✅ 方案 6:改用 Microsoft Graph API(推荐长期方案) 既然传统 SMTP 容易出问题,不如彻底转向现代认证方式。 #### 使用 MSAL + OAuth2 登录,无需用户名密码: ```python import msal import requests CLIENT_ID = "your-client-id" CLIENT_SECRET = "your-client-secret" TENANT_ID = "your-tenant-id" authority = f"https://login.microsoftonline.com/{TENANT_ID}" app = msal.ConfidentialClientApplication( CLIENT_ID, client_credential=CLIENT_SECRET, authority=authority ) result = app.acquire_token_for_client(scopes=["https://graph.microsoft.com/.default"]) if "access_token" in result: headers = { 'Authorization': f'Bearer {result["access_token"]}', 'Content-Type': 'application/json' } email_data = { "message": { "subject": "自动发送", "body": {"contentType": "Text", "content": "通过 Graph API 发送"}, "toRecipients": [{"emailAddress": {"address": "user@example.com"}}] } } resp = requests.post( "https://graph.microsoft.com/v1.0/users/me/sendMail", headers=headers, json=email_data ) print(resp.status_code, resp.text) else: print("获取 token 失败:", result) ``` 📌 优点: - 不依赖应用密码 - 更安全 - 不会被 WinError 10054 频繁中断 --- ## ✅ 总结:如何避免 `WinError 10054` | 检查项 | 是否完成 | |--------|---------| | ✅ 是否开启了双重验证? | ☐ / ✅ | | ✅ 是否使用了“应用密码”而非普通密码? | ☐ / ✅ | | ✅ SMTP 地址和端口是否正确? | `smtp-mail.outlook.com:587` | | ✅ 是否调用了 `starttls()`? | ☐ / ✅ | | ✅ 是否在网络受限环境下?(如公司内网) | 可换热点测试 | | ✅ 是否被防火墙拦截? | 临时关闭测试 | | ✅ 是否考虑迁移到 Graph API? | 强烈推荐 ✅ | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值