Read an Outlook MSG file

When Outlook Express saves an email, it uses the EML format which is a good thing because the format is a standard.

But Outlook (not the Express but the one with Office) can only save an email with the MSG format which is Microsoft specific.

1. Apache POI HSMF

http://poi.apache.org/hsmf/

HSMF is the POI Project’s pure Java implementation of the Outlook MSG format.

This example takes an MSG file and extracts the attachment(s).

POI 3.6:

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;

// You need poi-scratchpad-3.6  and poi-3.6 ( http://poi.apache.org/ )

public class DetectMSGAttachment {
  public static void main (String ... args) throws IOException {
    String msgfile = "c:/temp/messagewithattachment.msg";
    MAPIMessage msg = new MAPIMessage(msgfile);
    Map attachmentMap = msg.getAttachmentFiles();
    if(attachmentMap.size() > 0) {
      for (Iterator ii = attachmentMap.entrySet().iterator(); ii.hasNext();) {
        Map.Entry entry = (Map.Entry)ii.next();
        String attachmentfilename = entry.getKey().toString();
        System.out.println(attachmentfilename);

        // extract attachment
        ByteArrayInputStream fileIn = (ByteArrayInputStream)entry.getValue();
        File f = new File("c:/temp", attachmentfilename); // output
        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();
            }
          }
        }
      }
    }
    else {
      System.out.println("No attachment");
    }
  }
}

POI 3.7:

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.hdgf.chunks.Chunk;
import org.apache.poi.hsmf.MAPIMessage;
import org.apache.poi.hsmf.datatypes.AttachmentChunks;
import org.apache.poi.hsmf.datatypes.Chunks;
import org.apache.poi.hsmf.exceptions.ChunkNotFoundException;

// You need poi-scratchpad-3.7  and poi-3.7 ( http://poi.apache.org/ )
public class DetectMSGAttachment {
    public static void main (String ... args) throws IOException {
        String msgfile = "c:/temp/messagewithattachment.msg";
        MAPIMessage msg = new MAPIMessage(msgfile);
        AttachmentChunks attachments[] = msg.getAttachmentFiles();
        if(attachments.length > 0) {
            for (AttachmentChunks a  : attachments) {
                System.out.println(a.attachLongFileName);
                // extract attachment
                ByteArrayInputStream fileIn = new ByteArrayInputStream(a.attachData.getValue());
                File f = new File("c:/temp", a.attachLongFileName.toString()); // output
                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();
                        }
                    }
                }
            }
        }
        else {

            System.out.println("No attachment");
        }
    }
}

2. Using msgparser library

http://auxilii.com/msgparser/

msgparser is a small open-source Java library that parses Outlook .msg files and provides their content using Java objects. msgparser uses the Apache POI – POIFS library to parse the message files which use the OLE 2 Compound Document format.

import java.util.List;
import com.auxilii.msgparser.*;
import com.auxilii.msgparser.attachment.*;

public class SimpleMsgParser {
  public static void main(String[] args) throws Exception{
    MsgParser msgp = new MsgParser();
    Message msg = msgp.parseMsg("c:/temp/test2.msg");

    String fromEmail = msg.getFromEmail();
    String fromName = msg.getFromName();
    String subject = msg.getSubject();
    String body = msg.getBodyText();

    System.out.println("From :" + fromName + " <" + fromEmail + ">");
    System.out.println("Subject :" + subject);
    System.out.println("");
    System.out.println(body);
    System.out.println("");

    List atts = msg.getAttachments();
    for (Attachment att : atts) {
      if (att instanceof FileAttachment) {
        FileAttachment file = (FileAttachment) att;
        System.out.println("Attachment : " + file.getFilename());
        // you get the actual attachment with
        // byte date[] = file.getData();
      }
    }
  }
}

3. Using jmbox

https://jmbox.dev.java.net/

The jmbox project (read jambox) is a Local Store Provider for JavaMail, enabling developers to use JavaMail api to manage the mail stored in local repositories like Outlook Express, Mozilla, Netscape etc.

At the moment are supported navigation and reading from Outlook Express 5/6 mail (dbx format).

Done! Happy Coding!

Related posts:

Tìm hiểu về xác thực và phân quyền trong ứng dụng
Hướng dẫn sử dụng lớp Console trong java
Java Program to Implement Tarjan Algorithm
Composition, Aggregation, and Association in Java
Từ khóa static và final trong java
Java Program to Implement Branch and Bound Method to Perform a Combinatorial Search
Java Program to Implement Sorted Doubly Linked List
Java Program to Emulate N Dice Roller
Easy Ways to Write a Java InputStream to an OutputStream
Java Program to Perform Addition Operation Using Bitwise Operators
Using Spring @ResponseStatus to Set HTTP Status Code
How to Read a File in Java
Rate Limiting in Spring Cloud Netflix Zuul
Getting Started with GraphQL and Spring Boot
Anonymous Classes in Java
Send email with JavaMail
Một số tính năng mới về xử lý ngoại lệ trong Java 7
Java Program to Check Whether a Given Point is in a Given Polygon
How to Delay Code Execution in Java
Giới thiệu Java Service Provider Interface (SPI) – Tạo các ứng dụng Java dễ mở rộng
Hướng dẫn Java Design Pattern – Service Locator
Java Program to Perform Searching Using Self-Organizing Lists
Using Java Assertions
Interface trong Java 8 – Default method và Static method
Converting Between an Array and a Set in Java
Java Program to Implement Jarvis Algorithm
Spring Boot: Customize Whitelabel Error Page
Java Program to Find Whether a Path Exists Between 2 Given Nodes
Java Program to Implement a Binary Search Tree using Linked Lists
Convert char to String in Java
The XOR Operator in Java
Java Program to Implement Max-Flow Min-Cut Theorem