我正在使用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.com
到pete@gmail.com
的电子邮件(其名称都设置为"Pete Kramer"
),则会在浏览器搜索中显示,但不会在API搜索中显示。
有人可以确认这是问题吗?如果是这样,有没有办法绕过这个以获得与浏览器搜索返回相同的结果?或者是否有人知道为什么gmail浏览器搜索的结果与gmail API搜索不同?欢迎使用Al提示!
答案 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时,或者如果部分同步不可用,您必须执行完全同步。在完全同步操作中,您的应用程序应检索并存储尽可能多的最新消息或线程,以满足您的需要。例如,如果您的应用程序显示最近消息的列表,您可能希望检索并缓存足够的消息,以便在用户滚动超出显示的前几条消息时允许响应接口。执行完全同步操作的一般过程如下:
调用messages.list以检索邮件ID的第一页。
为列表请求返回的每条消息创建messages.get请求的批量请求。如果您的应用程序显示消息内容,则应在应用程序第一次检索消息时使用format = FULL或format = RAW,并缓存结果以避免其他检索操作。如果要检索以前缓存的消息,则应使用format = MINIMAL来减小响应的大小,因为只有labelId可能会更改。
- 醇>
将更新合并到缓存的结果中。您的应用程序应存储最新消息的historyId(列表响应中的第一条消息),以便将来部分同步。
注意:您还可以使用等效的Threads资源方法执行同步。如果您的应用程序主要使用线程或仅需要消息元数据,这可能是有利的。
部分同步
如果您的应用程序最近已同步,则可以使用history.list方法执行部分同步,以返回比您在请求中指定的startHistoryId更新的所有历史记录。历史记录为每条消息提供消息ID和更改类型,例如自startHistoryId时起添加的消息,已删除的消息或已修改的标签。您可以从完整或部分同步中获取并存储最新消息的historyId,以作为startHistoryId提供给将来的部分同步操作。
限制
历史记录通常至少提供一周且通常更长。但是,记录可用的时间段可能会少得多,并且在极少数情况下有时可能无法记录。如果客户端提供的startHistoryId超出可用的历史记录范围,则API将返回HTTP 404错误响应。在这种情况下,您的客户端必须执行完全同步,如上一节所述。
来自gmail API文档 https://developers.google.com/gmail/api/guides/sync