2015-12-02 66 views
0

我想在數據庫中保存郵件。爲了測試它,我嘗試使用和不使用附件來生成一些測試MimeMessage對象。我添加附件像這樣:如何使用附件爲Java 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(); 

現在我想序列化此的MimeMessage其writeTo(OutputStream)方法。這一呼籲導致FileNotFoundException異常:

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

這似乎是writeTo() - 方法是搜索的附加文件。不應該通過我的測試數據生成器中的attachFile()-call來將文件包含在MimeMessage-Object中嗎?我需要使用MimeMessage-Object來做些什麼才能夠像這樣序列化它?

回答

1

嘗試使用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 
} 

我注意到你提供了一個文件的相對路徑(以點「。」開頭)。這隻有在文件位於應用程序執行所在的同一目錄(或您的案例中的子目錄)時纔有效。代替嘗試使用絕對路徑

+0

這就是問題,這很好但很奇怪。爲什麼writeTo()拋出這個異常,而不是attachFile()? – Ansichtssache

+0

我不知道。可能是因爲該文件在'writeTo(...)'之前從未真正被訪問過。一般來說,你不應該依賴這樣的事情。相反,在使用'file.exists()'的情況下,請自己檢查一下。 –

相關問題