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
相关产品推荐
相关产品推荐

