我遇到了一个非常相似的问题,我的错误是我使用了推送通知中的 historyId,解决方案是将最后一个已知的 historyId 存储在我的数据库中,因此,每次收到通知时,我都会从我存储的 ID,而不是通知中的 ID。
在我的情况下,通知中的 historyId 甚至没有成为历史的一部分,可能是因为我的手表限制: labelIds=['INBOX']
这是谷歌发布/订阅通知:
{
message:
{
data: {"emailAddress": "user@example.com", "historyId": "9876543210"},
message_id: "1234567890",
}
subscription: "projects/myproject/subscriptions/mysubscription"
}
我正在使用 message.data.historyId,这导致了混乱!
message.data 是一个 base64 编码的字符串,在这个例子中我只是解码了它!
逐步查看收件箱中的新电子邮件:
在 google pub/sub 中进行所有配置。
开始使用您想要的过滤器观察用户(文档:https ://developers.google.com/gmail/api/v1/reference/users/watch )
存储第2步获取的historyId
收到通知后,使用存储的 id 作为 startHistoryId 参数获取所有事件(历史记录)(文档:https ://developers.google.com/gmail/api/v1/reference/users/history/list )
在第 4 步获得的历史列表中,查找新消息:history.getMessagesAdded()。
更新数据库中最后一个已知的历史 id,因此您不需要每次都处理整个历史!
我希望它有所帮助。