【问题标题】:Gmail APIs: Decoding the body of the message (Java/Android)Gmail API:解码邮件正文(Java/Android)
【发布时间】:2015-06-15 17:27:12
【问题描述】:

我需要以用户邮箱中的格式获取检索到的邮件,即:HTML。
我在解码检索到的消息正文时遇到问题。

请建议一种在 Java 中完成此操作的方法。

我目前正在这样做以获取消息:

public class MyClass {

  public static Message getMessage(Gmail service, String userId, String messageId)
      throws IOException {
    Message message = service.users().messages().get(userId, messageId).execute();

    System.out.println("Message snippet: " + message.getSnippet());

    return message;
  }

  public static MimeMessage getMimeMessage(Gmail service, String userId, String messageId)
      throws IOException, MessagingException {
    Message message = service.users().messages().get(userId, messageId).setFormat("raw").execute();

    byte[] emailBytes = Base64.decodeBase64(message.getRaw());

    Properties props = new Properties();
    Session session = Session.getDefaultInstance(props, null);

    MimeMessage email = new MimeMessage(session, new ByteArrayInputStream(emailBytes));

    return email;
  }

}

【问题讨论】:

  • 该代码到底有什么问题?它会崩溃、返回错误、返回乱码还是什么?
  • 无法解码检索到的邮件正文。
  • 返回编码数据@KenY-N
  • 当我使用消息 ID 执行该代码时,我在正文中得到以下内容:pastebin.com/LKH6V3kV

标签: java android gmail-api


【解决方案1】:
String mimeType = message.getPayload().getMimeType();
    List<MessagePart> parts = message.getPayload().getParts();
    if (mimeType.contains("alternative")) {
        log.info("entering alternative loop");
        for (MessagePart part : parts) {
            mailBody = new String(Base64.decodeBase64(part.getBody()
                    .getData().getBytes()));

        }
        log.info(mailBody);
    }

【讨论】:

  • 这个答案真的帮助我解决了我被困了 4-5 个小时的问题!谢谢@Kiran Palaka
  • 求助,我在“part.getBody().getData()”中得到了一个空指针,因为“part.getBody()”返回了一个 DataMap$Entry 数组
【解决方案2】:

您可以使用以下方法:

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

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

【讨论】:

    【解决方案3】:

    new String(messageResult.getPayload().getParts().get(0).getBody().decodeData())

    【讨论】:

      猜你喜欢
      • 2018-07-28
      • 2017-10-28
      • 1970-01-01
      • 2015-09-25
      • 2020-06-21
      • 2016-10-01
      • 2021-08-04
      • 2018-03-03
      相关资源
      最近更新 更多