我们有一个使用 Java Mail API 访问 Gmail 帐户 (IMAP) 的应用程序。适用于所有类型的电子邮件,但包含 .eml 文件作为附件且使用 Thunderbird 发送的邮件除外。
这是尝试检索该消息时的异常堆栈跟踪。请指教。
Caused by: com.google.code.javax.mail.MessagingException: Unable to load BODYSTRUCTURE
at com.google.code.com.sun.mail.imap.IMAPMessage.loadBODYSTRUCTURE(IMAPMessage.java:1377)
at com.google.code.com.sun.mail.imap.IMAPMessage.getContentType(IMAPMessage.java:492)
我使用this方法取得了成功。简而言之,如果您的
Message
属于 MimeMessage
类型并且遇到此异常,请从原始 MimeMessage 创建一个新的 MimeMessage 实例并对其进行处理。例如,当我调用 Message 的 getContent()
方法时出现此错误,所以我编写了这个方法来获取内容:
private Object getEmailContent(Message email) throws IOException, MessagingException {
try {
return email.getContent();
} catch (MessagingException e) {
// handling the bug
if (email instanceof MimeMessage && "Unable to load BODYSTRUCTURE".equalsIgnoreCase(e.getMessage())) {
return new MimeMessage((MimeMessage) email).getContent();
} else {
throw e;
}
}
}
您使用什么版本的 JavaMail?
您可能遇到了此处描述的 Gmail 错误之一。
另一种可能性是,代表电子邮件的文件被手动从邮件服务器中删除,导致电子邮件服务器创建的索引(索引文件)错误。这可能会导致同样的错误。
我正在使用 Mail Enable,解决方案是删除索引文件(在我的例子中为 _index.xml)
如果您正在从 IMAP 服务器读取邮件,则很可能您正在读取邮件内容(在 Java API 中)两次。我们最近遇到了这个问题,通过延迟加载内容并将其保存到成员变量中来解决它。