我有一个在用户Gmail中查找新邮件的流程。如果消息符合某些地址标准,则会将消息添加到外部数据库中。
我们一直在使用Users.History.List,它返回所有已对其进行更改的邮件。这是非常低效的,因为我们必须随后检查每条消息以查看我们是否已经处理过它。
我们正在考虑使用Users.Messages.List并检查MsgId以查看它是否大于上一次检查(我们存储了Id)。这里的假设是MsgId将继续变大。这种做法有缺陷吗?别人在做什么?
非常感谢。
答案 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()来执行完全同步。