Gmail观看用户收件箱,history.getMessagesAdded未返回新邮件

时间:2017-02-07 13:02:19

标签: java gmail gmail-api google-cloud-pubsub google-console-developer

要求将用户的Gmail邮件同步到我们的CRM中。适当的系统基于Google Pub / Sub,用于监视用户的收件箱以进行任何更改,并将通知发送到我们的HTTPs端点。有关详情,请参阅Gmail cloud pub/sub

根据上述程序,我们将改变历史。然后我只对新消息感兴趣,因此根据this guide首选history.getMessagesAdded。我们现在面临的问题是没有在messagesAdded下捕获线程的第一封邮件,所有后续消息都通过我们的系统。

注意:对于第一封邮件,我们会从Google推送。但是当我们尝试添加消息时,它变得空洞。是否有任何特殊需要为线程的第一个邮件做或我错过了什么。

1 个答案:

答案 0 :(得分:10)

我遇到了一个非常类似的问题,我的错误是我使用了推送通知中的historyId,解决方案是将最后一次已知的historyId存储在我的数据库中,因此,每次收到通知时,我都会得到我存储的id的历史记录,而不是通知中的记录。

在我的情况下,来自通知的historyId甚至没有成为历史的一部分,可能是因为我的手表限制:labelIds = ['INBOX']

这是google pub / sub通知:

{
  message:
  {
    data: {"emailAddress": "user@example.com", "historyId": "9876543210"},
    message_id: "1234567890",
  }

  subscription: "projects/myproject/subscriptions/mysubscription"
}

我使用的是message.data.historyId,这引起了混乱!

message.data是一个base64编码的字符串,在这个例子中我只是解码了它!

逐步查看收件箱中的新电子邮件:

  1. 执行google pub / sub中的所有配置。

  2. 开始使用您想要的过滤器观看用户(文档:https://developers.google.com/gmail/api/v1/reference/users/watch

  3. 存储在步骤2中获得的historyId

  4. 收到通知后,使用存储的ID作为startHistoryId参数获取所有事件(历史记录)(docs:https://developers.google.com/gmail/api/v1/reference/users/history/list

  5. 在步骤4中获取的历史记录列表中,查找新消息:history.getMessagesAdded()。

  6. 更新数据库中的最后一个已知历史记录ID,因此您不需要每次都处理整个历史记录!

  7. 我希望它有所帮助。