为何Python的smtplib在VSCode等编辑器超时,Replit却运行正常?
解决本地Python smtplib连接Gmail超时问题
你遇到的情况是本地运行代码触发TimeoutError,但Replit上正常,核心原因是本地网络环境或Gmail安全配置限制了连接,以下是具体解决步骤:
1. 排查本地防火墙/杀毒软件拦截
- 临时关闭Windows防火墙(或其他第三方防火墙),再运行代码测试,确认是否是防火墙阻断了Python的网络请求。如果没问题,把Python程序加入防火墙白名单。
- 部分杀毒软件的网络监控功能也会拦截SMTP连接,暂时禁用相关模块后重试。
2. 更换网络环境测试
- 切换到手机热点网络,排除公司/学校局域网屏蔽SMTP端口(587/465)的可能。很多内网会限制这类邮件服务端口。
3. 检查Gmail安全配置
- 如果你的Gmail账号开启了两步验证,绝对不能用原密码登录,必须生成「App密码」:
- 登录Google账号后台,进入「安全」页面
- 确保「两步验证」已开启,然后找到「App密码」选项
- 生成一个用于邮件客户端的App密码,替换代码里的
password字段
- 如果没开两步验证,现在Gmail默认禁用了“不安全应用访问”,还是建议开启两步验证后用App密码,这是当前唯一合法的非OAuth登录方式。
4. 调整代码的SMTP连接方式
- 尝试改用SSL直接连接(端口465),替代原来的STARTTLS(端口587),代码修改如下:
import smtplib my_email = "<email>@gmail.com" password = "你的App密码" # 改用SMTP_SSL直接连接465端口 connection = smtplib.SMTP_SSL("smtp.gmail.com", 465) connection.login(user=my_email, password=password) # 注意邮件格式必须包含Subject头,否则可能被判定为垃圾邮件 connection.sendmail( from_addr=my_email, to_addrs="receive@gmail.com", msg="Subject: 测试邮件\n\n这是测试内容" ) connection.close() print("done")
- 另外,原代码的
msg缺少Subject头,即使发送成功也可能被收件方放到垃圾邮件里,建议按上面的格式补充。
5. 检查本地DNS解析
- 若以上方法都无效,可能是本地DNS解析
smtp.gmail.com失败,尝试修改本地DNS服务器为8.8.8.8(Google公共DNS)后重试。
内容的提问来源于stack exchange,提问作者Andrew Ayegh
相关产品推荐
相关产品推荐

