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

19

我想获取完整的消息正文。 所以我尝试:

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

要获取body,我尝试了:

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

但结果总是null。如何获取完整的消息正文?


移除 setFormat 函数? - Hinotori
这个特定版本不起作用的原因是原始字段是故意为空的。如果您在此处查看api文档。https://developers.google.com/gmail/api/v1/reference/users/messages/get。 “完整”格式不使用原始字段。 - zypherman
9个回答

8

要从您的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)));

3
没问题 :) 也许值得阅读这篇答案,了解这个问题可能比看起来更棘手。链接在此:https://dev59.com/CFwY5IYBdhLWcg3waXIF#32660892 - Tholle
1
答案在这里 https://developers.google.com/gmail/api/v1/reference/users/messages/get (“format”字段) - ror
message['payload']['parts'][0]['body'] always returns {'size': 0} - endolith
是的,我也有电子邮件正文的主要部分分成了[1]部分。 - washiur17

6
我试过这种方法,因为message.getPayload().getBody().getParts()总是为空。
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())));

结果是纯HTML字符串。

6
我找到了一种更有趣的方式来解决完整的消息(不仅限于正文):
System.out.println(StringUtils.newStringUtf8(   Base64.decodeBase64 (message.getRaw())));

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

它使用mimeType为"text/plain"的所有消息部分,并将其组合为一个字符串返回。


5

以下是使用C#代码的Gmail API v1读取电子邮件正文内容的解决方案:

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

并解决数据错误问题

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


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

如果我有一百万个朋友,我会贿赂他们全部加入SO以点赞这个回答!我已经在这个解码问题上浪费了很多时间,而你的“Replace”方法一举解决了所有问题。 תודה רבה - Avrohom Yisroel

1
当我们得到完整的消息时,消息正文位于“Parts”内。
这是一个例子,其中显示了消息标头(日期、发件人、收件人和主题),并显示纯文本格式的消息正文。Payload中的部分返回两种类型的消息(纯文本和格式化文本)。我对纯文本感兴趣。
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
Message message = service.users().messages().get(user, messageId).execute();
    
//Print email body
List<MessagePart> parts = message.getPayload().getParts();
String data = parts.get(0).getBody().getData();
String body = new String(BaseEncoding.base64Url().decode(data));

0

有一种方法可以解码主体:

final String body = new String(message.getPayload().getParts().get(0).getBody().decodeData());

0

基于 @Tholle 的评论,我做了类似的东西

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接