2015-01-19 16 views
6

Chcę uzyskać pełną treść wiadomości. Więc staram:Jak uzyskać pełną treść wiadomości w Gmailu?

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

że aby uzyskać ciało, staram:

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

ale wynikają zawsze null. Jak uzyskać pełne treści wiadomości?

+0

usunąć setFormat? – Hinotori

+0

Powodem, dla którego ta konkretna wersja nie działa, jest to, że surowe pole ma celowe znaczenie. Jeśli spojrzeć na dokumenty api tutaj. https://developers.google.com/gmail/api/v1/reference/users/messages/get. Format "pełny" nie używa pola surowego. – zypherman

Odpowiedz

3

Aby pobrać dane z gmailMessage, możesz użyć gmailMessage.payload.parts [0] .body.data. Jeśli chcesz dekodować go na tekst czytelny, można wykonać następujące czynności:..

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

dziękuję, twoja odpowiedź pomogła mi – Hinotori

+0

Świetne rzeczy. Wyczyść odpowiedź. Dzięki jeszcze raz. – Yster

+1

@Yster Nie ma problemu :) Może warto czytać [ta odpowiedź] (http://stackoverflow.com/questions/32655874/cannot-get-the-body-of-email-with-gmail-php-api/32660892# 32660892), aby zrozumieć, że ten problem może być trudniejszy, niż się wydaje. – Tholle

5

Próbowałem w ten sposób, ponieważ message.getPayload() getBody() getParts() zawsze był zerowy

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()))); 

a wynik jest czysty HTML String

4

znalazłem bardziej interesujący sposób jak Rozdz ve pełną wiadomość ciała (a nie tylko ciało):

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

Jeśli masz komunikat (com.google.api.services.gmail.model.Message) można użyć następujących metod:

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); 
     } 
    } 
} 

Łączy wszystkie części wiadomości z mimeType "text/plain" i zwraca je jako jeden ciąg.

0

tutaj jest rozwiązanie w C# kod Gmail API v1 przeczytać zawartość ciała email:

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

i rozwiązać błąd danych

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


string val = Encoding.UTF8.GetString(bodyBytes); 
Powiązane problemy