2015-06-30 12 views
9

Sto utilizzando l'API GMail su Python/Google App Engine. Ho una query che restituisce determinati ID di thread e ora vorrei ottenere l'ultimo messaggio di ogni thread. Poiché i risultati non sono necessariamente ordinati per data, mi chiedo quale sarebbe la chiamata API più efficiente per questo?GMail - Ricevi l'ultimo messaggio di una discussione

Sulla base dei commenti qui sotto ho impostare la seguente funzione batch:

if threads != []: 
    count = 0 #start a new batch request after every 1000 requests 
    batch = BatchHttpRequest(callback=get_items) 
    for t in threads: 
     batch.add(service.users().threads().get(userId=email, id=t), request_id=some_id) 
     count += 1 
     if count % 1000: #batch requests can handle max 1000 entries 
      batch.execute(http=http) 
      batch = BatchHttpRequest(callback=get_items) 
    if not count % 1000: 
      batch.execute(http=http) 

Questo poi esegue get_items, che tra l'altro corre logica seguente per scoprire se l'ultima e-mail in un thread è stato un inviato articolo.

def get_items(request_id, response, exception): 
    if exception is not None: 
     print 'An error occurred: %s' % exception 
    else: 
     for m in response['messages']: #check each of the messages in the response 
      if m['historyId'] == response['historyId']: #if it equals the historyId of the thread 
       if 'SENT' in m['labelIds']: #and it is marked as a sent item 
        item = m #use this message for processing 

Questo sembra funzionare per la maggior parte dei casi, tuttavia, ci sono casi in cui "voce", come creato in precedenza contiene 2 messaggi con differenti historyIds. Non sono sicuro di cosa lo stia causando e vorrei sapere prima di creare un work-around per questo ...

+0

Secondo questo [link] [1] è possibile utilizzare la storia per ottenere ID ultimo messaggio di un filo [1]: https://developers.google. com/gmail/api/v1/reference/users/threads – cutteeth

+0

Ah sì, ci ho pensato, non ero sicuro se in realtà lo avesse fatto. Un pensiero un nuovo ID di storia potrebbe anche essere aggiunto quando un messaggio viene eliminato. Lo scoprirò presto allora. Farò un tentativo, grazie. – Vincent

+0

Sembra che funzioni nella maggior parte dei casi, tuttavia in alcuni casi, se corrispondo a historyId, ottengo più di 1 messaggio come risposta. Aggiungere il codice sopra. – Vincent

risposta

3

L'API di Gmail ora supporta il campo internalDate.

INTERNALDATE - La creazione messaggio timestamp interno (ms epoca), che determina ordinamento nella casella di posta.

Ottenere l'ultimo messaggio in un thread non è più difficile di un User.thread: get-request, chiedendo l'id e InternalDate dei singoli messaggi, e capire quale è stato creato per ultimo.

fields = messages(id,internalDate) 

GET https://www.googleapis.com/gmail/v1/users/me/threads/14e92e929dcc2df2?fields=messages(id%2CinternalDate)&access_token={YOUR_API_KEY} 

Risposta:

{ 
"messages": [ 
    { 
    "id": "14e92e929dcc2df2", 
    "internalDate": "1436983830000" 
    }, 
    { 
    "id": "14e92e94a2645355", 
    "internalDate": "1436983839000" 
    }, 
    { 
    "id": "14e92e95cfa0651d", 
    "internalDate": "1436983844000" 
    }, 
    { 
    "id": "14e92e9934505214", 
    "internalDate": "1436983857000" // <-- This is it! 
    } 
] 
} 
+0

in che misura la data interna differisce dalla historyId? Entrambi sono timestamp unici generati da Google per quanto ho capito. – Vincent

+1

@Vincent Non ne sono sicuro, a dire il vero. Ho appena trovato che 'historyId' è difficile da gestire a volte, poiché è un ID dell'ultimo record della cronologia che ha modificato il messaggio specifico. Il nuovo 'internalDate' è molto semplice. – Tholle

+1

OK, grazie! Proveremo presto e confermeremo se funziona. – Vincent

Problemi correlati