【问题标题】:Implementing full sync with gmail api使用 gmail api 实现完全同步
【发布时间】:2015-08-18 14:25:42
【问题描述】:

我使用与gmail api 配合使用的google php 库。我想从我的 gmail 帐户中获取所有消息。

我就是这样做的:

        do {
            $this->client->setUseBatch(false);
            $messagesResponse = $service->users_messages->listUsersMessages('me', compact('pageToken'));

            if ($messagesResponse->getMessages()) {
                $batch = new Google_Http_Batch($this->client);
                $this->client->setUseBatch(true);

                foreach ($messagesResponse as $item) {
                    $request = $service->users_messages->get('me', $item->id, ['format' => 'raw']);
                    $batch->add($request);
                }

                $messages = array_merge($messages, $batch->execute());
                $pageToken = $messagesResponse->getNextPageToken();
            }
        } while ($pageToken);

当我从 CLI 运行此脚本时,出现以下错误:

[Google_IO_Exception]
操作在 100000 毫秒后超时,收到 57157107 个字节

如果我用检索新令牌来评论该行,那么我会收到前 100 条消息并且它有效。但我无法获取所有这些。 PHP没有超时,这是google_io_exception,所以我不知道如何解决这个问题。另外,任何优化技巧都会很棒,因为我唯一知道的是批处理请求,但我使用它们。

【问题讨论】:

  • 可能是API的一些限制?如果您可以成功获得前 100 封邮件,是否有办法传入偏移量,这样您就可以遍历收件箱并一次收到 100 封邮件?我必须承认我对 GMail api 没有任何经验,所以这只是我的猜测......
  • 我建议尝试使用小于 100 的批量大小。尝试 20 或 50 看看是否可靠地工作得更快。 (您只需将 maxResults 添加到您的 listUsersMessages 调用中即可做到这一点,而不更改代码中的任何其他内容。)
  • 奇怪的是,现在我得到“(429) 超出用户速率限制。”。我去我的开发控制台检查,我收到了 100% 的剩余请求。不知道是什么问题,会努力解决的
  • Eric,我在设置 maxResults = 20 时遇到了同样的错误。脚本运行了几分钟,然后显示“操作在 100000 毫秒后超时,收到 53707801 个字节”。有什么建议吗?

标签: php google-api-php-client gmail-api


【解决方案1】:

这个问题仍然很重要,因为我花了很多时间才得到一个明确的答案,所以我将分享我的发现:

单个批处理请求中的调用次数限制为 100 个。如果您需要进行更多调用,请使用多个批处理请求。

https://developers.google.com/gmail/api/guides/

如您所见,根据文档,单个批处理请求中的调用不能超过 100 个。因此,您必须在低于此限制的情况下计算和执行。

如果您保持 100 个请求的限制,那么一切都应该正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2018-07-09
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2014-10-23
    • 2014-06-08
    相关资源
    最近更新 更多