Working with Emails and Attachments with Apache POI

Apache POI is a powerful Java library that allows you to work with Microsoft Office documents, including emails and attachments. In this tutorial, we will focus on working with emails and attachments using Apache POI.

Example Code

Before we delve into the details, let's take a look at a simple example of how to create an email with an attachment using Apache POI:

import org.apache.poi.hsmf.*;
import org.apache.poi.hsmf.datatypes.*;
import org.apache.poi.poifs.filesystem.*;

public class EmailAttachmentsExample {
  public static void main(String[] args) throws Exception {
    MAPIMessage msg = new MAPIMessage();
    msg.setSubject("Hello, world!");
    msg.setMessageDate(new MAPIProperty(MAPIProperty.PR_MESSAGE_DELIVERY_TIME, new Date()));
    msg.setConversationTopic("Test Email");
    msg.setSender(new MAPIProperty(MAPIProperty.PR_SENDER_NAME, "John Doe"));
    msg.setRecipient(RecipientType.TO, new MAPIProperty(MAPIProperty.PR_DISPLAY_NAME, "Jane Smith"));
    PropertySetFactory psf = new PropertySetFactory();
    AttachmentChunks attachment = new AttachmentChunks();
    attachment.attachData(new FileDataSource("attachment.pdf"));
    try (POIFSFileSystem fs = new POIFSFileSystem()) {
      fs.writeFilesystem(new File("output.msg"));

Step-by-Step Tutorial

  1. Create an instance of the MAPIMessage class, which represents an email.
  2. Set the properties of the email, such as subject, message class, date, conversation topic, sender, and recipient.
  3. Create a PropertySetFactory instance and set the property stream of the email using the createNew() method.
  4. Create an AttachmentChunks instance and set the attachment data, extension, filename, long filename, and attachment method.
  5. Add the attachment to the email using the addAttachment() method.
  6. Write the email to a file system using the POIFSFileSystem and writeFilesystem() methods.

Common Mistakes

  • Not setting the required properties for the email, such as subject, sender, and recipient.
  • Using incorrect attachment methods or unsupported attachment types.
  • Missing the necessary dependencies in the project's build configuration.
  • Not properly handling exceptions when working with emails and attachments.

Frequently Asked Questions (FAQs)

  1. Can I add multiple attachments to an email using Apache POI?

    Yes, you can add multiple attachments to an email by creating multiple AttachmentChunks instances and adding them using the addAttachment() method.

  2. Can I extract attachments from an email using Apache POI?

    Yes, you can extract attachments by iterating over the attachment properties of the MAPIMessage object and saving the attachment data to a file.

  3. Is it possible to retrieve the content of an email body using Apache POI?

    Yes, you can retrieve the email body content by accessing the appropriate properties of the MAPIMessage object, such as getTextBody() or getHtmlBody().

  4. Can I set the recipient's email address directly using Apache POI?

    No, Apache POI does not provide direct support for setting email addresses. You can set the recipient's display name using the setRecipient() method.

  5. Can Apache POI handle emails with different formats, such as HTML or RTF?

    Yes, Apache POI supports emails with different formats, including HTML and RTF. You can access the content in the desired format using appropriate methods.


In this tutorial, we have explored how to work with emails and attachments using Apache POI. We provided example code, explained the steps involved, highlighted common mistakes, and answered frequently asked questions. With this knowledge, you can now programmatically create and manipulate emails with attachments using Apache POI, enabling you to automate email-related tasks in your Java applications.