Не може да се зареди изключение 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