1. Overview

In this tutorial, we take a look at how we can download email attachments using Java. For doing so, we need the Java Mail API. The Java Mail API is available as either a Maven dependency or as separate jars.

2. Jakarta Mail API Overview

The Angus Mail library provides an implementation of the Jakarta Mail API specification, which is a successor of the Java Mail API.

This API is used to compose, send, and receive emails from an email server like Gmail. It provides a framework for an email system using abstract classes and interfaces. The API supports most RFC822 and MIME Internet messaging protocols like SMTP, POP, IMAP, MIME, and NNTP.

3. Jakarta Mail API Setup

We need to add the angus-mail Maven dependency in our Java project:


4. Download Email Attachments

For handling email in Java, we use the Message class from the jakarta.mail package. Message implements the jakarta.mail.Part interface.

The Part interface has BodyPart and attributes. The content with attachments is a BodyPart called MultiPart. If an email has any attachments, it has a disposition equal to “Part.ATTACHMENT“. In case there are no attachments, the disposition is null. The getDisposition method from the Part interface gets us the disposition.

We look at a simple Maven-based project to understand how downloading email attachments work. We’ll concentrate on getting the emails to download and saving attachments to the disk.

Our project has a utility that deals with downloading emails and saving them to our disk. We’re also displaying the list of attachments.

To download the attachment(s), we first check if the content type has multipart content or not. If yes, we can process it further to check if the part has any attachments. To check the content type, we write:

if (contentType.contains("multipart")) {
    //send to the download utility...

If we have a multipart, we first check if it is of the type Part.ATTACHMENT and, if it is, we save the file to our destination folder using the saveFile method. So, in the download utility, we would check:

if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
    String file = part.getFileName();
    part.saveFile(downloadDirectory + File.separator + part.getFileName());

Since we’re using the Java Mail API version greater than 1.4, we can use the saveFile method from the Part interface. The saveFile method works with either a File object or a String. We have used a string in the example. This step saves the attachments to the folder we specify. We also maintain a list of attachments for the display.

Before the JavaMail API version 1.4, we had to write the entire file byte by byte using FileStream and InputStream. In our example, we’ve used a Pop3 server for a Gmail account. So, to call the method in the example, we need a valid Gmail username and password and a folder to download attachments.

Let’s see the example code for downloading attachments and saving them to disk:

public List<String> downloadAttachments(Message message) throws IOException, MessagingException {
    List<String> downloadedAttachments = new ArrayList<String>();
    Multipart multiPart = (Multipart) message.getContent();
    int numberOfParts = multiPart.getCount();
    for (int partCount = 0; partCount < numberOfParts; partCount++) {
        MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount);
        if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
            String file = part.getFileName();
            part.saveFile(downloadDirectory + File.separator + part.getFileName());
    return downloadedAttachments;

5. Conclusion

This article showed how to download emails in Java using the Jakarta Mail API to download email attachments.

The entire code for this tutorial is available over on over on GitHub.

Course – LS (cat=Java)
announcement - icon

Get started with Spring Boot and with core Spring, through the Learn Spring course:


res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.