我正在尝试使用带有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
答案 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)特定帐户的历史记录,直到它不返回响应。