package org.apache.poi.hsmf.examples;
-import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
-import java.util.Iterator;
-import java.util.Map;
import org.apache.poi.hsmf.MAPIMessage;
+import org.apache.poi.hsmf.datatypes.AttachmentChunks;
import org.apache.poi.hsmf.exceptions.ChunkNotFoundException;
/**
* attachments.
*
* @author Bruno Girin
- *
*/
public class Msg2txt {
} catch (ChunkNotFoundException e) {
System.err.println("No message body");
}
- Map attachmentMap = msg.getAttachmentFiles();
- if(attachmentMap.size() > 0) {
+
+ AttachmentChunks[] attachments = msg.getAttachmentFiles();
+ if(attachments.length > 0) {
File d = new File(attDirName);
if(d.mkdir()) {
- for(
- Iterator ii = attachmentMap.entrySet().iterator();
- ii.hasNext();
- ) {
- Map.Entry entry = (Map.Entry)ii.next();
- processAttachment(d, entry.getKey().toString(),
- (ByteArrayInputStream)entry.getValue());
+ for(AttachmentChunks attachment : attachments) {
+ processAttachment(attachment, d);
}
} else {
System.err.println("Can't create directory "+attDirName);
/**
* Processes a single attachment: reads it from the Outlook MSG file and
* writes it to disk as an individual file.
- *
+ *
+ * @param attachment the chunk group describing the attachment
* @param dir the directory in which to write the attachment file
- * @param fileName the name of the attachment file
- * @param fileIn the input stream that contains the attachment's data
* @throws IOException when any of the file operations fails
*/
- public void processAttachment(File dir, String fileName,
- ByteArrayInputStream fileIn) throws IOException {
+ public void processAttachment(AttachmentChunks attachment,
+ File dir) throws IOException {
+ String fileName = attachment.attachFileName.toString();
+ if(attachment.attachLongFileName != null) {
+ fileName = attachment.attachLongFileName.toString();
+ }
+
File f = new File(dir, fileName);
OutputStream fileOut = null;
try {
fileOut = new FileOutputStream(f);
- byte[] buffer = new byte[2048];
- int bNum = fileIn.read(buffer);
- while(bNum > 0) {
- fileOut.write(buffer);
- bNum = fileIn.read(buffer);
- }
+ fileOut.write(attachment.attachData.getValue());
} finally {
- try {
- if(fileIn != null) {
- fileIn.close();
- }
- } finally {
- if(fileOut != null) {
- fileOut.close();
- }
+ if(fileOut != null) {
+ fileOut.close();
}
}
}
package org.apache.poi.hsmf.parsers;
import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.IOException;
+import org.apache.poi.hsmf.MAPIMessage;
+import org.apache.poi.hsmf.datatypes.AttachmentChunks;
+import org.apache.poi.hsmf.datatypes.ChunkGroup;
+import org.apache.poi.hsmf.datatypes.Chunks;
+import org.apache.poi.hsmf.datatypes.NameIdChunks;
+import org.apache.poi.hsmf.datatypes.RecipientChunks;
+import org.apache.poi.hsmf.exceptions.ChunkNotFoundException;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.POIDataSamples;
new FileInputStream(samples.getFile("attachment_test_msg.msg"))
);
POIFSFileSystem without = new POIFSFileSystem(
- new FileInputStream(samples.getFile("simple_test_msg.msg"))
+ new FileInputStream(samples.getFile("quick.msg"))
);
+ AttachmentChunks attachment;
+
+
+ // Check raw details on the one with
+ with.getRoot().getEntry("__attach_version1.0_#00000000");
+ with.getRoot().getEntry("__attach_version1.0_#00000001");
+ POIFSChunkParser.parse(with.getRoot());
+
+ ChunkGroup[] groups = POIFSChunkParser.parse(with.getRoot());
+ assertEquals(5, groups.length);
+ assertTrue(groups[0] instanceof Chunks);
+ assertTrue(groups[1] instanceof RecipientChunks);
+ assertTrue(groups[2] instanceof AttachmentChunks);
+ assertTrue(groups[3] instanceof AttachmentChunks);
+ assertTrue(groups[4] instanceof NameIdChunks);
+
+ attachment = (AttachmentChunks)groups[2];
+ assertEquals("TEST-U~1.DOC", attachment.attachFileName.toString());
+ assertEquals("test-unicode.doc", attachment.attachLongFileName.toString());
+ assertEquals(24064, attachment.attachData.getValue().length);
+
+ attachment = (AttachmentChunks)groups[3];
+ assertEquals("pj1.txt", attachment.attachFileName.toString());
+ assertEquals("pj1.txt", attachment.attachLongFileName.toString());
+ assertEquals(89, attachment.attachData.getValue().length);
+
+
+ // Check raw details on one without
+ try {
+ without.getRoot().getEntry("__attach_version1.0_#00000000");
+ fail();
+ } catch(FileNotFoundException e) {}
+ try {
+ without.getRoot().getEntry("__attach_version1.0_#00000001");
+ fail();
+ } catch(FileNotFoundException e) {}
+
- // Check details on the one with
-
// One with, from the top
+ MAPIMessage msgWith = new MAPIMessage(with);
+ assertEquals(2, msgWith.getAttachmentFiles().length);
+
+ attachment = msgWith.getAttachmentFiles()[0];
+ assertEquals("TEST-U~1.DOC", attachment.attachFileName.toString());
+ assertEquals("test-unicode.doc", attachment.attachLongFileName.toString());
+ assertEquals(24064, attachment.attachData.getValue().length);
+
+ attachment = msgWith.getAttachmentFiles()[1];
+ assertEquals("pj1.txt", attachment.attachFileName.toString());
+ assertEquals("pj1.txt", attachment.attachLongFileName.toString());
+ assertEquals(89, attachment.attachData.getValue().length);
+
+ // Plus check core details are there
+ try {
+ assertEquals("'nicolas1.23456@free.fr'", msgWith.getDisplayTo());
+ assertEquals("Nicolas1 23456", msgWith.getDisplayFrom());
+ assertEquals("test pi\u00e8ce jointe 1", msgWith.getSubject());
+ } catch(ChunkNotFoundException e) {
+ fail();
+ }
+
// One without, from the top
+ MAPIMessage msgWithout = new MAPIMessage(without);
+
+ // No attachments
+ assertEquals(0, msgWithout.getAttachmentFiles().length);
+
+ // But has core details
+ try {
+ assertEquals("Kevin Roast", msgWithout.getDisplayTo());
+ assertEquals("Kevin Roast", msgWithout.getDisplayFrom());
+ assertEquals("Test the content transformer", msgWithout.getSubject());
+ } catch(ChunkNotFoundException e) {
+ fail();
+ }
}
}