如何解决使用smtplib时触发OSError: [Errno 101]网络不可达问题
问题排查与修复方案
确认校园网屏蔽SMTP请求时的修复方案
- 更换SMTP连接端口:多数邮箱服务商同时支持465端口的SMTPS加密协议,该端口被校园网屏蔽的概率远低于587端口。调整代码逻辑即可:
将原有代码中的
替换为mailServer = smtplib.SMTP('smtp.example.com' , 587) mailServer.starttls()
无需额外修改其他逻辑即可测试连通性。mailServer = smtplib.SMTP_SSL('smtp.example.com' , 465) - 配置代理转发请求:如果校园网要求必须走代理访问公网,可以安装
PySocks库为SMTP请求配置合法的HTTP/SOCKS代理,绕开端口屏蔽。 - 改用邮箱HTTP API发信:主流邮箱服务商均提供基于80/443端口的HTTP发信接口,这两个端口几乎不会被校园网屏蔽,直接调用API发信的兼容性远高于原生SMTP协议。
非校园网屏蔽的其他触发因素
- 树莓派网络配置异常:先在树莓派终端执行
ping smtp.example.com确认域名可以正常解析,再执行telnet smtp.example.com 587测试端口连通性。如果不通先排查树莓派的DNS设置、网关配置,以及是否开启了本地防火墙拦截出站请求。 - 邮箱服务端访问限制:部分邮箱会拦截非常用IP段的客户端登录请求,比如Gmail默认关闭低安全性应用访问权限,需要在邮箱后台开启对应权限,或者生成专用的应用密码用于客户端登录。同时要确认你填写的SMTP服务器地址、端口完全符合邮箱服务商的官方要求。
- Python版本兼容性问题:你使用的Python3.4版本已经停止维护多年,旧版本smtplib存在TLS握手兼容缺陷,可以升级Python到3.7以上版本后重试。
- 本地防火墙拦截:检查树莓派是否配置了ufw、iptables等防火墙规则,拦截了587端口的出站请求,可临时关闭防火墙后复测。
内容的提问来源于stack exchange,提问作者Stolee94
相关产品推荐
相关产品推荐

