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

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

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

为了获得身体,我尝试:

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

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

我试过这种方式,因为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; 

(……)

 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字符串

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

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

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

这里是c#code 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); 

如果您有消息(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, "UTF-8"); return text; } catch (UnsupportedEncodingException e) { logger.error("UnsupportedEncoding: " + e.toString()); return message.getSnippet(); } } private void getPlainTextFromMessageParts(List 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”组合在一起,并将其作为一个字符串返回。

根据@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())));