为什么gmail API中的搜索返回的结果与gmail网站中的搜索不同?

时间:2015-11-05 19:13:05

标签: python api email gmail gmail-api

我正在使用gmail API搜索来自用户的电子邮件。我创建了以下搜索查询:

ticket after:2015/11/04 AND -from:me AND -in:trash

当我在Gmail的浏览器界面中运行此查询时,我收到11封邮件(正如预期的那样)。但是,当我在API中运行相同的查询时,我只收到10条消息。我用来查询gmail API的代码是用Python编写的,如下所示:

searchQuery = 'ticket after:2015/11/04 AND -from:me AND -in:trash'
messagesObj = google.get('/gmail/v1/users/me/messages', data={'q': searchQuery}, token=token).data
print messagesObj.resultSizeEstimate  # 10

我将相同的邮件发送到另一个Gmail地址,并通过该电子邮件地址对其进行了测试,并且(令我惊讶的是)它确实显示在与其他电子邮件地址的API搜索中,因此问题不在于电子邮件本身。

在通过各种测试gmail帐户无休止地发送电子邮件后,我认为(但不是100%肯定)浏览器界面搜索功能具有不同的"me"定义。似乎在API搜索中它不包括来自具有相同名称的电子邮件地址的电子邮件,而这些结果实际上包含在浏览器搜索的结果中。例如:如果"Pete Kramer"发送了从petekramer@icloud.compete@gmail.com的电子邮件(其名称都设置为"Pete Kramer"),则会在浏览器搜索中显示,但不会在API搜索中显示。

有人可以确认这是问题吗?如果是这样,有没有办法绕过这个以获得与浏览器搜索返回相同的结果?或者是否有人知道为什么gmail浏览器搜索的结果与gmail API搜索不同?欢迎使用Al提示!

3 个答案:

答案 0 :(得分:7)

我怀疑是after查询参数会给你带来麻烦。 2015/11/04 is not a valid ES5 ISO 8601 date。您可以尝试替代after:<time_in_seconds_since_epoch>

# 2015-11-04 <=> 1446595200

searchQuery = 'ticket AND after:1446595200 AND -from:me AND -in:trash'
messagesObj = google.get('/gmail/v1/users/me/messages', data={'q': searchQuery}, token=token).data
print messagesObj.resultSizeEstimate  # 11 hopefully!

答案 1 :(得分:2)

q的{​​{1}}参数与我在网络界面上的工作方式相同(在https://developers.google.com/gmail/api/v1/reference/users/messages/list#try-it上试用)

我认为问题在于您是在呼叫/messages/list而不是/messages

答案 2 :(得分:1)

  

您的应用首次连接到Gmail时,或者如果部分同步不可用,您必须执行完全同步。在完全同步操作中,您的应用程序应检索并存储尽可能多的最新消息或线程,以满足您的需要。例如,如果您的应用程序显示最近消息的列表,您可能希望检索并缓存足够的消息,以便在用户滚动超出显示的前几条消息时允许响应接口。执行完全同步操作的一般过程如下:

     
      
  1. 调用messages.list以检索邮件ID的第一页。

  2.   
  3. 为列表请求返回的每条消息创建messages.get请求的批量请求。如果您的应用程序显示消息内容,则应在应用程序第一次检索消息时使用format = FULL或format = RAW,并缓存结果以避免其他检索操作。如果要检索以前缓存的消息,则应使用format = MINIMAL来减小响应的大小,因为只有labelId可能会更改。

  4.   
  5. 将更新合并到缓存的结果中。您的应用程序应存储最新消息的historyId(列表响应中的第一条消息),以便将来部分同步。

  6.         

    注意:您还可以使用等效的Threads资源方法执行同步。如果您的应用程序主要使用线程或仅需要消息元数据,这可能是有利的。

         

    部分同步

         

    如果您的应用程序最近已同步,则可以使用history.list方法执行部分同步,以返回比您在请求中指定的startHistoryId更新的所有历史记录。历史记录为每条消息提供消息ID和更改类型,例如自startHistoryId时起添加的消息,已删除的消息或已修改的标签。您可以从完整或部分同步中获取并存储最新消息的historyId,以作为startHistoryId提供给将来的部分同步操作。

         

    限制

         

    历史记录通常至少提供一周且通常更长。但是,记录可用的时间段可能会少得多,并且在极少数情况下有时可能无法记录。如果客户端提供的startHistoryId超出可用的历史记录范围,则API将返回HTTP 404错误响应。在这种情况下,您的客户端必须执行完全同步,如上一节所述。

来自gmail API文档 https://developers.google.com/gmail/api/guides/sync