使用Gmail历史列表API获取INBOX邮件异常:返回无INBOX标签邮件
首先,咱们得先搞清楚Gmail History API里labelId=INBOX参数的实际作用——它不是用来过滤结果中邮件必须带有INBOX标签,而是用来筛选只返回与INBOX标签相关的历史事件。比如:
- 邮件被添加到INBOX的事件(
messagesAdded) - 邮件从INBOX被移除的事件(
messagesRemoved) - INBOX内邮件的其他修改事件
所以你请求返回的历史记录,都是和INBOX标签操作相关的,但这并不意味着事件里的邮件当前(或事件发生时)只带有INBOX标签——比如草稿邮件可以同时存在于INBOX和DRAFT标签下,这是完全合法的情况。
接下来看你提到的响应里messagesAdded的邮件标签数组[DRAFT, null, null, ...],这里的问题大概率和API返回的邮件格式有关:
Gmail History API默认返回的邮件对象是minimal格式,只包含id和threadId两个字段。如果你的响应里出现了标签ID,要么是你隐式指定了其他格式,要么是API在返回历史事件时只附带了部分标签信息(那些和当前历史事件相关的标签,其他标签位置用null填充)。
要获取邮件完整、准确的标签列表,你需要在请求中添加格式参数:
- 如果你需要完整的邮件数据(包括所有标签),在URL里加上
&format=full - 如果你只需要标签信息,更高效的方式是用
&format=metadata&metadataHeaders=labelIds
举个例子,修改后的请求URL会是:
https://www.googleapis.com/gmail/v1/users/me/history?labelId=INBOX&startHistoryId=37985130&maxResults=10&format=full
另外,还有一个需要注意的点:messagesAdded事件记录的是邮件被添加到指定标签(INBOX)的时刻的状态。如果在该事件发生后,邮件的标签被修改过(比如移除了INBOX标签),那么你通过History API获取的事件里的邮件标签,可能和当前邮件的实际标签不一致。如果需要确认邮件当前的标签状态,最好单独调用users.messages.get接口,传入邮件ID和format=full参数来获取最新数据。
内容的提问来源于stack exchange,提问作者Bruce Greer

