JavaMail MimeBodyPart.SaveFile предоставляет поврежденные файлы

Я использую библиотеку JavaMail для синтаксического анализа сообщения mime электронной почты. Я пытаюсь извлечь прикрепленные файлы и сохранить их на локальный диск, но сохраненные файлы недействительны и их размер отличается от оригинала. только файл *.txt сохраняется нормально, а *.PDF или *.xlsx - нет. Не могли бы вы помочь мне исправить код?

Мой код:

private static void Test3() {
        String email_string = File_Reader.Read_File_To_String("D:\\8.txt");
        MimeMessage mm = Email_Parser.Get_MIME_Message_From_Email_String(email_string);

        Email_Parser.Save_Email_Attachments_To_Folder(mm,"D:\\TEST");
    }

public static String Read_File_To_String(String file_path) {
    byte[] encoded = new byte[0];

    try {
        encoded = Files.readAllBytes(Paths.get(file_path));
    } catch (IOException exception) {
        Print_To_Console(exception.getMessage(), true,false);
    }

    return new String(encoded, m_encoding);
}

public static MimeMessage Get_MIME_Message_From_Email_String(String email_string) {
    MimeMessage mm = null;

    try {
        Session s = Session.getDefaultInstance(new Properties());
        InputStream is = new ByteArrayInputStream(email_string.getBytes());
        mm = new MimeMessage(s, is);
    } catch (MessagingException exception) {
        Print_To_Console(exception.getMessage(), true, false);
    }
    return mm;
}

public static void Save_Email_Attachments_To_Folder(MimeMessage mm, String output_folder_path) {
        ArrayList<Pair<String, InputStream>> attachments_InputStreams = Get_Attachments_InputStream_From_MimeMessage(mm);
        String attachment_filename;
        String attachment_filename_save_path;
        InputStream attachment_InputStream;
        MimeBodyPart mbp;

        for (Pair<String, InputStream> attachments_InputStream : attachments_InputStreams) {
            attachment_filename = attachments_InputStream.getKey();
            attachment_filename = Get_Encoded_String(attachment_filename);
            attachment_filename_save_path = String.format("%s\\%s", output_folder_path, attachment_filename);
            attachment_InputStream = attachments_InputStream.getValue();

            try {
                mbp = new MimeBodyPart(attachment_InputStream);
                mbp.saveFile(attachment_filename_save_path);
            } catch (MessagingException | IOException exception) {
                Print_To_Console(exception.getMessage(), true, false);
            }
        }
    }

person Aviadjo    schedule 20.08.2014    source источник


Ответы (1)


Вы делаете что-то очень странное в Save_Email_Attachments_To_Folder. (Не говоря уже о странном соглашении об именах с использованием как верблюжьего регистра, так и подчеркивания. :-)) Я не знаю, какие входные потоки вы собираете, но создаете новые MimeBodyParts на их основе, а затем используете новый MimeBodyPart для сохранения вложения в файл почти наверняка не то, что вы хотите сделать.

Что именно делает Get_Attachments_InputStream_From_MimeMessage? Зачем перебирать сообщение, чтобы собрать кучу InputStreams, а затем перебирать InputStreams, чтобы сохранить их? Почему бы не пройтись по сообщению, чтобы найти вложения и сохранить их по мере нахождения с помощью метода MimeBodyPart.saveFile? Вы видели пример программы msgshow.java?

person Bill Shannon    schedule 20.08.2014
comment
Привет, спасибо за ваши комментарии. Get_Attachments_InputStream_From_MimeMessage просто сохраняет имена файлов и InputStreams в ArrayList. Я хотел сохранить файлы как входные потоки в ArrayList, потому что этот модуль является частью более крупной системы, и, вероятно, я передам ArrayList в другой модуль, чтобы позаботиться о них. Во всяком случае, я нашел здесь рабочее решение: development. nedeco.de/blog/2011/08/01/ Затем я взял этот код и заставил его работать рекурсивно, чтобы иметь дело с частью тела, которая сама по себе является составной. это сработало. - person Aviadjo; 21.08.2014