【问题标题】:Gmail watch user inbox, history.getMessagesAdded is not returning the new messageGmail 观看用户收件箱,history.getMessagesAdded 未返回新邮件
【发布时间】:2017-02-07 13:02:19
【问题描述】:

要求是将用户的 Gmail 邮件同步到我们的 CRM 中。该系统基于 Google Pub/Sub,它监视用户的收件箱是否有任何更改,并向我们的 HTTPs 端点发出通知。更多信息请访问Gmail cloud pub/sub

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

注意:对于第一封邮件,我们确实会收到来自 Google 的推送。但是当我们尝试添加 Messages 时,结果却是空的。线程的第一封邮件有什么特别需要做的吗,或者我错过了什么。

【问题讨论】:

  • 我在这里找到了一个question,它使用messages.list 来检查消息的历史记录。它使用 messages.list 中的参数 q 来提供最近的时间戳。如果它可以帮助你,只需检查这个问题。欲了解更多信息,请查看onethis
  • @KENdi 谢谢。虽然它没有回答为什么获取历史记录失败,但是根据这些答案中建议的消息列表同步工作正常。

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


【解决方案1】:

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

就我而言,通知中的 historyId 甚至没有成为历史记录的一部分,可能是因为我的手表限制:labelIds=['INBOX']

这是 google 发布/订阅通知:

{
  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 参数获取所有事件(历史)(文档:https://developers.google.com/gmail/api/v1/reference/users/history/list

  5. 在第4步得到的历史列表中,查找新消息:history.getMessagesAdded()。

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

希望对你有帮助。

【讨论】:

  • 这太有用了。我不明白为什么我的 historyID 最初看起来是空的,但是当再次查看它时,它有一个历史记录。我现在明白了,我不能立即使用推送通知中收到的 historyID,而是必须存储它并使用前一个。就我而言,这是因为我使用了startHistoryId 过滤器,它在提供的id之后查找历史记录。
  • 太棒了!谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2019-10-24
相关资源
最近更新 更多