1. Overview
In this tutorial, we take a look at how we can download email attachments using Java. For doing so, we need the JavaMail API. The JavaMail API is available as either a Maven dependency or as separate jars.
2. JavaMail API Overview
The JavaMail 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. JavaMail API Setup
We need to add the javax.mail Maven dependency in our Java project to use the JavaMail API:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
4. Download Email Attachments
For handling email in Java, we use the Message class from the javax.mail package. Message implements the javax.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());
downloadedAttachments.add(file);
}
Since we're using the JavaMail 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());
downloadedAttachments.add(file);
}
}
return downloadedAttachments;
}
5. Conclusion
This article showed how to download emails in Java using the native JavaMail library to download email attachments. The entire code for this tutorial is available over on over on GitHub.
The post Downloading Email Attachments in Java first appeared on Baeldung.