【问题标题】:How to get full message body in Gmail?如何在 Gmail 中获取完整的邮件正文?
【发布时间】:2015-03-17 13:05:13
【问题描述】:

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

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

为了得到身体,我尝试:

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

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

【问题讨论】:

标签: java gmail gmail-api


【解决方案1】:

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

【讨论】:

【解决方案2】:

我尝试过这种方式,因为 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 字符串

【讨论】:

    【解决方案3】:

    我发现了更有趣的方式来解决完整的正文消息(而不仅仅是正文):

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

    【讨论】:

      【解决方案4】:

      这里是使用 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 加法一举解决了这一切。 תודה רבה
      【解决方案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" 组合在一起,并将其作为一个字符串返回。

      【讨论】:

        【解决方案6】:

        当我们收到完整消息时。消息正文在 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())));
        }
        

        【讨论】:

          【解决方案7】:

          基于@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())));
          

          【讨论】:

            【解决方案8】:

            有一个解码body的方法:

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

            【讨论】:

              猜你喜欢
              • 2021-04-20
              • 2016-12-16
              • 1970-01-01
              • 2016-12-12
              • 2017-06-24
              • 2015-01-17
              • 2016-09-28
              • 2012-12-11
              • 2019-07-29
              相关资源
              最近更新 更多