web-dev-qa-db-fra.com

Comment obtenir le corps du message complet dans Gmail?

Je veux obtenir le corps du message complet. Alors j'essaye:

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

Que pour avoir du corps, j'essaye:

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

mais résultat toujours null. Comment obtenir le corps du message complet?

11
TestUser

J'ai trouvé un moyen plus intéressant de résoudre un message complet (et pas seulement corps):

System.out.println(StringUtils.newStringUtf8(   Base64.decodeBase64 (message.getRaw())));
6
Yury Staravoitau

J'ai essayé de cette façon, puisque message.getPayload (). GetBody (). GetParts () était toujours nul

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

Et le résultat est pure chaîne HTML

5
Hinotori

Pour obtenir les données de votre gmailMessage, vous pouvez utiliser gmailMessage.payload.parts [0] .body.data. Si vous souhaitez le décoder en texte lisible, vous pouvez procéder comme suit:

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)));
4
Tholle

voici la solution dans c # code API gmail v1 pour lire le contenu du corps de l'e-mail:

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

et pour résoudre l'erreur de données

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


 string val = Encoding.UTF8.GetString(bodyBytes);
2
Tal Avissar

Si vous avez le message (com.google.api.services.gmail.model.Message), vous pouvez utiliser les méthodes suivantes: 

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

Il combine toutes les parties du message avec le mimeType "text/plain" et le renvoie sous la forme d'une chaîne. 

2
Gerard Verbeek

Base sur le commentaire de @Tholle j'ai fait quelque chose comme ça

Message message = service.users().messages()
        .get(user, messageHolder.getId()).execute();

System.out.println(StringUtils.newStringUtf8(Base64.decodeBase64(
        message.getPayload().getParts().get(0).getBody().getData())));
0
Tomasz TJ

Quand nous recevons le message complet. Le corps du message est à l'intérieur des parties.

Ceci est un exemple dans lequel les en-têtes de message (Date, De, À et Objet) sont affichés et le corps du message en texte brut est affiché. Parts in Payload renvoie les deux types de messages (texte brut et texte formaté). Je m'intéressais au texte en clair.

Message msg = service.users().messages().get(user, message.getId()).setFormat("full").execute();
// Displaying Message Header Information
for (MessagePartHeader header : msg.getPayload().getHeaders()) {
  if (header.getName().contains("Date") || header.getName().contains("From") || header.getName().contains("To")
      || header.getName().contains("Subject"))
    System.out.println(header.getName() + ":" + header.getValue());
}
// Displaying Message Body as a Plain Text
for (MessagePart msgPart : msg.getPayload().getParts()) {
  if (msgPart.getMimeType().contains("text/plain"))
    System.out.println(new String(Base64.decodeBase64(msgPart.getBody().getData())));
}
0
zHs