获取邮件的MIME版本会导致“ 405方法不允许”-错误

时间:2019-10-16 15:49:02

标签: php microsoft-graph microsoft-graph-sdks

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

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

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

根据文档,我必须在“正常”请求的末尾添加“ / $ value”,以获取消息的mime版本。 这可以完美地集成到Microsoft的Graph-Tester网站中。在我的应用程序中,我还可以请求ATTACHED消息的MIME版本,而不会出现任何问题(使用相同的“ / $ value”技巧)。 但是,如果我请求(普通)NOT-ATTACHED消息的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问题,所以我尝试了“ / $ 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”, “ version”:“ 1.11.0”,

“名称”:“ guzzlehttp / guzzle”, “ version”:“ 6.3.3”,

“名称”:“ guzzlehttp / psr7”, “ version”:“ 1.6.1”,

如果有人能帮助我或者至少让我走上正确的道路,我将感到非常高兴。

2 个答案:

答案 0 :(得分:0)

``方法不允许错误''表示存在您所请求的路由,但不包含您正在使用的方法(GET)。尝试将GET方法替换为POST,例如:

$contentStream = $graph->createRequest('POST', $getMessageContentUrl)
        ->setReturnType("GuzzleHttp\Psr7\Stream")
        ->execute();

记住api的路由指定允许的方法(GET,POST,PUT,PATCH,DELETE);

答案 1 :(得分:0)

我找到了解决方案。不得不替换

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

作者

GET /users/{mailbox-id}/messages/{message-id}/$value

然后它起作用。其他使用“ / mailfolders / inbox /”的请求起作用的方式有点奇怪,但是这一要求不起作用。随便,只要它可行。