php - 获取消息的 MIME 版本会导致 "405 Method Not Allowed"- 错误

标签 php microsoft-graph-api microsoft-graph-sdks

我的公司运行一个网络应用程序,该应用程序读取共享邮箱并向用户显示内容。到目前为止它是基于 PHP-EWS 的。由于我们要将邮箱移至云端,因此我们必须将此应用程序迁移到 MS-Graph。 我已经迁移了应用程序的大部分内容,但现在当我尝试获取消息的 MIME 版本时遇到了问题。

获取消息的处理版本完全没有问题。 对此的请求类似于:

GET /users/{mailbox-id}/mailfolders/inbox/messages/{message-id}

根据文档,我必须在“正常”请求末尾添加“/$value”才能获取消息的 mime 版本。 这非常适合 Microsoft 的 Graph-Tester-Website。在我的应用程序中,我还可以毫无问题地请求附加消息的 MIME 版本(使用相同的“/$value”技巧)。 但是,如果我请求(正常)未附加消息的 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 的问题。 我正在使用以下版本:

“名称”:“微软/微软图”, “版本”:“1.11.0”,

"name": "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/”的请求有效,但这个无效。不管怎样,只要能用就行。

关于php - 获取消息的 MIME 版本会导致 "405 Method Not Allowed"- 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58417227/

相关文章:

php - ajax-如果我在 url 上发送 ajax 请求,我可以检查 php 页面是否是请求或页面已打开吗?

php - 如何使用 PHP echo 函数在 JavaScript 中定义变量?

java - 使用 msgraph-sdk-java 实现组 $filter 查询

c# - Microsoft Graph 异常 : New password credentials must be generated using service actions

c# - SDK v5 中的 ms.Graph 'groups' 中的分页

php - 获取 mysql 数据进行比较,但不起作用或显示任何内容

php - android 使用 json 与 php mysql 连接

office365 - Microsoft 图形批处理调用 OneNote 页面重命名失败并显示消息 "Invalid JSON body for request id"

microsoft-graph-api - Microsoft Graph API,我可以过滤列表项吗

c# - 获取当前用户的更多信息