You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更换IP后Python发送Gmail报[WinError 10060]错误求助

解决Gmail SMTP连接超时(WinError 10060)问题

针对你换IP后无法连接Gmail SMTP服务器的问题,从网络、代码、账号三个维度给出排查和解决方法:

一、先排查网络连通性

WinError 10060是TCP连接超时,说明新IP环境下根本连不上smtp.gmail.com的465端口,优先确认网络通路:

  • 手动测试:打开命令提示符,执行 telnet smtp.gmail.com 465(若没有telnet,先在Windows功能里启用)。如果提示“无法打开连接”,原因可能是:
    1. 你的新IP被Gmail反垃圾系统拉黑(常见于动态IP、共享IP)
    2. 所在网络的运营商/防火墙拦截了465端口(比如公司内网、校园网)
  • 换端口尝试:改用Gmail推荐的587端口+STARTTLS协议,很多网络环境下587不会被拦截。

二、代码调整与优化

1. 切换到587端口(优先尝试)

恢复你代码中注释掉的587端口逻辑,替换当前的SMTP_SSL代码:

# 替换原SMTP_SSL相关代码
mailServer = smtplib.SMTP("smtp.gmail.com", 587)
mailServer.ehlo()
mailServer.starttls()  # 必须开启TLS加密
mailServer.login(gmail_user, gmail_pwd)

2. 增加超时参数

给SMTP连接加上超时限制,避免无限等待:

# 针对465端口的情况
mailServer = smtplib.SMTP_SSL('smtp.gmail.com', 465, timeout=30)
# 针对587端口的情况
mailServer = smtplib.SMTP("smtp.gmail.com", 587, timeout=30)

3. 完善错误捕获与规范代码

添加异常捕获明确错误类型,同时优化类型判断逻辑:

@retry(stop_max_delay=60000)
def mail(gmail_user, gmail_pwd, to, subject, text, attach=None):
    to = to if isinstance(to, list) else [to]  # 替换原type判断,更规范

    msg = MIMEMultipart()
    msg['From'] = gmail_user
    msg['To'] = to[0]
    msg['Cc'] = ','.join(to[1:])
    msg['Subject'] = subject

    msg.attach(MIMEText(text))

    if attach:
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(open(attach, 'rb').read())
        encode_base64(part)
        part.add_header('Content-Disposition',
                        'attachment', filename=('utf-8', 'he', os.path.basename(attach)))
        msg.attach(part)

    try:
        mailServer = smtplib.SMTP("smtp.gmail.com", 587, timeout=30)
        mailServer.ehlo()
        mailServer.starttls()
        mailServer.login(gmail_user, gmail_pwd)
        # sendmail需包含所有收件人(To+Cc),这里to列表已包含全部
        mailServer.sendmail(gmail_user, to, msg.as_string())
        mailServer.quit()
    except smtplib.SMTPConnectError as e:
        print(f"连接SMTP服务器失败: {e}")
        raise
    except smtplib.SMTPAuthenticationError as e:
        print(f"认证失败: {e}")
        raise
    except Exception as e:
        print(f"发送邮件出错: {e}")
        raise

三、账号安全设置排查

  • 确认应用专用密码有效性:
    1. 登录Google账号安全中心,检查两步验证是否正常开启
    2. 重新生成应用专用密码时,选择“邮件”作为应用类型,复制时不要带空格或多余字符
  • 检查账号状态:查看Gmail收件箱是否有“异常登录提醒”或“账号锁定”通知,若有按提示解锁

四、其他排查点

  • 本地防火墙/杀毒软件:确认Python程序被允许访问网络,没有被拦截出站连接
  • IP更换频率:如果是频繁更换动态IP,Gmail可能触发临时限制,建议使用静态IP或等待24小时后重试

内容的提问来源于stack exchange,提问作者davidbrown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:36:26