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

Gmail SMTP 587端口兼容SSL版本及WRONG_VERSION_NUMBER错误排查

解决Gmail SMTP STARTTLS中的SSLError: WRONG_VERSION_NUMBER错误

Gmail SMTP 587端口兼容的TLS版本

Gmail SMTP 587端口(STARTTLS模式)仅支持TLS 1.2和TLS 1.3,已废弃SSLv3、TLS 1.0、TLS 1.1。你的OpenSSL 3.0.11完全满足版本要求,错误并非由版本不兼容导致。

错误原因分析

你的代码核心问题是TLS升级流程错误:
发送STARTTLS命令并收到服务器220 Ready to start TLS的确认后,你没有使用已建立的client_socket升级为TLS连接,反而新建了一个全新的socket连接。587端口默认是明文SMTP端口,直接对新socket发起SSL握手会导致服务器将握手报文识别为无效的明文SMTP命令,从而返回异常响应,触发WRONG_VERSION_NUMBER错误。

STARTTLS的标准流程是在已有的TCP明文连接上直接升级为TLS连接,而非重新建立连接。

修正后的代码

将TLS包装部分的代码替换为以下内容:

# Wrap the existing client_socket in SSL/TLS protocol
context = ssl.create_default_context()
print(ssl.OPENSSL_VERSION)

# 使用已建立的client_socket升级为TLS连接
with context.wrap_socket(client_socket, server_hostname=mailserver[0]) as ssock:
    print(ssock.version())
    # TLS升级后需重新发送EHLO命令初始化会话
    ehlo_tls = f'EHLO {socket.gethostbyname(socket.gethostname())}\r\n'
    ssock.send(ehlo_tls.encode())
    recv_tls = ssock.recv(1024).decode()
    print(recv_tls)
    
    # 后续的SMTP命令(AUTH、MAIL FROM、RCPT TO等)均通过ssock发送
    # ... 剩余实现代码 ...

额外注意事项

  • TLS升级后必须重新发送EHLO命令,因为明文阶段的EHLO会话在TLS升级后已失效。
  • 若你的Google账号开启了两步验证,需使用应用专用密码进行SMTP认证,而非原账号密码;未开启2FA的账号可暂时允许"不太安全的应用访问"(不推荐,建议启用2FA并使用应用密码)。
  • 默认的ssl.create_default_context()已配置为启用TLS 1.2+,无需额外指定版本,完全适配Gmail要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:10:29