Python发送邮件遇SSL错误:WRONG_VERSION_NUMBER与CERTIFICATE_VERIFY_FAILED
SMTP发送邮件报错:WRONG_VERSION_NUMBER与CERTIFICATE_VERIFY_FAILED解决方法
错误原因分析
1. SMTP_SSL() 报 WRONG_VERSION_NUMBER
端口25是明文SMTP端口,并非SSL加密端口。SMTP_SSL要求连接建立时直接启动SSL加密通道,而端口25默认是明文通信,强制SSL握手会出现版本不匹配错误。
2. starttls() 报 CERTIFICATE_VERIFY_FAILED
邮件服务器的SSL证书不被本地Python环境信任,可能是服务器使用自签名证书、证书链不完整,导致SSL握手时验证失败。
解决方案
步骤1:修正SMTP端口配置
- 使用
SMTP_SSL()时,改用465端口(标准SMTP SSL端口) - 使用
starttls()时,改用587端口(标准STARTTLS端口),25端口可能被服务器限制或不支持STARTTLS
步骤2:处理证书验证问题
方案A:导入服务器CA证书(安全推荐)
获取邮件服务器的根CA证书(如server_ca.pem),修改context配置:
context = ssl.create_default_context(cafile="/path/to/server_ca.pem")
方案B:临时关闭证书验证(仅测试环境使用,不安全)
测试场景下可临时禁用证书验证:
context = ssl.create_default_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE
修改后的测试代码示例
示例1:SMTP_SSL(465端口)+ 自定义CA证书
import smtplib, ssl smtp_server = "1.2.3.4" smtp_port = 465 # 改用SMTP_SSL标准端口 smtp_password = "1234" sender_address = "abcd@def.com" receiver_address = "xyz@gmail.com" message = """\ Subject: Hi there This message is sent from Python.""" # 导入服务器CA证书 context = ssl.create_default_context(cafile="/path/to/server_ca.pem") with smtplib.SMTP_SSL(smtp_server, smtp_port, context=context) as server: server.login(sender_address, smtp_password) server.sendmail(sender_address, receiver_address, message)
示例2:starttls(587端口)+ 临时关闭证书验证(测试用)
import smtplib, ssl smtp_server = "1.2.3.4" smtp_port = 587 # 改用STARTTLS标准端口 smtp_password = "1234" sender_address = "abcd@def.com" receiver_address = "xyz@gmail.com" message = """\ Subject: Hi there This message is sent from Python.""" # 临时禁用证书验证(仅测试) context = ssl.create_default_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE with smtplib.SMTP(smtp_server, smtp_port) as server: server.ehlo() server.starttls(context=context) server.ehlo() server.login(sender_address, smtp_password) server.sendmail(sender_address, receiver_address, message)
内容的提问来源于stack exchange,提问作者Akram Hossain Rahat
相关产品推荐
相关产品推荐

