使用.NET 6 + MailKit连接Office365 SMTP发送邮件时遭遇535:5.7.139认证失败错误求助
看起来你遇到的是Office365安全策略限制导致的SMTP认证问题,错误提示里的“security defaults policy”是核心线索,我来帮你梳理几个实用的排查和解决方向:
检查组织的安全默认值策略
Office365的安全默认值(Security Defaults)会强制启用包括MFA(多因素认证)在内的安全措施,这时候传统的“用户名+密码”SMTP认证就会失效——哪怕你没看到用户被锁定,这个策略也会直接阻止非现代认证方式的访问。
管理员可以登录Azure AD后台,进入「安全」>「安全默认值」查看是否开启了该策略:如果开启了,要么临时关闭(不推荐长期使用),要么改用下文提到的应用密码或现代认证方案。改用应用密码替代普通账户密码
如果你的组织强制要求MFA,直接用用户的日常密码进行SMTP认证肯定行不通。这时候需要给对应用户创建一个应用密码(App Password),然后在代码里用这个应用密码替换原来的账户密码。
创建步骤:用户登录Microsoft 365账户,进入「我的账户」>「安全信息」>「添加方法」>「应用密码」,生成后务必保存好——因为应用密码只会显示一次。确认Authenticated SMTP的配置生效
你提到已经开启了Authenticated SMTP,要确保是在正确的路径配置:- 管理员登录Microsoft 365管理中心,找到对应的用户
- 进入「邮件」>「电子邮件应用」>「Authenticated SMTP」,设置为「启用」
注意:这个配置更改可能需要15-30分钟才会生效,不要刚设置完就立刻测试。
优化SMTP端口与加密配置
Office365官方推荐使用端口587 + StartTls加密方式,端口25可能被你的组织或ISP屏蔽,建议优先固定用587。代码里的SecureSocketOptions.StartTls是正确的,不要换成SslOnConnect(那是端口465的配置方式)。移除XOAUTH2认证机制
你代码里注释掉了client.AuthenticationMechanisms.Remove("XOAUTH2");,建议取消注释这行。因为MailKit默认会优先尝试XOAUTH2认证,但Office365的普通SMTP认证并不兼容这个机制,移除后会强制使用传统的用户名密码认证流程,避免不必要的干扰。
调整后的代码示例:
using var client = new SmtpClient(); try { client.Connect(_emailConfig.SmtpServer, _emailConfig.Port, MailKit.Security.SecureSocketOptions.StartTls); // 移除XOAUTH2认证机制,避免干扰传统用户名密码认证 client.AuthenticationMechanisms.Remove("XOAUTH2"); // 若使用应用密码,此处替换为生成的应用密码 client.Authenticate(_emailConfig.UserName, _emailConfig.Password); client.Send(mailMessage); } catch (Exception ex) { // 建议记录详细错误信息,方便后续排查 Console.WriteLine($"邮件发送失败:{ex.Message}"); throw; } finally { client.Disconnect(true); client.Dispose(); }
备注:内容来源于stack exchange,提问作者Pawan Nogariya




