【问题标题】:Getting MIME-version of message results in "405 Method Not Allowed"-Error获取消息的 MIME 版本导致“405 方法不允许”-错误
【发布时间】:2019-10-16 15:49:02
【问题描述】:

我的公司运行一个网络应用程序,它可以读取共享邮箱并向用户显示内容。到目前为止,它是基于 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 的问题。 我正在使用以下版本:

"name": "microsoft/microsoft-graph", “版本”:“1.11.0”,

"name": "guzzlehttp/guzzle", “版本”:“6.3.3”,

"name": "guzzlehttp/psr7", “版本”:“1.6.1”,

如果有人能帮助我或至少让我走上正轨,我会非常高兴。

【问题讨论】:

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


    【解决方案1】:

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

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

    通过

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

    然后就可以了。有点奇怪,其他带有“/mailfolders/inbox/”的请求有效,但这个没有。无论如何,只要它有效。

    【讨论】:

    • 感谢您添加解决方案!出于某种原因,Microsoft Graph SDK for Java 允许您构造相同的非法请求(使用 mailfolders),并具有相同的 405 结果。
    【解决方案2】:

    Method Not Allowed 错误意味着您请求的路由存在但不适合您使用的方法(GET)。尝试将 GET 方法替换为 POST,例如:

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

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

    【讨论】:

    • 好的,试过了,但是同样的错误信息被传递了。根据文档,它应该是一个 GET 请求(ms-graph-documentation)。正如我所指出的,(GET-)Request 也适用于 Microsoft 的 Graph-Tester-Website。所以我不认为,这就是问题所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2020-07-21
    • 2017-11-13
    • 2012-09-30
    • 1970-01-01
    • 2021-12-20
    • 2016-12-02
    相关资源
    最近更新 更多