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

使用EWS通过OAuth 2读取邮件时遭遇UnauthorizedException异常

解决 OAuth 2 访问 Office 365 邮件时的 UnauthorizedException 异常

看起来你在使用 garethp/php-ews 库通过 OAuth 2 访问 Office 365 邮件列表时遇到了 401 未授权异常,我来帮你梳理下可能的原因和解决办法。

首先先还原你的代码和错误信息:

你的代码

<?php 
require_once "vendor/autoload.php"; 
use src\API\Type; 
use garethp\ews\MailAPI as API; 

$token='EwA......'; //access token 
$api = API::withCallbackToken('outlook.office365.com', $token); 
$mail = $api->getMailItems(); 

foreach ($mail as $email) { 
    $email = $api->getItem($email->getItemId()); 
    $email_id=$email->getItemId(); 
    $subject = $email->getSubject(); 
    $sender = $email->getSender()->getMailbox()->getEmailAddress(); 
    $body = (string) $email->getBody(); 
    echo $body; 
} 

触发的错误

Fatal error: Uncaught garethp\ews\API\Exception\UnauthorizedException in C:\inetpub\wwwroot\bephpforTteam\New\php_ews\php-ews-master\src\API\ExchangeWebServices.php:438
Stack trace:
#0 C:\inetpub\wwwroot\bephpforTteam\New\php_ews\php-ews-master\src\API\ExchangeWebServices.php(356): garethp\ews\API\ExchangeWebServices->handleNonSuccessfulResponses(NULL, 401)
#1 C:\inetpub\wwwroot\bephpforTteam\New\php_ews\php-ews-master\src\API\ExchangeWebServices\MiddlewareFactory.php(57): garethp\ews\API\ExchangeWebServices->processResponse(NULL)
#2 C:\inetpub\wwwroot\bephpforTteam\New\php_ews\php-ews-master\src\API\ExchangeWebServices.php(497): garethp\ews\API\ExchangeWebServices->garethp\ews\API\ExchangeWebServices{closure}(Object(garethp\ews\API\MiddlewareRequest), Object(Closure))
#3 C:\inetpub\wwwroot\bephpforTteam\New\php_ews\php-ews-master\src\API\ExchangeWebServices\MiddlewareFactory.php(66): garethp\ews\API\ExchangeWebServices->garethp\ews\API{closure}(Object(garethp\ews\API\MiddlewareRequest))
#4 C:\inetpub\wwwroot\bephpforTt in C:\inetpub\wwwroot\bephpforTteam\New\php_ews\php-ews-master\src\API\ExchangeWebServices.php on line 438


可能的原因及解决步骤

1. 验证 Access Token 的有效性与权限

  • 检查令牌是否有效:确认你的 $token 没有过期,签名正确。你可以通过解析 JWT 令牌(用在线工具或代码解析)查看 exp(过期时间)字段,确认令牌仍在有效期内。
  • 确认权限是否足够:你的 OAuth 应用必须申请了正确的邮件访问权限。如果是用户授权的场景,需要 Mail.Read 或 Mail.ReadWrite 的委托权限;如果是服务端到服务端的应用,则需要 Mail.Read.All 或 Mail.ReadWrite.All 的应用权限。同时要确保这些权限已经被管理员同意(如果是租户级应用)。
  • 检查令牌的权限字段:解析令牌后查看 scp(委托权限)或 roles(应用权限)字段,确认包含所需的邮件访问权限。

2. 确认令牌的受众(Audience)是否正确

Office 365 EWS 的受众应该是 https://outlook.office365.com/,确保你的令牌是针对这个受众颁发的。如果令牌的 aud 字段不是这个值,EWS 会拒绝请求返回 401。

3. 调整 API 端点参数

你当前使用的是 outlook.office365.com 作为端点,尝试换成完整的 EWS 端点路径试试:

$api = API::withCallbackToken('https://outlook.office365.com/EWS/Exchange.asmx', $token);

有些场景下,库需要完整的端点路径才能正确处理请求。

4. 检查令牌传递是否正确

确保你的令牌是完整的字符串,没有被截断、添加额外空格或特殊字符。withCallbackToken 方法应该会自动添加 Authorization: Bearer {token} 请求头,但你可以开启调试模式验证这一点:

$api->setDebug(true);

开启调试后,库会输出详细的请求日志,你可以查看发送的请求头是否包含正确的 Authorization 信息。

5. 更新库到最新版本

旧版本的 garethp/php-ews 可能存在 OAuth 2 兼容性问题,尝试更新到最新版本:

composer update garethp/php-ews

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:56:28