python发送QQ邮件报错:ssl.SSLError: [SSL: WRONG_VERSION_NUMBER]和smtplib.SMTPAuthenticationError(已解决)

本文介绍使用Python发送QQ邮箱遇到的SSL错误及登录失败问题,并给出正确的服务器设置和授权码解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用python代码发送qq邮件时,采用了以下服务器设置,结果报错:

server = smtplib.SMTP_SSL('smtp.qq.com', 587)

报错信息为:

ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1129)

问题出在发送服务器代码“587”上,按照QQ邮箱对应指南,应为“465”:

server = smtplib.SMTP_SSL('smtp.qq.com', 465)

更正后出现新的报错,

smtplib.SMTPAuthenticationError: (535, b'Login Fail. Please enter your authorization code to login...

这里提示的是登录邮箱失败,并解释说:(利用代码登录QQ邮箱时,)应输入“授权码”(authorization code)(而不是常规邮箱密码)。问题即出在以下这行代码的“mail_password”:

server.login(from_address, mail_password)

至于“授权码”,在“QQ邮箱-设置-账户-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”下,可以看到一贴生成QQ邮箱登录授权码的“温馨提示”,详见:

什么是授权码,它又是如何设置?

用“授权码”替换前述“mail_password”后,邮件即发送成功了。

2022.11.07

### 解决 WRITE_EPROTO WRONG_VERSION_NUMBER 错误 WRITE_EPROTO WRONG_VERSION_NUMBER 是一种常见的 SSL/TLS 协议错误,通常发生在客户端服务器之间的协议版本不匹配时。以下是可能的原因以及解决方案: #### 可能原因分析 1. **TLS 版本冲突** 客户端服务端支持的 TLS 版本不同可能导致此问题。如果服务端仅支持较新的 TLS 版本(如 TLS 1.2 或更高),而客户端尝试使用旧版协议(如 TLS 1.0 或 SSLv3),则会触发该错误[^1]。 2. **加密套件不兼容** 如果双方使用的加密算法或密钥交换方法不一致,则可能会导致握手失败并抛出 `WRONG_VERSION_NUMBER` 错误[^2]。 3. **库配置不当** 使用的 SSL 库未正确编译或缺少必要的功能扩展(例如 TLS 扩展)。这可能是由于 OpenSSL 的构建选项缺失所致[^3]。 --- ### 解决方案 #### 方法一:更新 OpenSSL BoringSSL 到最新版本 确保所依赖的 SSL 库是最新的稳定版本。可以通过以下命令安装最新的 OpenSSL: ```bash sudo apt-get update && sudo apt-get install libssl-dev openssl ``` 对于 BoringSSL 用户,建议从官方仓库获取源码并重新编译以应用最近的安全补丁。 #### 方法二:强制指定 TLS 版本 通过设置环境变量或者修改应用程序代码来限定最低 TLS 版本为 1.2 或以上。例如,在 Python 中可以这样实现: ```python import ssl context = ssl.create_default_context() context.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 # 禁用低版本 TLS ``` 在 HAProxy 配置文件中也可以显式声明所需的 TLS 参数: ```plaintext frontend https-in bind *:443 ssl crt /path/to/cert.pem alpn h2,http/1.1 no-tls-v1 no-tls-v1.1 ``` #### 方法三:验证 Haproxy 支持 TLS 扩展 运行以下命令确认当前环境中启用的支持特性: ```bash haproxy -vv | grep "built with" ``` 如果没有发现对 TLS Extensions 的支持,请下载带有完整功能集的新版本重试。 #### 方法四:调试记录日志 增加详细的网络通信跟踪有助于定位具体位置发生的问题。开启 verbose logging 并查找异常行为模式: ```bash export OPENSSL_DEBUG=1; your_command_here ``` --- ### 总结 上述措施涵盖了大部分场景下修复 WRITE_EPROTO WRONG_VERSION_NUMBER 的途径。实际操作过程中需结合具体情况调整策略,并始终关注底层组件的状态及其相互作用关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值