为什么我在Users.history:list API中获取空数组

时间:2017-12-13 13:30:26

标签: php gmail-api

我正在尝试使用带有historyId的Users:History 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;
}

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

2 个答案:

答案 0 :(得分:3)

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

如果您等待(按照建议的第二或几分钟)并使用相同的起始历史ID再次呼叫并获得结果,则这些是在中间时间段内发生的更改(新消息等)。 / p>

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

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

  

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

     

{“emailAddress”:“user@example.com”,“historyId”:“9876543210”}你   然后可以使用history.list()来获取用户的更改详细信息   根据同步指南,他们上次知道的historyId

(重点补充)。要获取更新,您必须使用之前的历史记录ID。 Google无法知道您的应用程序跟踪的最新历史记录,因此您可以自上次执行history.list()操作后跟踪历史记录ID。

答案 1 :(得分:0)

您需要在推送通知中的某处存储historyId并创建一个cron作业,该作业将使用您存储的Users.history.list获取(使用historyId API)特定帐户的历史记录,直到它不返回响应。