问:Gmail Api将来会返回带有内部日期的电子邮件

时间:2019-06-25 16:42:01

标签: gmail-api

我正在尝试使用Gmail api来同步用户Gmail收件箱中的所有电子邮件。我正在使用Gmail的“同步客户端” [1]文档中介绍的部分同步技术。列出的限制之一是在极少数情况下某些电子邮件的historyId不可用。在这种情况下,建议客户端退回使用“完全同步”,这表明客户端应“检索并存储您所需的尽可能多的最新消息或线程”。

这一切都说得通。当我遇到部分同步问题时,我尝试按时间范围浏览收件箱消息。为此,我有效地存储了所同步的每封电子邮件的( emailAddress, historyId, internalDate )记录,然后在完全同步时,我尝试同步自已同步的最新internalDate起的所有电子邮件。

我的问题是,似乎导致部分同步失败的情况似乎也导致完全同步失败,其中许多情况是由将来带有internalDates 的电子邮件引起的>(出于隐私原因,我无法分享这些示例)。失败案例似乎类似于以下内容

  1. 我会在以后的某个时间将电子邮件E与historyId H和一个internalDate同步
  2. 有些时候过去了
  3. 我收到Google的推送通知,表明它们是要同步的新电子邮件
  4. 我查找与此inboxId同步的最新消息,找到电子邮件E
  5. 我尝试使用带有historyId H的listHistory [2]端点进行部分同步
  6. listHistory请求失败,并显示404
  7. 我尝试通过查询newer_than:{hours_since-internalDate-I}使用listMessages [3]端点进行完全同步,但是由于此消息的internalDate是将来的版本,因此此请求没有任何意义。

我可以想像一些解决此问题的方法。也许我应该简单地将这些电子邮件视为垃圾邮件,或者我应该存储一个同步每个电子邮件的时间戳,然后对已存储的时间戳执行完全同步。

无论哪种方式,这似乎都是Gmail API中的错误,因为internalDate应该确实是Gmail收到电子邮件时的错误。最初,我怀疑这可能是由于Gmail的新计划功能引起的,而internalDate可能是将来计划电子邮件的时间,但是我确认我确实有一些示例确实是针对用户收件箱中的电子邮件的已收到,而不是已发送。真的不确定在internalDate api中如何处理这种边缘情况。

所以我的问题是,处理假未来internalDates的建议方法是什么?这是一个错误吗?

  1. https://developers.google.com/gmail/api/guides/sync
  2. https://developers.google.com/gmail/api/v1/reference/users/history/list
  3. https://developers.google.com/gmail/api/v1/reference/users/messages/list

1 个答案:

答案 0 :(得分:1)

如果您确定这是一个错误,则可以前往Google的问题跟踪器(template here)并进行报告,以便其工程团队可以查看一下并找出导致此错误的原因。或者,如果其他邮件或用户仍然遇到这种情况,则可以直接转到admin dashboard,然后在“?右上角的菜单。这样,Google可以查看错误的internalDates,而无需您在公共论坛上发布任何潜在的敏感数据。

与此同时,您可以通过确保您以后不提取邮件(伪代码)来动态地解决此问题:

var now = new Date().getTime()
var q = "newer_than:1h before:" + now

GmailServiceConnect.Users.messages.list(userId = "user@domain.ext", q = q).execute()

但是请记住,GMail在Unix时间上使用毫秒而不是秒,因此必须相应地进行调整。