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

Posted

技术标签:

【中文标题】Gmail REST API 获取消息函数返回无效的 historyId【英文标题】:Gmail REST API get message function returns invalid historyId 【发布时间】:2015-06-30 08:02:54 【问题描述】:

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

    调用/userId/messages获取消息列表 对于每个,调用 /userId/messages/id 来获取消息 获取每个消息对象的最高(或任何)startHistoryId 然后调用 /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"

【问题讨论】:

这是因为 Gmail 仅在创建邮件时才为邮件创建 historyId?如果消息是很久以前创建的,那么历史引用会被删除吗? 【参考方案1】:

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

特别是“历史 ID 按时间顺序增加,但与有效 ID 之间的随机间隔不连续。提供无效或过期的 startHistoryId 通常会返回 HTTP 404 错误代码。historyId 通常至少在一周内有效,但在某些情况下可能仅在几个小时内有效。如果您收到 HTTP 404 错误响应,您的应用程序应该执行完全同步。"

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

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

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

【讨论】:

这就是我一直在寻找的东西,但是我遇到了一个奇怪的问题,也许你可以解释一下。用户在 messages.list resultsSizeEstimate:0 中没有任何内容。所以我从 getProfile 中获取 historyId 来进行部分同步。但是,当我尝试使用 startHistoryId 提取 history.list 时,它返回 404。这对这个邮箱的状态意味着什么?是不是最新的startHistoryId也是过期了,说明邮箱很久没用了?

以上是关于Gmail REST API 获取消息函数返回无效的 historyId的主要内容,如果未能解决你的问题,请参考以下文章

如何使用新的 Gmail REST API 成功发送消息?

如果 REST API 方法失败,我应该返回 200、400 还是 500 HTTP 状态消息?

获取Mime Message没有返回base 64解码版本? (Gmail API)

Yammer REST API - 在更新之前获取所有消息旧消息,因此无法返回old_than

Gmail API 批量获得支持?

Node.js Lambda 函数从 REST 调用将“响应无效”返回给 Alexa 服务模拟器