Gmail API:解码邮件正文(Java/Android)
Posted
技术标签:
【中文标题】Gmail API:解码邮件正文(Java/Android)【英文标题】:Gmail APIs: Decoding the body of the message (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 this question help? 【参考方案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())
【讨论】:
以上是关于Gmail API:解码邮件正文(Java/Android)的主要内容,如果未能解决你的问题,请参考以下文章