Gmail REST API 获取消息函数 returns 无效的 historyId

Gmail REST API get message function returns invalid historyId

Gmail REST 似乎存在严重问题 API。

  1. 调用/userId/messages获取消息列表
  2. 对于每个,调用 /userId/messages/id 以获取消息
  3. 获取每个消息对象的最高(或任何)startHistoryId
  4. 然后调用/userId/history/list将startHistoryId作为参数传递

结果出人意料。 Gmail REST API 返回 404 Not Found.. 返回的 historyId 似乎未注册或无效。

调用/userId/profile时,startHistoryId有效,可在/userId/history/list调用中成功使用。

com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
{
"code" : 404,
"errors" : [ {
     "domain" : "global",
     "message" : "Not Found",
     "reason" : "notFound"
    } ],
  "message" : "Not Found"
}

这不是 API 中的错误,记录在 https://developers.google.com/gmail/api/v1/reference/users/history/list

具体来说"History IDs increase chronologically but are not contiguous with random gaps in between valid IDs. Supplying an invalid or out of date startHistoryId typically returns an HTTP 404 error code. A historyId is typically valid for at least a week, but in some circumstances may be valid for only a few hours. If you receive an HTTP 404 error response, your application should perform a full sync."

所以您可能只是使用了一个超出历史存储范围的 historyId(它不会无限期地存储,那样会非常昂贵)。它只存储足够长的时间以供同步客户端需要它(例如一周左右)。

如果您只需要从某个点向前同步,那么只需使用从 getProfile 返回的 historyId。消息上的 historyId 是消息上次更新的时间,可能是几个月或几年前,比存储历史记录的时间更长。

另请参阅同步指南: https://developers.google.com/gmail/api/guides/sync