我想将邮件保留在数据库中。为了测试它,我尝试生成一些带有和不带有附件的测试MimeMessage对象。我添加附件如下:

MimeMessage message = new MimeMessage(Session.getDefaultInstance(props, null));
Multipart multipart = new MimeMultiPart();
MimeBodyPart bodyPart = new MimeBodyPart();

bodyPart.attachFile("./files/test.txt");
bodyPart.setFileName("test.txt");

multipart.addBodyPart(bodyPart);
message.setContent(multipart);
message.saveChanges();


现在,我想使用其writeTo(OutputStream)方法序列化此MimeMessage。该调用导致FileNotFoundException:

java.io.FileNotFoundException: ./files/test.txt: open failed: ENOENT (No such file or directory)


看来writeTo() -Method正在搜索附件。是否不应该通过测试数据生成器中的attachFile()调用将文件包含在MimeMessage-Object中?我是否需要对MimeMessage-Object进行某些操作才能将其序列化?

最佳答案

尝试使用File对象,您可以在其中检查该文件是否存在。

private static BodyPart createAttachment(filepath) {
    File file = new File(filepath);
    if (file.exists()) {
        DataSource source = new FileDataSource(file);
        DataHandler handler = new DataHandler(source);
        BodyPart attachment = new MimeBodyPart();
        attachment.setDataHandler(handler);
        attachment.setFileName(file.getName());
        return attachment;
    }
    return null; // or throw exception
}


我注意到您正在提供文件的相对路径(以点“。”开头)。仅当文件位于应用程序执行所在的同一目录(或您的情况下的子目录)中时,此方法才有效。尝试改用绝对路径。

10-01 21:59