Невозможно загрузить исключение BODYSTRUCTURE с электронным письмом, содержащим файл .eml, отправленным с помощью Thunderbird.

У нас есть приложение, которое обращается к учетной записи Gmail (IMAP) с помощью Java Mail API. Отлично работает для всех типов электронных писем, за исключением сообщения, которое содержит файл .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)

person Saqib Ali    schedule 08.08.2013    source источник


Ответы (4)


Какую версию JavaMail вы используете?

Возможно, вы столкнулись с одной из ошибок Gmail, описанных здесь.

person Bill Shannon    schedule 08.08.2013
comment
Мы используем java-gmail-imap-1.4.4-gm-ext-0.5.jar из code.google.com/p/java-gmail-imap - person Saqib Ali; 08.08.2013
comment
Вам следует подумать о переходе на версию JavaMail 1.4.7 или 1.5.0, которая включает поддержку функций Gmail. Если вам нужна помощь в определении того, является ли это ошибкой Gmail, опубликуйте трассировку протокола здесь или пришлите мне по адресу [email protected]. - person Bill Shannon; 09.08.2013
comment
совместим ли JavaMail 1.5.0 с java-gmail-imap-1.4.4-gm-ext-0.5.jar? Сколько изменений кода потребуется? - person Saqib Ali; 10.08.2013
comment
Я не знаю, я не рассматривал это подробно, но, судя по ссылке выше, это не должно требовать больших изменений кода. Начните здесь. - person Bill Shannon; 10.08.2013

Мне удалось успешно использовать этот метод. Короче говоря, если ваш Message имеет тип 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;
            }
        }
    } 
person Utku Özdemir    schedule 14.08.2014
comment
У меня также было такое же исключение для message.getContentType(), если сообщение было подписано цифровой подписью. Сервер IMAP был Exchange 2007. Я использую версию javaMail 1.5.4. - person Miklos Krivan; 17.07.2015

Известно, что GMail выдает неверные BODYSTRUCTURE ответы, см. напр. это сообщение от их представителя. В прошлый раз, когда я проверял (середина 2012 года), он оставался неисправленным.

person Jan Kundrát    schedule 08.08.2013

Другая возможность заключается в том, что файл, представляющий электронные письма, удаляется с почтового сервера вручную, что приводит к неправильному индексу (индексному файлу), созданному почтовым сервером. Это может вызвать ту же ошибку.

Я использовал Mail Enable, и решение состоит в том, чтобы удалить файл индекса (_index.xml в моем случае)

person Binod Kalathil    schedule 22.01.2020