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

问题描述 投票:0回答:5

我们有一个使用 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)
gmail imap jakarta-mail gmail-imap eml
5个回答
6
投票

我使用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;
            }
        }
    } 

2
投票

您使用什么版本的 JavaMail?

您可能遇到了此处描述的 Gmail 错误之一。


1
投票

GMail 已知会 产生格式错误的

BODYSTRUCTURE
响应,请参阅例如来自他们代表的消息。我上次检查时(2012 年中),它仍然没有修复。


0
投票

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

我正在使用 Mail Enable,解决方案是删除索引文件(在我的例子中为 _index.xml)


0
投票

如果您正在从 IMAP 服务器读取邮件,则很可能您正在读取邮件内容(在 Java API 中)两次。我们最近遇到了这个问题,通过延迟加载内容并将其保存到成员变量中来解决它。

© www.soinside.com 2019 - 2024. All rights reserved.