java 将文件从虚拟文件系统附加到电子邮件

java attach file from virtual filesystem to email

我正在使用虚拟文件系统,我想将其中的文件附加到电子邮件中。然而,MimeBodyPart 对象只接受文件,它不能在像 jimfs 这样的默认文件系统上工作。请参阅下面的代码,当我尝试转换为文件时出现 UnsupportedOperation 异常。

public Email attach(Path file){
    MimeBodyPart attachment = new MimeBodyPart()
    attachment.attachFile(file.toFile())
    attachments.add(attachment)
    return this
}

无论这个 MimeBodyPart API 是什么 都应该 可以选择使用 Path 这样你就可以使用 Jimfs直接提交文件,但是由于 java.nio.file API 需要 Java 7 并且不能在 Android 上工作,但遗憾的是许多库还不支持 Path

toFile() 永远无法用于 Jimfs 文件,或 任何不在默认文件系统上的 文件,因为 File class只能表示默认文件系统上的文件。所以是的,您需要将 Jimfs 文件复制到真实文件系统才能使用此 attachFile 方法。

如果 MimeBodyPart API 可以选择使用 URLURI 作为附件,您可能可以使用它加上 file.toUri()[.toURL()].或者,如果它可以使用 InputStream,您显然可以从文件中获取其中一个并改为使用它。

由于 jimfs 文件不是真正的文件,您不能使用文件 API。

一个简单的解决方法是使用 ByteArrayDataSource,这将复制数据。

更好的方法是编写您自己的类似于 FileDataSource but uses Files.newInputStream 的 PathDataSource,而不是 FileInputStream。然后使用以下方式附加文件:

MimeBodyPart mbp = new MimeBodyPart();
mbp.setDataHandler(new DataHandler(new PathDataSource(path)));
mbp.setFileName(path.getFileName().toString());
mbp.setDisposition(Part.ATTACHMENT);