2015-01-31 52 views
2

我有一個在用戶Gmail中查找新郵件的過程。如果郵件符合特定的地址標準,則郵件將添加到外部數據庫。獲取新郵件的最有效方式

我們一直在使用Users.History.List,它返回所有對它們進行了更改的消息。這是非常低效的,因爲我們必須隨後檢查每封郵件,看看我們是否已經處理過它。

我們正在尋找交替使用Users.Messages.List並檢查MsgId以查看它是否大於以前的檢查(我們從中存儲該Id)。這裏的假設是MsgId將繼續變大。這種做法是否有缺陷?別人在做什麼?

很多謝謝。

+0

我面臨同樣的情況,它的工作原理,但正如你所說,這是低效的。你有沒有想過一個更好的方法來解決這個問題? – guival 2017-11-10 15:21:12

+0

不 - 我們只是按時間進行投票。方式更有效率。 – PNC 2017-11-11 08:00:02

回答

2

消息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()來執行完全同步。

+1

我們一直在使用歷史ID,但是這會返回對線索/消息的所有更改。我們只需要新的消息,並希望避免檢查我們已經同步的消息的所有歷史記錄。如果可能的話,我們只需要一個新消息列表。 – PNC 2015-02-02 23:37:32

+0

您可以使用messages.list(),將標籤名稱和q值設置爲「is:unread」以獲取所有未讀消息。 – SGC 2015-02-02 23:43:06

+0

是的,我們是messages.list()並獲取id大於最後同步的messageId的所有消息。這似乎是最好的方法。未讀將忽略任何發送的消息/打開的消息,我會想到的? – PNC 2015-02-03 00:58:10

4

下面是一個例子,如何只得到新的消息(使用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

相關問題