Ошибка чтения вложений из файла eml с использованием Java Mail API

Код, который преобразует файлы .eml в MimeMessages и сохраняет вложения и встроенные изображения в файлы:

           // fileList contains paths to eml files    
           for (File file : fileList) {
                MimeMessage mail = Utility.mailFromFile(file);
                if (mail == null) {
                    os.println("Error: " + file.getAbsolutePath()
                            + " has an unsupported format.");
                    continue;
                }
                try {
                    MimeBodyPart bPart = (MimeBodyPart) content.getBodyPart(i);
                    for (int i = 0; i < content.getCount(); i++) {
                        BodyPart bPart = content.getBodyPart(i);
                                        // sort out messages but include inline images
                        if (bPart.getFileName() == null) {
                            continue;
                        }
                                        String savePath = outputDirectory.getAbsolutePath() + "\\" + bPart.getFileName();
                        File f = new File(savePath);
                                            // generate new file name in case file already exists
                        f = Utility.getSaveFile(f);
                        bPart.saveFile(f);
                    }
                } catch (Exception ex) {
                    os.println("Error: " + ex.getMessage());
                    continue;
                }
            }

Это работает для большинства файлов eml, но иногда я получаю следующее исключение:

Error: BASE64Decoder: Error in encoded stream: needed 4 valid base64 characters but only got 2 before EOF, the 10 most recent characters were: "GJMIX5FF\r\n"

И сохраненный файл пустой. Файлы eml были сгенерированы Mozilla Thunderbird. Как предотвратить возникновение этого исключения? Вложения определенно есть и действительные файлы фильмов/изображений.

Изменить: теперь используется метод saveFile.

Изменить: похоже, что в файлах действительно отсутствуют некоторые части. Итак, возникла проблема при отправке или загрузке почты.


person Kazuo    schedule 10.02.2013    source источник
comment
ссылка ниже пользователя может быть полезна для вас тело с использованием java">stackoverflow.com/questions/13358134/   -  person Lucky    schedule 12.02.2013


Ответы (1)


Мне нужно было бы увидеть все сообщение, чтобы увидеть, действительно ли есть ошибка кодирования base64.

Какую версию JavaMail вы используете? В старых версиях было несколько ошибок в этой области.

В вашем коде есть одна серьезная ошибка, которая может быть связана или не связана с ошибкой, которую вы видите. Как описано в javadocs для метода Part.getSize. он может не вернуть точный размер части. Вы должны читать данные из InputStream до EOF. Или, что еще лучше, используйте Метод MimeBodyPart.saveFile.

person Bill Shannon    schedule 10.02.2013
comment
Спасибо за ответ. Раньше я читал из потока, не полагаясь на размер части, но возникла та же проблема. Теперь я использую метод MimeBodyPart.saveFile, как вы предложили. По-прежнему возникает та же ошибка, и экспортированные файлы повреждены. Интересно то, что Thunderbird прекрасно отображает изображения, в то время как на экспортированной фотографии, например, отсутствуют пиксели внизу. Онлайн-декодеры Base64 показывают сообщение об ошибке Неверная длина массива символов Base-64. Пример изображения: ссылка - person Kazuo; 10.02.2013
comment
Похоже, в файлах действительно отсутствуют некоторые части. Итак, возникла проблема при отправке или загрузке почты. Thunderbird просто обрезал изображение над отсутствующими пикселями, чтобы изображение выглядело законченным. Спасибо за ответ. - person Kazuo; 10.02.2013