aboutsummaryrefslogtreecommitdiffstats
path: root/poi-examples/src/main/java/org/apache/poi/examples/hsmf/Msg2txt.java
blob: 5b4d48f142cdf645a7dbb9d0d2feff35c166535c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/* ====================================================================
   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.examples.hsmf;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;

import org.apache.poi.hsmf.MAPIMessage;
import org.apache.poi.hsmf.datatypes.AttachmentChunks;
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.
 */
@SuppressWarnings({"java:S106","java:S4823"})
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";
        try (PrintWriter txtOut = new PrintWriter(txtFileName, StandardCharsets.UTF_8.name())) {
            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");
            }

            AttachmentChunks[] attachments = msg.getAttachmentFiles();
            if (attachments.length > 0) {
                File d = new File(attDirName);
                if (d.mkdir()) {
                    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
     * @throws IOException when any of the file operations fails
     */
    public void processAttachment(AttachmentChunks attachment,
          File dir) throws IOException {
       String fileName = attachment.getAttachFileName().toString();
       if(attachment.getAttachLongFileName() != null) {
          fileName = attachment.getAttachLongFileName().toString();
       }

        File f = new File(dir, fileName);
        try (OutputStream fileOut = new FileOutputStream(f)) {
            fileOut.write(attachment.getAttachData().getValue());
        }
    }

    /**
     * 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 (String arg : args) {
                try {
                    Msg2txt processor = new Msg2txt(arg);
                    processor.processMessage();
                } catch (IOException e) {
                    System.err.println("Could not process " + arg + ": " + e);
                }
            }
        }
    }

}