为什么我在 Users.history:list API 中得到空数组

Jan*_*nvi 2 php gmail-api

我正在尝试使用Users:History带有historyId的API来获取gmail帐户中完成的更改历史记录。但不知何故,它会在完成几秒钟或几分钟的更改后返回数据。

代码

function listHistory($service, $userId, $startHistoryId) {
  $opt_param = array('startHistoryId' => $startHistoryId);
  $pageToken = NULL;
  $histories = array();

  do {
    try {
      if ($pageToken) {
        $opt_param['pageToken'] = $pageToken;
      }
      $historyResponse = $service->users_history->listUsersHistory($userId, $opt_param);
      if ($historyResponse->getHistory()) {
        $histories = array_merge($histories, $historyResponse->getHistory());
        $pageToken = $historyResponse->getNextPageToken();
      }
    } catch (Exception $e) {
      print 'An error occurred: ' . $e->getMessage();
    }
  } while ($pageToken);


  return $histories;
}
Run Code Online (Sandbox Code Playgroud)

参考: https: //developers.google.com/gmail/api/v1/reference/users/history/list

pay*_*yne 6

startHistoryId如果自该历史 ID 标识的特定时间点以来用户的电子邮件箱没有发生任何更改,您将获得给定的空结果。这是正确的行为。

如果您等待(如您建议的那样,秒或分钟)并使用相同的起始历史 ID 再次调用并获得结果,则这些是在干预时间段内发生的更改(新消息等)。

如果您不想等待,并且您可以访问 Gmail 帐户进行测试,则可以向该帐户发送消息(或删除该帐户中的消息),下次调用时您应该会看到相应的更改Users.history.list

对于historyId推送通知提供的值,请注意提供的 ID 是新的(当前)历史记录 ID。请参阅: https: //developers.google.com/gmail/api/guides/push

HTTP POST 正文是 JSON,实际的 Gmail 通知负载位于 message.data 字段中。该 message.data 字段是一个 base64url 编码的字符串,可解码为包含用户的电子邮件地址和新邮箱历史记录 ID 的 JSON 对象:

{"emailAddress": "user@example.com", "historyId": "9876543210"} 然后,您可以根据同步指南,使用history.list()获取用户自上次已知的historyId 以来的更改详细信息。

(强调已添加)。要获取更新,您必须使用以前的历史记录 ID。Google 无法知道您的应用程序跟踪的最新历史记录,因此您需要跟踪自上次执行 History.list() 操作以来的历史记录 ID。

  • 我同意你的看法。但我已经实现了谷歌推送通知,当电子邮件地址收到新电子邮件时,它将发送通知。在推送通知中,我收到“historyId”,通过它我可以使用“Users.history.list” API 获取收到的电子邮件的“threadId”。但是当 google 向我的端点发送推送通知时,API 返回空响应,因此我无法在推送通知中获取新消息的详细信息 (2认同)