使用Java Mail API从eml文件读取附件时出错

使用Java Mail API从eml文件读取附件时出错,java,email,base64,jakarta-mail,eml,Java,Email,Base64,Jakarta Mail,Eml,将.eml文件转换为mimessage并将附件和内联图像保存到文件的代码: // fileList contains paths to eml files for (File file : fileList) { MimeMessage mail = Utility.mailFromFile(file); if (mail == null) {

将.eml文件转换为mimessage并将附件和内联图像保存到文件的代码:

           // 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文件由Mozilla Thunderbird生成。 如何防止发生此异常?附件确实存在,并且是有效的电影/图像文件

编辑:现在使用saveFile方法


编辑:看起来文件确实缺少一些部分。因此,在发送或下载邮件时出现问题。

我需要查看整个邮件,以查看是否确实存在base64编码错误

您使用的是什么版本的JavaMail?在旧版本中,这方面有一些bug


代码中有一个严重错误,可能与您看到的错误有关,也可能与此无关。如中所述,它可能无法返回零件的确切尺寸。您应该从InputStream读取数据,直到EOF。或者更好的方法是使用。

谢谢您的回答。我以前确实在不依赖零件尺寸的情况下读取了流,但同样的问题也发生了。我现在按照您的建议使用MimeBodyPart.saveFile方法。仍然会发生相同的错误,并且导出的文件已损坏。有趣的是,Thunderbird显示的图像很好,而导出的照片底部缺少像素。在线Base64解码器显示错误消息“Base-64字符数组的长度无效”。示例图像:文件似乎确实缺少某些部分。因此,在发送或下载邮件时出现了问题。Thunderbird刚刚将缺失像素上方的图像切掉,这样图像看起来就完整了。谢谢你的回答。下面的链接可能对你有用
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"