Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaMail MimeBodyPart.SaveFile提供损坏的文件_File_Jakarta Mail_Corrupt - Fatal编程技术网

JavaMail MimeBodyPart.SaveFile提供损坏的文件

JavaMail MimeBodyPart.SaveFile提供损坏的文件,file,jakarta-mail,corrupt,File,Jakarta Mail,Corrupt,我正在使用JavaMail库解析电子邮件mime消息。 我正在尝试提取附加文件并将其保存到本地磁盘,但保存的文件无效,并且大小与原始文件不同。只有*.txt文件保存正常,但*.PDF或*.xlsx文件不保存。 你能帮我修一下密码吗 我的代码是: private static void Test3() { String email_string = File_Reader.Read_File_To_String("D:\\8.txt"); MimeMessage m

我正在使用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);
            }
        }
    }
private static void Test3(){
字符串email\u String=文件读取器。将文件读入字符串(“D:\\8.txt”);
MimeMessage mm=电子邮件解析器。从电子邮件字符串(电子邮件字符串)获取MIME消息;
电子邮件解析器。将电子邮件附件保存到文件夹(mm,“D:\\TEST”);
}
公共静态字符串读取文件到字符串(字符串文件路径){
字节[]编码=新字节[0];
试一试{
encoded=Files.readAllBytes(path.get(file_path));
}捕获(IOException异常){
打印到控制台(exception.getMessage(),true,false);
}
返回新字符串(已编码,m_编码);
}
公共静态MimeMessage从电子邮件获取MIME消息字符串(字符串电子邮件字符串){
mimessage mm=null;
试一试{
会话s=Session.getDefaultInstance(新属性());
InputStream is=newbytearrayinputstream(email_string.getBytes());
mm=新的MIME消息;
}捕获(MessaginException异常){
打印到控制台(exception.getMessage(),true,false);
}
返回mm;
}
公共静态无效保存\电子邮件\附件\到\文件夹(MimeMessage mm,字符串输出\文件夹\路径){
ArrayList attachments_InputStreams=从MimeMessage获取_attachments_InputStream_(mm);
字符串附件_文件名;
字符串附件\文件名\保存\路径;
输入流附件\输入流;
MimeBodyPart mbp;
对于(成对附件\u输入流:附件\u输入流){
附件\文件名=附件\ InputStream.getKey();
附件\文件名=获取\编码\字符串(附件\文件名);
附件\文件名\保存\路径=String.format(“%s\\%s”,输出\文件夹\路径,附件\文件名);
attachment_InputStream=attachments_InputStream.getValue();
试一试{
mbp=新的MimeBodyPart(附件\输入流);
mbp.saveFile(附件\文件名\保存\路径);
}捕获(MessaginException | IOException){
打印到控制台(exception.getMessage(),true,false);
}
}
}

您在Save\u Email\u Attachments\u To\u文件夹中执行了一些非常奇怪的操作。(更不用说使用驼峰大小写和下划线的奇怪命名约定了。:-)我不知道您正在收集的InputStreams是什么,但基于它们构建新的MimeBodyPart,然后使用新的MimeBodyPart将附件保存到文件中几乎肯定不是您想要做的事情


从MimeMessage获取附件输入流究竟在做什么?为什么要迭代消息以收集一组InputStreams,然后迭代InputStreams以保存它们?为什么不迭代消息以查找附件,并使用MimeBodyPart.saveFile方法将其保存为您找到的附件?你看了吗?

嗨,谢谢你的评论。Get_Attachments_InputStream_From_MimeMessage只是将文件名和InputStreams存储在ArrayList中。我想将文件保存为ArrayList中的输入流,因为这个模块是更大系统的一部分,我可能会将ArrayList传递给另一个模块来处理它们。不管怎么说,我在这里找到了一个可行的解决方案:然后我使用该代码并使其递归工作,以便处理bodypart,它本身就是一个多部分。成功了。