Gmail监视用户收件箱,history.getMessagesAdded未返回新邮件

6
要求将一位用户在Gmail中的邮件与我们的CRM进行同步。现有系统基于Google Pub/Sub,可以监视用户收件箱的任何更改并将通知发送到我们的HTTPs端点。详情请参阅Gmail云发布/订阅
根据上述过程,我们获得更改的git历史记录。然后我只对新邮件感兴趣,因此根据此指南,history.getMessagesAdded是首选。我们面临的问题是线程的第一封邮件未被捕获在messagesAdded中,但所有随后的邮件都通过了我们的系统。
注意:对于第一封邮件,我们确实从Google那里获得推送。但当我们尝试获取Messages added时,结果为空。是否有任何特别需为主题的第一封邮件做的或者是我漏掉了什么?

1
我在这里找到了一个与编程有关的问题,它使用messages.list来检查邮件历史记录。 它使用消息列表中的参数q提供最近的时间戳。如果有需要,请查看此问题以获取帮助。如需更多信息,请查看 - KENdi
@KENdi 谢谢。虽然它没有回答为什么获取历史记录失败,但是根据那些答案建议的基于消息列表的同步工作正常。 - Itachi
1个回答

21

我曾经遇到过一个非常类似的问题,我的错误是我使用了推送通知中的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,这样您就不需要每次都处理整个历史记录了!

希望这有所帮助。


1
这非常有用。我一开始不明白为什么我的historyID看起来是空的,但是当我再次查看时它却有了历史记录。现在我明白了,我不能立即使用推送通知中收到的historyID,而是必须将其存储并使用先前的ID。在我的情况下,这是因为我正在使用startHistoryId过滤器,该过滤器查找提供的ID之后的历史记录。 - gdvalderrama
1
太好了!谢谢你! - Facundo Fasciolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接