2015-01-19 16 views
6

Desidero ottenere il corpo completo del messaggio. Così provo:Come ottenere il corpo completo del messaggio in Gmail?

Message gmailMessage = service.users().messages().get("me", messageId).setFormat("full").execute(); 

che per ottenere il corpo, provo:

gmailMessage.getPayload().getBody().getData() 

ma portano sempre null. Come ottenere il corpo completo del messaggio?

+0

rimuovere il SetFormat? – Hinotori

+0

Il motivo per cui questa particolare versione non funziona è che il campo raw è nullo di proposito. Se guardi i documenti API qui. https://developers.google.com/gmail/api/v1/reference/users/messages/get. Il formato "full" non utilizza il campo raw. – zypherman

risposta

3

Per ottenere i dati dal tuo gmailMessage, è possibile utilizzare gmailMessage.payload.parts [0] .body.data. Se si desidera decodificare in testo leggibile, è possibile effettuare le seguenti operazioni:..

import org.apache.commons.codec.binary.Base64; 
import org.apache.commons.codec.binary.StringUtils; 

System.out.println(StringUtils.newStringUtf8(Base64.decodeBase64(gmailMessage.payload.parts[0].body.data))); 
+1

grazie, la tua risposta mi ha aiutato – Hinotori

+0

Grandi cose. Risposta chiara Grazie ancora. – Yster

+1

@Yster Nessun problema :) Potrebbe valere la pena di leggere [questa risposta] (http://stackoverflow.com/questions/32655874/cannot-get-the-body-of-email-with-gmail-php-api/32660892# 32660892) per capire che questo problema può essere più complicato di quanto sembri. – Tholle

5

ho provato in questo modo, dal momento che message.getPayload() getBody() getParts() era sempre nullo

import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64; 
import com.google.api.client.repackaged.org.apache.commons.codec.binary.StringUtils; 

(...)

Message message = service.users().messages().get(user, m.getId()).execute(); 
MessagePart part = message.getPayload(); 
System.out.println(StringUtils.newStringUtf8(Base64.decodeBase64(part.getBody().getData()))); 

E il risultato è pura stringa HTML

4

ho trovato molto più interessante come RESOL ve un messaggio per tutto il corpo (e non solo il corpo):

System.out.println(StringUtils.newStringUtf8( Base64.decodeBase64 (message.getRaw()))); 
1

Se avete il messaggio (com.google.api.services.gmail.model.Message) è possibile utilizzare i seguenti metodi:

public String getContent(Message message) { 
    StringBuilder stringBuilder = new StringBuilder(); 
    try { 
     getPlainTextFromMessageParts(message.getPayload().getParts(), stringBuilder); 
     byte[] bodyBytes = Base64.decodeBase64(stringBuilder.toString()); 
     String text = new String(bodyBytes, "UTF-8"); 
     return text; 
    } catch (UnsupportedEncodingException e) { 
     logger.error("UnsupportedEncoding: " + e.toString()); 
     return message.getSnippet(); 
    } 
} 

private void getPlainTextFromMessageParts(List<MessagePart> messageParts, StringBuilder stringBuilder) { 
    for (MessagePart messagePart : messageParts) { 
     if (messagePart.getMimeType().equals("text/plain")) { 
      stringBuilder.append(messagePart.getBody().getData()); 
     } 

     if (messagePart.getParts() != null) { 
      getPlainTextFromMessageParts(messagePart.getParts(), stringBuilder); 
     } 
    } 
} 

Combina tutte le parti del messaggio con il mimeType "text/plain" e lo restituisce come una stringa.

0

ecco la soluzione in codice C# gmail API v1 per leggere il contenuto del corpo e-mail:

var request = _gmailService.Users.Messages.Get("me", mail.Id); 
       request.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Full; 

e per risolvere l'errore di dati

var res = message.Payload.Body.Data.Replace("-", "+").Replace("_", "/"); 
byte[] bodyBytes = Convert.FromBase64String(res); 


string val = Encoding.UTF8.GetString(bodyBytes); 
Problemi correlati