使用Microsoft Graph API代发邮件遇400错误请求问题求助
解决应用级Mail.Send权限调用/me/sendmail返回400认证错误的问题
嘿,这个问题我之前帮同事排查过,核心原因其实很直白——应用级权限和/me端点根本不兼容!
为什么会触发这个错误?
/me是Graph API里的「用户上下文专属端点」,它需要依赖当前请求绑定的用户身份来确定操作对象。但你用的是应用级权限,这种权限是让应用本身拥有独立的操作权限,不需要绑定到某个具体用户的会话,所以Graph完全不知道/me指代的是谁,自然就抛出了认证错误。
快速修复步骤
替换请求端点
把/me/sendmail改成指定用户的端点,格式如下:https://graph.microsoft.com/v1.0/users/{目标用户ID或用户主体名}/sendmail比如你要代表管理员
admin@yourdomain.com发邮件,就用:https://graph.microsoft.com/v1.0/users/admin@yourdomain.com/sendmail规范请求体参数
你的请求里saveToSentItems用了字符串"false",虽然Graph偶尔能兼容,但严格来说应该用布尔值false,避免不必要的解析问题。再次验证权限配置
去Azure AD应用注册里确认两个关键点:- 已经添加了应用类型的Mail.Send权限(不是委派权限)
- 已经完成了管理员同意(应用级权限必须经过管理员同意才能生效)
修正后的完整请求示例
POST https://graph.microsoft.com/v1.0/users/admin@yourdomain.com/sendmail Content-Type: application/json { "message": { "subject": "first mail", "body": { "contentType": "Text", "content": "commented commmented" }, "toRecipients": [{ "emailAddress": { "address": "Alex@*******" } }] }, "saveToSentItems": false }
额外排查点
如果还是报错,可以解码你的访问令牌(用本地工具或离线解码方式)检查:
aud字段是不是https://graph.microsoft.com(确保令牌是发给Graph API的)roles字段里有没有Mail.Send(确认权限已经正确包含在令牌中)
内容的提问来源于stack exchange,提问作者Pandu
相关产品推荐
相关产品推荐

