我有一個在用戶Gmail中查找新郵件的過程。如果郵件符合特定的地址標準,則郵件將添加到外部數據庫。獲取新郵件的最有效方式
我們一直在使用Users.History.List,它返回所有對它們進行了更改的消息。這是非常低效的,因爲我們必須隨後檢查每封郵件,看看我們是否已經處理過它。
我們正在尋找交替使用Users.Messages.List並檢查MsgId以查看它是否大於以前的檢查(我們從中存儲該Id)。這裏的假設是MsgId將繼續變大。這種做法是否有缺陷?別人在做什麼?
很多謝謝。
我有一個在用戶Gmail中查找新郵件的過程。如果郵件符合特定的地址標準,則郵件將添加到外部數據庫。獲取新郵件的最有效方式
我們一直在使用Users.History.List,它返回所有對它們進行了更改的消息。這是非常低效的,因爲我們必須隨後檢查每封郵件,看看我們是否已經處理過它。
我們正在尋找交替使用Users.Messages.List並檢查MsgId以查看它是否大於以前的檢查(我們從中存儲該Id)。這裏的假設是MsgId將繼續變大。這種做法是否有缺陷?別人在做什麼?
很多謝謝。
消息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作爲歷史標識並且消息中沒有任何更改,則響應將爲標頭爲200。如果您收到404錯誤響應,則需要使用messages.list()來執行完全同步。
我們一直在使用歷史ID,但是這會返回對線索/消息的所有更改。我們只需要新的消息,並希望避免檢查我們已經同步的消息的所有歷史記錄。如果可能的話,我們只需要一個新消息列表。 – PNC 2015-02-02 23:37:32
您可以使用messages.list(),將標籤名稱和q值設置爲「is:unread」以獲取所有未讀消息。 – SGC 2015-02-02 23:43:06
是的,我們是messages.list()並獲取id大於最後同步的messageId的所有消息。這似乎是最好的方法。未讀將忽略任何發送的消息/打開的消息,我會想到的? – PNC 2015-02-03 00:58:10
下面是一個例子,如何只得到新的消息(使用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
我面臨同樣的情況,它的工作原理,但正如你所說,這是低效的。你有沒有想過一個更好的方法來解決這個問題? – guival 2017-11-10 15:21:12
不 - 我們只是按時間進行投票。方式更有效率。 – PNC 2017-11-11 08:00:02