Return-Path: Delivered-To: apmail-poi-commits-archive@minotaur.apache.org Received: (qmail 61588 invoked from network); 4 Oct 2009 10:26:18 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 4 Oct 2009 10:26:18 -0000 Received: (qmail 28644 invoked by uid 500); 4 Oct 2009 10:26:18 -0000 Delivered-To: apmail-poi-commits-archive@poi.apache.org Received: (qmail 28610 invoked by uid 500); 4 Oct 2009 10:26:18 -0000 Mailing-List: contact commits-help@poi.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@poi.apache.org Delivered-To: mailing list commits@poi.apache.org Received: (qmail 28601 invoked by uid 99); 4 Oct 2009 10:26:18 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 04 Oct 2009 10:26:18 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 04 Oct 2009 10:26:15 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 2DD9F238888F; Sun, 4 Oct 2009 10:25:54 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r821500 - in /poi/trunk: ./ src/documentation/content/xdocs/ src/scratchpad/examples/src/org/apache/poi/hsmf/ src/scratchpad/examples/src/org/apache/poi/hsmf/examples/ Date: Sun, 04 Oct 2009 10:25:54 -0000 To: commits@poi.apache.org From: yegor@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091004102554.2DD9F238888F@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: yegor Date: Sun Oct 4 10:25:53 2009 New Revision: 821500 URL: http://svn.apache.org/viewvc?rev=821500&view=rev Log: added Ant target to compile scratchpad examples, added example HSMF application that converts a .msg file to text and extracts attachments, see Bugzilla 47922 Added: poi/trunk/src/scratchpad/examples/src/org/apache/poi/hsmf/ poi/trunk/src/scratchpad/examples/src/org/apache/poi/hsmf/examples/ poi/trunk/src/scratchpad/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java Modified: poi/trunk/build.xml poi/trunk/src/documentation/content/xdocs/status.xml Modified: poi/trunk/build.xml URL: http://svn.apache.org/viewvc/poi/trunk/build.xml?rev=821500&r1=821499&r2=821500&view=diff ============================================================================== --- poi/trunk/build.xml (original) +++ poi/trunk/build.xml Sun Oct 4 10:25:53 2009 @@ -27,6 +27,7 @@ Modified by: Rainer Klute klute@rainer-klute.de + Bruno Girin brunogirin@gmail.com This build was tested with ant 1.6.2 although it will probably work with other versions. The following jar files should be available on the @@ -110,6 +111,10 @@ + + + + @@ -273,6 +278,7 @@ + @@ -423,8 +429,8 @@ + compile-scratchpad, compile-contrib, compile-examples, compile-scratchpad-examples" + description="Compiles the POI main classes, scratchpad, contrib, examples, and scratchpad examples"/> @@ -508,6 +514,19 @@ + + + + + + + + + + + Modified: poi/trunk/src/documentation/content/xdocs/status.xml URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=821500&r1=821499&r2=821500&view=diff ============================================================================== --- poi/trunk/src/documentation/content/xdocs/status.xml (original) +++ poi/trunk/src/documentation/content/xdocs/status.xml Sun Oct 4 10:25:53 2009 @@ -33,6 +33,8 @@ + 47922 - added example HSMF application that converts a .msg file to text and extracts attachments + 47903 - added Ant target to compile scratchpad examples 47839 - improved API for OOXML custom properties 47862 - fixed XSSFSheet.setColumnWidth to handle columns included in a column span 47804 - fixed XSSFSheet.setColumnHidden to handle columns included in a column span Added: poi/trunk/src/scratchpad/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java?rev=821500&view=auto ============================================================================== --- poi/trunk/src/scratchpad/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java (added) +++ poi/trunk/src/scratchpad/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java Sun Oct 4 10:25:53 2009 @@ -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); + } + } + } + } + +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org For additional commands, e-mail: commits-help@poi.apache.org