smtplib使用SMTP_SSL出现WRONG_VERSION_NUMBER错误如何解决
错误含义
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number 是SSL/TLS握手失败的典型报错,核心原因是客户端和服务端在协商加密协议版本时无法达成一致。放在你的场景里,绝大多数情况是你用隐式TLS的SMTP_SSL请求了一个没有开启隐式加密的端口,服务端返回的明文响应被客户端当作SSL报文解析,直接触发版本号不匹配的错误。
你的STARTTLS版本接口可以正常运行,说明Postfix的TLS证书、加密配置本身没有问题,问题确实出在465端口的隐式TLS配置缺失。
解决方法
方案1:开启Postfix 465端口的隐式TLS服务(适配你现有SMTP_SSL代码)
Postfix默认仅开启587端口的STARTTLS显式加密服务,465端口的隐式加密需要手动开启:
- 编辑Postfix配置文件
/etc/postfix/master.cf,找到被注释的smtps相关配置段,取消注释即可:
smtps inet n - n - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
- 保存配置后重启Postfix服务生效:
systemctl restart postfix - 验证465端口是否正常监听:
ss -tulnp | grep 465
确认端口正常监听后,再次调用send_mail_ssl函数即可正常运行。
方案2:直接复用现有STARTTLS接口(无需修改服务端配置)
如果没有强制要求使用465端口发信,你已经跑通的send_mail_tls接口安全性和隐式TLS没有差异,可以直接使用,不需要额外维护SMTP_SSL版本的代码。
可选排查项
如果开启465端口后仍然报错,可以做以下检查:
- 确认服务器防火墙、云服务商安全组已经开放465端口的入站访问权限
- 可以手动指定客户端支持的最低TLS版本,避免版本协商失败:在创建context后添加
context.minimum_version = ssl.TLSVersion.TLSv1_2 - 用openssl命令直接验证465端口的SSL状态:
openssl s_client -connect smtp.mydomain.com:465,如果命令执行失败则说明服务端465端口配置仍然有问题
内容的提问来源于stack exchange,提问作者rudicangiotti
相关产品推荐
相关产品推荐

