Gmail API:解码消息正文(Java/Android)

Gmail API:解码消息正文(Java/Android),java,android,gmail-api,Java,Android,Gmail Api,我需要以用户邮箱中的格式获取检索到的邮件,即:HTML。 我在解码检索到的邮件正文时遇到问题 请推荐一种用Java实现的方法 我现在这样做是为了得到信息: public class MyClass { public static Message getMessage(Gmail service, String userId, String messageId) throws IOException { Message message = service.users().

我需要以用户邮箱中的格式获取检索到的邮件,即: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;
  }

}
String mimeType=message.getPayload().getMimeType();
列出部件=message.getPayload().getParts();
if(mimeType.contains(“可选”)){
log.info(“进入备选循环”);
for(MessagePart:parts){
mailBody=新字符串(Base64.decodeBase64(part.getBody())
.getData().getBytes());
}
日志信息(邮件正文);
}
字符串mimeType=message.getPayload().getMimeType();
列出部件=message.getPayload().getParts();
if(mimeType.contains(“可选”)){
log.info(“进入备选循环”);
for(MessagePart:parts){
mailBody=新字符串(Base64.decodeBase64(part.getBody())
.getData().getBytes());
}
日志信息(邮件正文);
}

您可以使用以下方法:

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);
        }
    }
}
私有字符串getContent(消息){
StringBuilder StringBuilder=新的StringBuilder();
试一试{
getPlainTextFromMessageParts(message.getPayload().getParts(),stringBuilder);
byte[]bodyBytes=Base64.decodeBase64(stringBuilder.toString());
字符串文本=新字符串(bodyBytes,“UTF-8”);
返回文本;
}捕获(不支持的编码异常e){
logger.error(“不支持编码:+e.toString());
返回消息。getSnippet();
}
}
私有void getPlainTextFromMessageParts(列出messageParts、StringBuilder和StringBuilder){
用于(MessagePart MessagePart:messageParts){
if(messagePart.getMimeType().equals(“text/plain”)){
追加(messagePart.getBody().getData());
}
if(messagePart.getParts()!=null){
getPlainTextFromMessageParts(messagePart.getParts(),stringBuilder);
}
}
}

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

您可以使用以下方法:

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);
        }
    }
}
私有字符串getContent(消息){
StringBuilder StringBuilder=新的StringBuilder();
试一试{
getPlainTextFromMessageParts(message.getPayload().getParts(),stringBuilder);
byte[]bodyBytes=Base64.decodeBase64(stringBuilder.toString());
字符串文本=新字符串(bodyBytes,“UTF-8”);
返回文本;
}捕获(不支持的编码异常e){
logger.error(“不支持编码:+e.toString());
返回消息。getSnippet();
}
}
私有void getPlainTextFromMessageParts(列出messageParts、StringBuilder和StringBuilder){
用于(MessagePart MessagePart:messageParts){
if(messagePart.getMimeType().equals(“text/plain”)){
追加(messagePart.getBody().getData());
}
if(messagePart.getParts()!=null){
getPlainTextFromMessageParts(messagePart.getParts(),stringBuilder);
}
}
}

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

新字符串(messageResult.getPayload().getParts().get(0.getBody().decodeData())

新字符串(messageResult.getPayload().getParts().get(0.getBody().decodeData())

该代码到底有什么问题?它会崩溃、返回错误、返回乱码数据还是什么?在解码检索到的消息正文时遇到问题。它返回编码数据@KenY nw当我使用消息ID执行代码时,正文中会出现以下内容:会吗?该代码到底有什么问题?它会崩溃、返回错误、返回乱码数据还是什么?在解码检索到的消息正文时遇到问题。它返回编码数据@KenY nw当我用消息ID执行代码时,正文中会出现以下内容:是吗?这个答案真的帮我解决了一个问题,我被困了4-5个小时!!谢谢@Kiran PalakaHelp,我在“part.getBody().getData()”中得到了一个空指针,因为“part.getBody()”返回一个DataMap$entry数组。这个答案真的帮助我解决了一个困扰了我4-5个小时的问题!!谢谢@Kiran PalakaHelp,我在“part.getBody().getData()”中得到一个空指针,因为“part.getBody()”返回一个DataMap$条目数组