2014-07-14 11 views
7

Sto cercando di utilizzare l'API di Gmail per ottenere l'email di un utente, afferrare l'oggetto del messaggio e il corpo e visualizzarlo su una pagina web. Farò altre cose con esso, ma questa è la parte con cui sto avendo difficoltà. Sto usando Angular.js.API Gmail - Analizza il contenuto del messaggio (decodifica Base64?) Con Javascript

Qui è la mia chiamata API:

function makeApiCall() { 
    gapi.client.load('gmail', 'v1', function() { 
    var request = gapi.client.gmail.users.messages.list({ 
     labelIds: ['INBOX'] 
    }); 
    request.execute(function(resp) { 
     var content = document.getElementById("message-list"); 
     angular.forEach(resp, function(message) { 
     var email = gapi.client.gmail.users.messages.get({'id': message.id}); 
     // var raw = email.payload.parts; 
     // console.log(raw); 
     content.innerHTML += JSON.stringify(email) + "<br>"; 
     }) 
    }); 
    }); 
} 

Così gapi.client.gmail.users.messages.list restituisce un array dei miei messaggi, con i loro numeri ID. Funziona.

La chiamata a gapi.client.gmail.users.messages.get({<specific message ID>}) emette questo - {"B":{"method":"gmail.users.messages.get","rpcParams":{},"transport":{"name":"googleapis"}}}.

Non so cosa sia, ma cercando di ottenere il payload del messaggio (email.payload.parts), i risultati sono undefined. Quindi, come posso ottenere il contenuto del messaggio?

Inoltre, suppongo che se riesco a ottenere il contenuto del messaggio, dovrei quindi basare Base64 per decodificare il contenuto per ottenere un po 'di inglese. Qualsiasi suggerimento per questo sarebbe di grande aiuto anche. Ho trovato questo: https://github.com/kvz/phpjs, ma dal momento che non sono sicuro di come ottenere il contenuto del messaggio in modo che possa provare a decodificarli, quindi non sono sicuro che php.js sia di aiuto in tal senso.

risposta

3

A seconda dell'aspetto delle e-mail (testo singolo/parte singola? Multipart con testo/html? Allegati, ecc.) Potresti avere o meno delle "parti" nel tuo indirizzo email.payload e invece avrai cosa stai cercando in "email.payload.body.data" (per i messaggi a parte singola). Questo è tutto presupponendo che tu stia facendo un message.get con il formato predefinito ("full"). Se invece si desidera ottenere l'intera e-mail nel campo message.raw e gestirla nelle librerie di e-mail per la propria lingua, è possibile chiamare message.get (format = raw).

Per maggiori informazioni consultate il "corpo" e "parti []" documentazione di campo per "messaggio" a https://developers.google.com/gmail/api/v1/reference/users/messages

+0

Quando si cerca di accedere ' gapi.client.gmail.users.messages.get ({}). payload.body.data', emette 'Uncaught TypeError: Impossibile leggere la proprietà 'body' di undefined'. Tuttavia, quando esegui il test della chiamata al metodo .get nella documentazione dell'API di Gmail (sapevo del link che hai postato) su Prova! sezione della parte messages.get, posso vedere il contenuto nel campo del payload del mio oggetto messaggio, quindi non dovrebbe essere indefinito. Anche se per le parti [], si dice 'Per ... testo/chiaro, questo campo è vuoto. Un messaggio di posta elettronica di base conterrà testo normale, corretto? Quindi forse non è quello che dovrei andare .. – eugene1832

3

Ah! L'avevo capito. parts è un array, quindi avrebbe dovuto essere definendolo come: gapi.client.gmail.users.messages.get({'id': <message ID>}).payload.parts[0].body.data

Ora il mio problema sta decodificando i messaggi di posta elettronica, che si sta rivelando di successo nelle e-mail di testo, ma non riuscendo a messaggi di posta elettronica da posizioni non personali (imprese, social media aggiornare le email, ecc.). Ma farò una nuova domanda per ottenere risposte per questo.

+0

Dovresti usare una [biblioteca] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding) per la codifica e la decodifica – Stormie

+1

Vedi la mia risposta sopra per la codifica/decodifica – FullStack

22

Per quanto riguarda la decodifica Base64, è possibile utilizzare

atob(dataToDecode) 

per Gmail, si potrà anche sostituire alcuni caratteri:

atob(dataToDecode.replace(/-/g, '+').replace(/_/g, '/')); 

La funzione di cui sopra è a vostra disposizione in JavaScript (vedi ref). Lo uso da solo per decodificare i messaggi di Gmail. Non c'è bisogno di installare cose extra. Come tangente interessante, se vuoi codificare il tuo messaggio su Base64, usa btoa.

Ora, per accedere al vostro messaggio payload, è possibile scrivere una funzione:

var extractField = function(json, fieldName) { 
    return json.payload.headers.filter(function(header) { 
    return header.name === fieldName; 
    })[0].value; 
}; 
var date = extractField(response, "Date"); 
var subject = extractField(response, "Subject"); 

riferimento dal mio precedente SO Question e

var part = message.parts.filter(function(part) { 
    return part.mimeType == 'text/html'; 
}); 
var html = atob(part.body.data.replace(/-/g, '+').replace(/_/g, '/')); 
+0

Grazie amico! Sei un risparmiatore di vita, funziona come una magia! – budiantoip

0

È necessario cercare dove il corpo per un dato tipo mime è, ho scritto una funzione ricorsiva per questo:

function searchBodyRec(payload, mimeType){ 
    if (payload.body && payload.body.size && payload.mimeType === mimeType) { 
     return payload.body.data; 
    } else if (payload.parts && payload.parts.length) { 
     return payload.parts.flatMap(function(part){ 
      return searchBodyRec(part, mimeType); 
     }).filter(function(body){ 
      return body; 
     }); 
    } 
} 

Così ora puoi chiamare

var encodedBody = searchBodyRec(this.message.payload, 'text/plain'); 

Vedere il metodo flatMap lassù? metodo classico FP manca in js, ecco come per inserirlo (oppure è possibile utilizzare lodash.js, o underscore.js se non si vuole fare confusione con gli oggetti nativi)

Array.prototype.flatMap = function(lambda) { 
    return Array.prototype.concat.apply([], this.map(lambda)); 
}; 
Problemi correlati