aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYegor Kozlov <yegor@apache.org>2009-10-04 10:25:53 +0000
committerYegor Kozlov <yegor@apache.org>2009-10-04 10:25:53 +0000
commit31236d1bd5b343fda6076865209cdc843489b6a8 (patch)
tree5af1566ddc47b7315840a48a4801a01c862943f3 /src
parent5d3d269fafce8670563c1f552e3cad6dd7427fa4 (diff)
downloadpoi-31236d1bd5b343fda6076865209cdc843489b6a8.tar.gz
poi-31236d1bd5b343fda6076865209cdc843489b6a8.zip
added Ant target to compile scratchpad examples, added example HSMF application that converts a .msg file to text and extracts attachments, see Bugzilla 47922
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@821500 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r--src/documentation/content/xdocs/status.xml2
-rw-r--r--src/scratchpad/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java185
2 files changed, 187 insertions, 0 deletions
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml
index a84c71bfb9..fc951bf2b9 100644
--- a/src/documentation/content/xdocs/status.xml
+++ b/src/documentation/content/xdocs/status.xml
@@ -33,6 +33,8 @@
<changes>
<release version="3.6-beta1" date="2009-??-??">
+ <action dev="POI-DEVELOPERS" type="add">47922 - added example HSMF application that converts a .msg file to text and extracts attachments</action>
+ <action dev="POI-DEVELOPERS" type="add">47903 - added Ant target to compile scratchpad examples</action>
<action dev="POI-DEVELOPERS" type="add">47839 - improved API for OOXML custom properties</action>
<action dev="POI-DEVELOPERS" type="fix">47862 - fixed XSSFSheet.setColumnWidth to handle columns included in a column span</action>
<action dev="POI-DEVELOPERS" type="fix">47804 - fixed XSSFSheet.setColumnHidden to handle columns included in a column span</action>
diff --git a/src/scratchpad/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java b/src/scratchpad/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java
new file mode 100644
index 0000000000..546334bdaf
--- /dev/null
+++ b/src/scratchpad/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java
@@ -0,0 +1,185 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+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.exceptions.ChunkNotFoundException;
+
+/**
+ * Reads one or several Outlook MSG files and for each of them creates
+ * a text file from available chunks and a directory that contains
+ * attachments.
+ *
+ * @author Bruno Girin
+ *
+ */
+public class Msg2txt {
+
+ /**
+ * The stem used to create file names for the text file and the directory
+ * that contains the attachments.
+ */
+ private String fileNameStem;
+
+ /**
+ * The Outlook MSG file being processed.
+ */
+ private MAPIMessage msg;
+
+ public Msg2txt(String fileName) throws IOException {
+ fileNameStem = fileName;
+ if(fileNameStem.endsWith(".msg") || fileNameStem.endsWith(".MSG")) {
+ fileNameStem = fileNameStem.substring(0, fileNameStem.length() - 4);
+ }
+ msg = new MAPIMessage(fileName);
+ }
+
+ /**
+ * Processes the message.
+ *
+ * @throws IOException if an exception occurs while writing the message out
+ */
+ public void processMessage() throws IOException {
+ String txtFileName = fileNameStem + ".txt";
+ String attDirName = fileNameStem + "-att";
+ PrintWriter txtOut = null;
+ try {
+ txtOut = new PrintWriter(txtFileName);
+ try {
+ String displayFrom = msg.getDisplayFrom();
+ txtOut.println("From: "+displayFrom);
+ } catch (ChunkNotFoundException e) {
+ // ignore
+ }
+ try {
+ String displayTo = msg.getDisplayTo();
+ txtOut.println("To: "+displayTo);
+ } catch (ChunkNotFoundException e) {
+ // ignore
+ }
+ try {
+ String displayCC = msg.getDisplayCC();
+ txtOut.println("CC: "+displayCC);
+ } catch (ChunkNotFoundException e) {
+ // ignore
+ }
+ try {
+ String displayBCC = msg.getDisplayBCC();
+ txtOut.println("BCC: "+displayBCC);
+ } catch (ChunkNotFoundException e) {
+ // ignore
+ }
+ try {
+ String subject = msg.getSubject();
+ txtOut.println("Subject: "+subject);
+ } catch (ChunkNotFoundException e) {
+ // ignore
+ }
+ try {
+ String body = msg.getTextBody();
+ txtOut.println(body);
+ } catch (ChunkNotFoundException e) {
+ System.err.println("No message body");
+ }
+ Map attachmentMap = msg.getAttachmentFiles();
+ if(attachmentMap.size() > 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());
+ }
+ } else {
+ System.err.println("Can't create directory "+attDirName);
+ }
+ }
+ } finally {
+ if(txtOut != null) {
+ txtOut.close();
+ }
+ }
+ }
+
+ /**
+ * Processes a single attachment: reads it from the Outlook MSG file and
+ * writes it to disk as an individual file.
+ *
+ * @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 {
+ 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);
+ }
+ } finally {
+ try {
+ if(fileIn != null) {
+ fileIn.close();
+ }
+ } finally {
+ if(fileOut != null) {
+ fileOut.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * Processes the list of arguments as a list of names of Outlook MSG files.
+ *
+ * @param args the list of MSG files to process
+ */
+ public static void main(String[] args) {
+ if(args.length <= 0) {
+ System.err.println("No files names provided");
+ } else {
+ for(int i = 0; i < args.length; i++) {
+ try {
+ Msg2txt processor = new Msg2txt(args[i]);
+ processor.processMessage();
+ } catch (IOException e) {
+ System.err.println("Could not process "+args[i]+": "+e);
+ }
+ }
+ }
+ }
+
+}