我正在尝试使用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
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。