Gmail 无法加载包含使用Thunderbird发送的.eml文件的电子邮件的BODYSTRUCTURE异常

Gmail 无法加载包含使用Thunderbird发送的.eml文件的电子邮件的BODYSTRUCTURE异常,gmail,imap,jakarta-mail,gmail-imap,eml,Gmail,Imap,Jakarta Mail,Gmail Imap,Eml,我们有一个使用Java邮件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.IMAPMe

我们有一个使用Java邮件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)

您使用的是什么版本的JavaMail

您可能遇到了所述的Gmail bug之一。

Gmail是已知的,请参阅例如。上次我检查时(2012年年中),它仍然未修复。

我成功地使用了该方法。简而言之,如果您的
消息
类型为
MimeMessage
,并且出现此异常,请从原始MimeMessage创建一个新的MimeMessage实例,然后处理它。例如,我在调用消息的
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;
            }
        }
    } 

另一种可能性是,代表电子邮件的文件被手动从邮件服务器中删除,从而导致电子邮件服务器创建的索引(索引文件)错误。这可能会导致相同的错误


我使用邮件启用,而<强>解决方案是删除索引文件<强> >(在我的情况下是.x.x.xml)/p>我们使用的是JavaGMAIL IMAP-1.4.4-GM EXT-0.5.JAR,应该考虑切换到支持Gmail特定功能的JavaMail 1.4.7或1.5.0版本。如果您需要帮助确定这是否是Gmail bug,请在此处发布,或者通过javamail发送给我_ww@oracle.com.is与java-gmail-imap-1.4.4-gm-ext-0.5.jar兼容的JavaMail 1.5.0?需要多少代码更改?我不知道,我还没有详细看过,但根据上面的链接,它不需要大的代码更改。如果消息是数字签名的,则message.getContentType()上也有相同的异常。IMAP服务器是Exchange2007。我使用的是javaMail 1.5.4版本。