Microsoft Graph授权码流发送邮件返回禁止响应问题排查
问题分析与解决方案
授权码流完全支持通过Microsoft Graph发送邮件,你遇到的Forbidden错误是由配置和代码中的几个问题导致的,具体修正点如下:
1. 权限配置错误
你当前配置的是应用权限的Mail.Send,这是给客户端凭据流(无用户登录)使用的,允许应用以任意用户身份发邮件。而授权码流需要配置委派权限的Mail.Send:
- 登录Azure AD应用注册页面,找到你的应用
- 进入「API权限」→「添加权限」→「Microsoft Graph」→「委派权限」
- 搜索并添加
Mail.Send权限,完成后点击「授予管理员同意」(企业租户),个人租户可由用户自行授权
2. API调用端点错误
代码中使用的/users/{userEmail}/sendMail端点需要应用权限才能操作任意用户,而授权码流是代表当前登录用户发送邮件,应使用/me/sendMail端点,无需指定用户邮箱:
// 修正后的API请求地址 var response = await httpClient.PostAsync($"{graphApiEndpoint}/me/sendMail", new StringContent(jsonMessage, System.Text.Encoding.UTF8, "application/json"));
测试时注意更换收件人邮箱,避免使用当前登录用户邮箱导致逻辑冲突。
3. 权限范围优化(可选)
代码中使用的https://graph.microsoft.com/.default范围会请求所有已配置的委派权限,虽然可以正常工作,但更推荐使用精准的Mail.Send范围,提升安全性:
List<string> scope = new List<string>() { "Mail.Send" };
4. 其他细节修正
- 代码中
RedirectUri的字符串未闭合,修正为:public static string RedirectUri = "http://localhost"; - 检查获取的令牌是否包含
Mail.Send权限:可将令牌复制到jwt.ms解析,查看scp字段是否包含Mail.Send
修正后的核心代码示例
// 权限范围改用精准的Mail.Send List<string> scope = new List<string>() { "Mail.Send" }; // ... 省略认证逻辑 ... // 发送邮件时使用/me端点 var response = await httpClient.PostAsync($"{graphApiEndpoint}/me/sendMail", new StringContent(jsonMessage, System.Text.Encoding.UTF8, "application/json"));
内容的提问来源于stack exchange,提问作者dgxhubbard
相关产品推荐
相关产品推荐

