我已经成功设置了Google Pub / Sub以使用Gmail API Watch功能,如下所述:https://developers.google.com/gmail/api/guides/push可以监视我的gmail帐户中的INBOX标签。

新消息到达后,我立即收到有效格式的推送通知,例如:

{ message:
    { data: '.......',
    attributes: {},
    message_id: '1248700053943' },
subscription: '.....' }


在我对数据进行base64解码之后,我得到了email和historyId。然后,按照建议,我通过推送通知请求gmail.users.history.list API(通过API控制台),并将startHistoryId设置为historyId。然后得到没有任何详细信息的空响应:

GET https://www.googleapis.com/gmail/v1/users/me/history?startHistoryId=4658879&key={YOUR_API_KEY}
200 OK
- Show headers
{
 "historyId": "4658894"
}


因此,通知中的historyId似乎无效。
似乎Gmail users.watch API无法正常工作,并发送了错误的historyId,或者我只是缺少了什么?

最佳答案

似乎我误解了users.history.list的工作方式,流程应如下所述:


记住users.watch请求的响应中的historyId。
在推式通知中,调用具有先前记住的historyId为startHistoryId的users.history.list而不是通知中的新的,并获取最近更改的列表。
记住通知中的historyId,然后转到2。


如果我们查看对users.history.list的任何调用的响应,historyId始终存在,则它是最新历史记录更改的标记。推送通知会带来最新的historyId,因此,如果我们向其请求users.history.list(如在问题中所示),则会得到空的历史数组,并且服务器会从响应中删除此空的“ history”字段,这就是我们得到此结果的原因:

{
 "historyId": "4658894"
}


但这不是:

{
 "history": [ ],
 "historyId": "4658894"
}


同步指南中提供了更多详细信息:https://developers.google.com/gmail/api/guides/sync#partial

因此,我们无法轻松地从推送通知中获取到达INBOX的新邮件的详细信息,而需要处理历史记录挖掘和同步处理才能找到它。

09-27 06:14