Python通过smtplib发送Outlook邮件触发535认证错误排查
Office365 SMTP 535认证错误排查方案
你猜测的非默认SMTP参数、用户名传参异常确实是可能诱因,但企业环境下该报错绝大多数是认证策略限制导致,按优先级排查即可:
- 先验证基础配置正确性
微软365公网SMTP标准参数为smtp.office365.com、端口587、强制启用STARTTLS,你当前代码里的这部分配置是正确的。如果企业是Exchange混合部署、本地自建Exchange的场景,确实会使用自定义SMTP地址,直接联系IT索要企业内部SMTP服务器地址即可,这种场景下连公网Office365 SMTP地址必然认证失败。 - 最高发原因:企业启用了MFA(多因素认证)或安全默认值,拦截了明文密码的SMTP认证请求
目前绝大多数企业微软365租户默认开启安全默认策略,传统SMTP AUTH协议直接用账号登录密码认证的方式是默认禁用的,哪怕你输入的账号密码和系统登录密码完全一致,也会返回凭证错误。
对应解决方式:要么联系IT给你的账号单独开启SMTP AUTH权限,要么在账号安全中心生成应用专用密码,用生成的16位应用密码替换代码里的Windows登录密码即可,注意应用专用密码仅在账号开启MFA后支持生成。 - 第二高发原因:SMTP协议被租户全局/账号级禁用
很多企业为了防钓鱼、防账号泄露,会全局关闭SMTP、POP3、IMAP这类传统认证协议,这种场景下无论你密码是否正确、是否配置MFA,只要走SMTP登录就会直接返回535错误,该配置是租户管理员权限,个人无法修改,只能联系IT确认你的账号是否放开了SMTP协议访问权限。 - 传参类问题排查
你代码里的username字段必须填写完整的邮箱地址,不能只写@前缀的账号名,这部分当前写法是正确的;如果硬编码的密码里包含反斜杠、引号这类特殊字符,注意检查Python字符串转义是否正常,可以在登录前打印username和password变量,确认传递给SMTP服务的值和你预期的完全一致。 - 特殊场景排查
如果你的账号是本地AD域同步的联合账号,部分企业的AD FS配置会禁止域账号直接走公网Office365 SMTP认证,必须连接企业内网指定的Exchange SMTP服务器才能发信,不能使用公网的smtp.office365.com地址。
快速验证方法:拿非企业域的个人Outlook邮箱用同一段代码测试,如果个人邮箱可以正常发信,就说明代码逻辑没有任何问题,故障点完全在企业侧的认证策略、权限或服务器配置上,不需要在代码层面排查问题。
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

