VB.NET使用OAuth发送Outlook免费账户邮件遇535认证失败错误
解决Outlook免费账户MailKit OAuth认证535错误的方案
一、前提确认
Outlook免费个人账户(@outlook.com/@hotmail.com等)无需Office 365付费订阅,完全支持通过OAuth2认证使用SMTP发送邮件,你的方向是可行的。
二、Azure Portal配置修正
- 应用类型必须为公共客户端:注册应用时选择「移动和桌面应用」类型,VB.NET桌面应用属于公共客户端,不能用Web应用/机密客户端类型,否则生成的令牌无法通过SMTP认证。
- 权限配置调整:删除错误的权限项,添加Office 365 Exchange Online的
SMTP.Send委托权限(注意不是Microsoft Graph下的同名权限),同时保留offline_access、openid、profile、User.Read委托权限。添加后需完成权限同意(个人账户需用户在授权流程中手动同意)。 - 使用正确的认证端点:授权和令牌请求必须用
common租户端点:- 授权端点:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize - 令牌端点:
https://login.microsoftonline.com/common/oauth2/v2.0/token
- 授权端点:
- 开启公共客户端流:在应用的「身份验证」->「高级设置」中,确认「允许公共客户端流」已开启。
三、代码与参数修正
- SMTP服务器与端口:确保传入的参数为:
Str_Smtp:smtp.office365.com(旧的smtp.outlook.com已逐步迁移,使用旧端点可能导致认证失败)Str_Port:587
- 令牌Scope验证:生成令牌时,请求的scope必须包含
https://outlook.office365.com/SMTP.Send,完整scope示例:
可通过JWT解析工具检查令牌,确认openid profile offline_access User.Read https://outlook.office365.com/SMTP.Sendscp字段包含SMTP.Send,且aud字段为https://outlook.office365.com。 - SaslMechanismOAuth2参数:确保第一个参数是用户完整邮箱地址(与授权账户一致),你的代码中用
Str_From是正确的,但需确认该值为用户的@outlook.com邮箱,而非别名。 - 使用授权码流(带PKCE):公共客户端必须使用PKCE流程生成令牌,否则令牌会被SMTP服务拒绝。
四、额外排查
用JWT工具解析你的访问令牌,确认:
sub字段对应用户的Outlook账户IDexp字段未过期scp字段包含SMTP.Send权限
内容的提问来源于stack exchange,提问作者Erich
相关产品推荐
相关产品推荐

