我已经成功设置了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的新邮件的详细信息,而需要处理历史记录挖掘和同步处理才能找到它。