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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:08:14