You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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示例:
    openid profile offline_access User.Read https://outlook.office365.com/SMTP.Send
    
    可通过JWT解析工具检查令牌,确认scp字段包含SMTP.Send,且aud字段为https://outlook.office365.com。
  • SaslMechanismOAuth2参数:确保第一个参数是用户完整邮箱地址(与授权账户一致),你的代码中用Str_From是正确的,但需确认该值为用户的@outlook.com邮箱,而非别名。
  • 使用授权码流(带PKCE):公共客户端必须使用PKCE流程生成令牌,否则令牌会被SMTP服务拒绝。

四、额外排查

用JWT工具解析你的访问令牌,确认:

  1. sub字段对应用户的Outlook账户ID
  2. exp字段未过期
  3. scp字段包含SMTP.Send权限

内容的提问来源于stack exchange,提问作者Erich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:22:27