获得新消息的最有效方式

时间:2015-01-31 22:45:00

标签: gmail-api

我有一个在用户Gmail中查找新邮件的流程。如果消息符合某些地址标准,则会将消息添加到外部数据库中。

我们一直在使用Users.History.List,它返回所有已对其进行更改的邮件。这是非常低效的,因为我们必须随后检查每条消息以查看我们是否已经处理过它。

我们正在考虑使用Users.Messages.List并检查MsgId以查看它是否大于上一次检查(我们存储了Id)。这里的假设是MsgId将继续变大。这种做法有缺陷吗?别人在做什么?

非常感谢。

2 个答案:

答案 0 :(得分:5)

以下是如何仅获取新消息(使用Java客户端API)

的示例
List<History> histories = new ArrayList<History>();
ListHistoryResponse response = service.users().history().list(userUID).setStartHistoryId(startHistoryId).execute();

//get all history events and not only the first page
while (response.getHistory() != null) {
    histories.addAll(response.getHistory());
    if (response.getNextPageToken() != null) {
        String pageToken = response.getNextPageToken();
        response = service.users().history().list(userUID)
                .setPageToken(pageToken)
                .setStartHistoryId(startHistoryId).execute();
    } else {
        break;
    }
}

//for each history element find the added messages
for (History history : histories) {
    List<HistoryMessageAdded> addedMessages = history.getMessagesAdded();

    if (addedMessages == null){
        continue;
    }

    //call to message.get for each HistoryMessageAdded
    for (HistoryMessageAdded addedMsg : addedMessages) {
        Message message = addedMsg.getMessage();
            Message rawMessage = service.users().messages().get(userUID, message.getId()).setFormat("raw").execute();

    }
}

可能在其他语言/ REST API中有类似的实现。

您可以使用其他历史事件,例如:messagesDeleted,labelsAdded和labelsRemoved 参考: https://developers.google.com/gmail/api/v1/reference/users/history/list

答案 1 :(得分:3)

消息ID是唯一的,其值永远不会更改。要收到新消息,您可以使用history.list(),并为historyId提供您之前为该消息提供的最大historyId

以下是示例回复:

{
 "history": [
  {
   "id": "1825077",
   "messages": [
    {
     "id": "14b4c0dbc6ba9a57",
     "threadId": "14b4b4ae8cfbea5c"
    }
   ]
  },
  {
   "id": "1825087",
   "messages": [
    {
     "id": "14b4c0dc3ab5e49b",
     "threadId": "14b4b4ae8cfbea5c"
    }
   ]
  },
  {
   "id": "1825097",
   "messages": [
    {
     "id": "14b4c0e07e0f6545",
     "threadId": "14b4b4ae8cfbea5c"
    }
   ]
  }
 ]
}

1825097是消息“14b4c0e07e0f6545”的最大historyId。另外Msgid此处没有更改,只更改了历史记录ID。

如果您将1825097作为历史ID并且消息中没有更改,则响应将为200,其中包含标题。如果您收到404响应错误,则需要使用messages.list()来执行完全同步。