Python使用SMTP发送Outlook邮件报SSL WRONG_VERSION_NUMBER错误如何解决
错误原因
你遇到的SSL: WRONG_VERSION_NUMBER报错是SMTP连接协议与端口不匹配导致的:Outlook的587端口不支持直接发起SSL握手,需要先建立普通TCP连接后通过STARTTLS命令升级为加密连接,你使用SMTP_SSL类直接对587端口发起SSL握手,就会触发版本不匹配错误。
排查步骤
- 首先确认Outlook官方SMTP配置规则:直连SSL加密对应465端口,STARTTLS加密对应587端口,两者不能混配
- 检查代码中使用的连接类与端口是否对应:
SMTP_SSL类匹配465端口,普通SMTP类加starttls()方法匹配587端口 - 若调整后仍报错,检查Outlook账号是否开启了第三方客户端SMTP权限,开启两步验证的账号需要使用专用应用密码登录,同时确认本地网络没有防火墙、代理拦截SMTP端口的出站请求
修复方案
有两种常用的正确配置方式,任选其一即可:
方案1:使用SMTP_SSL + 465端口
import smtplib from email.message import EmailMessage msg = EmailMessage() msg['From'] = '你的Outlook邮箱地址' msg['Subject'] = '邮件主题' msg['To'] = '收件人邮箱地址' msg.set_content('邮件正文内容') # 修改端口为465,适配SMTP_SSL协议 with smtplib.SMTP_SSL('smtp-mail.outlook.com', 465) as smtp: smtp.login('你的Outlook邮箱地址', '你的密码/应用专用密码') smtp.send_message(msg) print('Email sent!')
方案2:使用普通SMTP + STARTTLS + 587端口
import smtplib from email.message import EmailMessage msg = EmailMessage() msg['From'] = '你的Outlook邮箱地址' msg['Subject'] = '邮件主题' msg['To'] = '收件人邮箱地址' msg.set_content('邮件正文内容') # 使用普通SMTP类连接587端口,手动开启TLS加密 with smtplib.SMTP('smtp-mail.outlook.com', 587) as smtp: smtp.starttls() smtp.login('你的Outlook邮箱地址', '你的密码/应用专用密码') smtp.send_message(msg) print('Email sent!')
注意事项
- 开启了两步验证的Outlook账号,不能直接用原账号密码登录SMTP服务,需要到微软账户安全中心生成应用专用密码后使用
- 企业版Outlook的SMTP地址和端口可能和公共版不同,需要联系所在企业的IT部门确认正确配置
- 部分网络运营商会封禁465、587端口的出站请求,若配置正确仍连接失败,可以切换网络测试
内容的提问来源于stack exchange,提问作者Echchama Nayak
相关产品推荐
相关产品推荐

