php - 获取消息的 MIME 版本导致“405 方法不允许”-错误
问题描述
我的公司运行一个网络应用程序,它读取一个共享邮箱并向用户显示内容。到目前为止,它是基于 PHP-EWS 的。由于我们要将邮箱移动到云中,因此我们必须将此应用程序迁移到 MS-Graph。我已经迁移了大部分应用程序,但现在当我尝试获取消息的 MIME 版本时遇到了问题。
获取消息的处理版本完全没有问题。对此的请求将类似于:
GET /users/{mailbox-id}/mailfolders/inbox/messages/{message-id}
根据文档,我必须在“正常”请求的末尾添加“/$value”才能获取消息的 mime 版本。这在 Microsoft 的 Graph-Tester-Website 中完美运行。在我的应用程序中,我还可以毫无问题地请求 ATTACHED 消息的 MIME 版本(使用相同的“/$value”-trick)。但是,如果我请求(正常)未附加消息的 MIME 版本,我会收到以下错误:
Fatal error: Uncaught GuzzleHttp\Exception\ClientException: Client error: `GET https://graph.microsoft.com/v1.0/users/{mailbox-id}/mailfolders/inbox/messages/{message-id}/%24value`
resulted in a `405 Method Not Allowed` response: { "error": { "code": "ErrorInvalidRequest", "message": "The OData request is not supported.", "innerEr (truncated...) in D:\wwwroot\vendor\guzzlehttp\guzzle\src\Exception\RequestException.php:113
Stack trace: #0 D:\wwwroot\vendor\guzzlehttp\guzzle\src\Middleware.php(66): GuzzleHttp\Exception\RequestException::create(Object(GuzzleHttp\Psr7\Request), Object(GuzzleHttp\Psr7\Response))
#1 D:\wwwroot\vendor\guzzlehttp\promises\src\Promise.php(203): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Response))
#2 D:\wwwroot\vendor\guzzlehttp\promises\src\Promise.php(156): GuzzleHttp\Promise\Promise::callHand in D:\wwwroot\vendor\guzzlehttp\guzzle\src\Exception\RequestException.php on line 113
我使用了以下代码:
$graph = new Graph();
$graph->setAccessToken($tokenCache->getAccessToken());
/** @var $contentStream GuzzleHttp\Psr7\Stream */
$getMessageContentUrl = '/users/' . $mailbox . '/mailfolders/inbox/messages/' . $messageId.'/%24value';
try {
$contentStream = $graph->createRequest('GET', $getMessageContentUrl)
->setReturnType("GuzzleHttp\Psr7\Stream")
->execute();
} catch (GraphException $e) {
[...]
}
return $contentStream->getContents();
如果我请求附加消息的 MIME 版本,则相同的代码有效。
我想到了 urlencoding-issues,所以我尝试了“/$value”和“/%24value”,结果相同。
我不认为这是一个许可问题。OAUTH_SCOPES 是
'openid profile offline_access User.Read Mail.Read Mail.Read.Shared Mail.ReadWrite Mail.ReadWrite.Shared Calendars.Read Calendars.Read.Shared'
所以我认为该帐户应该有足够的权限来完成这项任务。
我不知道,如果我做错了什么,或者是 Graph-API 或 Graph-PHP-SDK 或 Guzzle-Http-Client 的问题。我正在使用以下版本:
“名称”:“microsoft/microsoft-graph”,“版本”:“1.11.0”,
“名称”:“guzzlehttp/guzzle”,“版本”:“6.3.3”,
“名称”:“guzzlehttp/psr7”,“版本”:“1.6.1”,
如果有人可以帮助我或至少让我走上正轨,我会非常高兴。
解决方案
我找到了解决方案。不得不更换
GET /users/{mailbox-id}/mailfolders/inbox/messages/{message-id}/$value
经过
GET /users/{mailbox-id}/messages/{message-id}/$value
然后它工作。有点奇怪,其他带有“/mailfolders/inbox/”的请求有效,但这个没有。不管怎样,只要有效。
推荐阅读
- laravel - 如何检查我使用的是哪个版本的 laravel-query-builder?
- ios - iOS - 如何修复表格视图单元格中的此动画向左然后再次返回
- python - 删除字符串列表中的行
- c# - 无法在 C# 中将结果集分配给元组
- jmeter - 在哪里可以找到 JMeter 5.1.1 的所有调度程序功能?
- android - 将 BITMAP 调整为较低的分辨率
- r - 在 R 中按列对行求和
- matlab - Interp2 函数返回错误的插值矩阵
- mongodb - 如何在 mongodb 中存储数组第一个值?
- aurelia - 如何将数据加载到 ag-grid 中的 rowData?