如何在Gmail中获取完整的邮件正文?

som*_*ody 14 java gmail gmail-api

我想获得完整的消息体.所以我尝试:

Message gmailMessage = service.users().messages().get("me", messageId).setFormat("full").execute();
Run Code Online (Sandbox Code Playgroud)

为了获得身体,我尝试:

gmailMessage.getPayload().getBody().getData()
Run Code Online (Sandbox Code Playgroud)

但结果总是如此null.如何获得完整的邮件正文?

Hin*_*ori 6

我试过这种方式,因为message.getPayload().getBody().getParts()始终为null

import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.StringUtils;
Run Code Online (Sandbox Code Playgroud)

(......)

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

结果是纯HTML字符串


小智 6

我找到了更有趣的方法来解决一个完整的身体信息(而不仅仅是身体):

System.out.println(StringUtils.newStringUtf8(   Base64.decodeBase64 (message.getRaw())));
Run Code Online (Sandbox Code Playgroud)


Tho*_*lle 5

要从gmailMessage获取数据,可以使用gmailMessage.payload.parts [0] .body.data。如果要将其解码为可读的文本,可以执行以下操作:

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)));
Run Code Online (Sandbox Code Playgroud)

  • @Yster没问题:)可能值得一读[这个答案](http://stackoverflow.com/questions/32655874/cannot-get-the-body-of-email-with-gmail-php-api/32660892#32660892 ),以了解此问题可能比看起来要棘手。 (2认同)

小智 5

如果您有消息 (com.google.api.services.gmail.model.Message),您可以使用以下方法:

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, StandardCharsets.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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它将所有消息部分与 mimeType“text/plain”组合在一起,并将其作为一个字符串返回。


Tal*_*sar 5

这是在 c# 代码 gmail API v1 中读取电子邮件正文内容的解决方案:

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

并解决数据错误

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


 string val = Encoding.UTF8.GetString(bodyBytes);
Run Code Online (Sandbox Code Playgroud)