Microsoft 365 Business Basic SMTP认证失败排查求助
我使用自定义域名的Microsoft 365企业邮箱账号 myemail@secretdomain.ca,通过以下Python代码发送邮件时遭遇SMTP认证失败,无法投递:
import smtplib, ssl port = 587 # For starttls smtp_server = 'smtp.office365.com' sender_email = 'myemail@secretdomain.ca' receiver_email = 'receiver@hotmail.ca' password = 'mysecretpassword' message = """\ Subject: Hi there This message is sent from Python.""" context = ssl.create_default_context() with smtplib.SMTP(smtp_server, port) as server: server.ehlo() # Can be omitted server.starttls(context=context) server.ehlo() # Can be omitted server.login(sender_email, password) server.sendmail(sender_email, receiver_email, message)
报错信息如下:
smtplib.SMTPAuthenticationError: (535, b'5.7.139 Authentication unsuccessful, the request did not meet the criteria to be authenticated successfully. Contact your administrator
已尝试的排查步骤:
- 确认邮箱账号和密码无误
- 更换为普通Outlook/Hotmail账号(同步修改SMTP服务器为
smtp-mail.outlook.com)后代码正常运行,排除防火墙及代码本身问题 - 通过Outlook客户端设置→邮件→同步邮件→SMTP设置验证配置正确性
- 在Exchange管理中心取消勾选「设置→邮件流→关闭SMTP AUTH协议」
- 在活动用户详情中勾选「邮件→托管邮件应用→已验证SMTP」
- 确认该账号已禁用多因素认证,无需使用应用密码
- 添加了从组织邮件服务器到Office 365的连接器,覆盖域名
*.secretdomain.ca
可能的问题点及解决方法:
单个用户SMTP AUTH权限未启用
全局SMTP AUTH开启不代表单个用户权限默认启用。进入Exchange管理中心→收件人→邮箱→找到myemail@secretdomain.ca→邮箱功能→邮件流设置→SMTP AUTH,确认状态为「启用」,若为禁用则修改为启用。发送IP被Office 365安全策略拦截
Office 365会拦截非信任IP的SMTP登录请求:- 将发送邮件的服务器IP添加到Exchange管理中心→保护→连接筛选器→IP允许列表
- 检查Azure AD条件访问策略,确认没有针对SMTP协议的IP或设备限制规则
Azure AD安全默认值限制传统认证
即使禁用MFA,Azure AD安全默认值可能仍阻止SMTP这类传统认证协议。进入Azure门户→Azure Active Directory→属性→管理安全默认值,确认是否关闭了安全默认值(开启状态下传统认证会被限制)。连接器配置方向错误
若直接使用企业邮箱通过SMTP发送,无需添加「从组织服务器到Office 365」的连接器,反而要检查是否有反向连接器设置错误,或连接器的IP限制规则是否排除了当前发送IP。密码特殊字符编码问题
若密码包含@、!等特殊字符,直接传入Python代码可能出现编码异常。可以尝试用urllib.parse.quote()编码密码后再传入server.login(),或更换不含特殊字符的测试密码验证。区域SMTP服务器适配问题
尝试更换SMTP服务器为对应区域端点,比如北美区域可使用smtp.outlook.com(与smtp.office365.com功能一致,但部分场景下兼容性不同),或根据账号所属Exchange Online区域选择对应SMTP地址。
内容的提问来源于stack exchange,提问作者IWantAnswers

