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

使用Microsoft Graph API获取邮件遇403权限拒绝错误求助

使用Microsoft Graph API获取指定邮箱收件时403权限错误

问题详情

我想用Microsoft Graph API获取指定邮箱的收件,当前PHP实现代码如下:

$guzzle = new \GuzzleHttp\Client();
$url = "https://login.microsoftonline.com/{$tenantId}/oauth2/v2.0/token";
$token = json_decode($guzzle->post($url, [
  'form_params' => [
  'client_id' => $clientId,
  'client_secret' => $clientSecret,
  'scope' => 'https://graph.microsoft.com/.default',
  'grant_type' => 'client_credentials',
]])->getBody()->getContents());

$accessToken = $token->access_token;
$graph = new Graph();
$graph->setAccessToken($accessToken);

// Retrieve the emails
$messages = $graph->createRequest("GET", "/users/{$emailAddress}/messages")
->setReturnType(Model\Message::class)
->execute();

return $messages;

能正常获取access token,但调用邮件查询接口时持续返回403错误:

"Access is denied. Check credentials and try again."

已配置全部权限,且在MS Graph Explorer中运行该查询可正常工作,但PHP代码执行失败。

解决方案

1. 区分权限类型与授予方式

Graph Explorer使用的是委托权限(用户登录授权),而你代码里的客户端凭据流(client_credentials)需要的是应用权限,且必须完成管理员同意:

  • 检查Azure AD应用注册的权限列表,确保添加的是应用权限(而非委托权限),比如Mail.Read应用权限,且权限状态显示"已授予"(需全局管理员完成同意操作)。

2. 验证令牌权限有效性

解码获取到的access token(用JWT解码工具即可),查看roles字段是否包含对应的邮件权限(如Mail.Read)。如果roles为空,说明权限未正确授予,需重新配置权限并执行管理员同意。

3. 确认邮箱访问权限范围

  • 若访问普通用户邮箱,需确保应用被授予Mail.Read(全邮箱访问)应用权限,或管理员已为该应用分配访问指定用户邮箱的权限。
  • 若访问共享邮箱,需配置Mail.Read.Shared应用权限并完成管理员同意。

4. 检查邮箱地址格式

确保$emailAddress是Azure AD中有效的用户主体名称(UPN),比如user@yourdomain.com,避免使用邮箱别名或错误格式的地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:10:14