Python3 smtplib连接smtp.office365.com报535认证失败错误
故障诱发原因
这个535 5.7.3 Authentication unsuccessful报错和代码逻辑本身无关,核心触发原因如下:
- 微软已逐步对所有个人Outlook/Hotmail邮箱下线SMTP基础账号密码认证能力,之前脚本稳定运行半年是因为账户处于灰度兼容过渡期,过渡期结束后所有用原始登录密码调用SMTP的请求都会被直接拦截。
- 其他会触发同报错的常见原因:
- 近期修改过邮箱登录密码,代码中硬编码的旧密码未同步更新
- 脚本运行IP触发微软安全风控:比如长期未通过网页端登录邮箱、脚本登录IP和常用登录地差异过大、短时间发信量异常被判定为垃圾发信,临时封禁SMTP权限
- 邮箱设置中手动关闭了POP/IMAP/SMTP的允许接入开关
修复方案
按以下优先级依次排查处理:
- 先排查基础配置问题
- 核对代码中填写的账号密码和网页端可正常登录的密码完全一致,注意排查大小写错误、首尾多余空格问题
- 登录Outlook网页端,进入「设置-邮件-同步电子邮件」页面,确认「允许设备和应用使用POP/IMAP/SMTP」选项为开启状态
- 网页端完成一次完整登录,检查是否有异常登录提醒、安全验证弹窗,按提示完成手机号/邮箱验证,解除临时风控
- 替换认证方式(核心修复步骤,针对微软下线基础密码认证的问题)
- 进入Outlook账户安全设置页,开启双重验证(两步验证),这是生成应用专用密码的强制前置条件
- 双重验证开启后,在同一安全设置页找到「应用密码」入口,新建一个专门给邮件脚本使用的应用专用密码
- 将代码中
passwd字段的原始邮箱登录密码,替换为刚生成的16位应用专用密码即可,不需要修改现有代码里的SMTP地址、端口、TLS配置
- 验证修复
替换完成后重新运行脚本即可正常发信,核心登录段代码无需额外调整,参考如下:
server = smtplib.SMTP('smtp.office365.com', 587) server.ehlo() server.starttls() server.login(user, passwd) # 此处passwd填入生成的应用专用密码,而非账户登录密码 server.sendmail(sender, receiver, msg.as_string()) server.quit()
注意:不要尝试将SMTP服务器替换为旧版
smtp.live.com,该旧服务器已经全量下线,会直接返回连接错误。
内容的提问来源于stack exchange,提问作者Difan Zhao
相关产品推荐
相关产品推荐

