Перейти к основному содержимому

Загрузка вложений электронной почты в Java

· 3 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим, как мы можем загружать вложения электронной почты с помощью Java. Для этого нам понадобится JavaMail API . API JavaMail доступен либо как зависимость Maven, либо как отдельные файлы jar.

2. Обзор API JavaMail

JavaMail API используется для составления, отправки и получения электронных писем с почтового сервера, такого как Gmail. Он обеспечивает основу для системы электронной почты с использованием абстрактных классов и интерфейсов. API поддерживает большинство протоколов обмена сообщениями в Интернете RFC822 и MIME, таких как SMTP, POP, IMAP, MIME и NNTP.

3. Настройка API JavaMail

Нам нужно добавить зависимость javax.mail Maven в наш проект Java, чтобы использовать JavaMail API:

<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>

4. Загрузите вложения электронной почты

Для обработки электронной почты в Java мы используем класс Message из пакета javax.mail . Сообщение реализует интерфейс javax.mail.Part .

Интерфейс Part имеет BodyPart и атрибуты. Содержимое с вложениями — это BodyPart , который называется MultiPart . Если электронное письмо имеет какие-либо вложения , оно имеет расположение, равное « Part.ATTACHMENT ». Если вложений нет, диспозиция равна null . Метод getDisposition из интерфейса Part получает расположение.

Мы рассмотрим простой проект на основе Maven, чтобы понять, как работает загрузка вложений электронной почты. Мы сосредоточимся на загрузке электронных писем и сохранении вложений на диск.

В нашем проекте есть утилита, которая занимается загрузкой писем и сохранением их на наш диск. Мы также отображаем список вложений.

Чтобы загрузить вложения, мы сначала проверяем, является ли тип контента составным или нет. Если да, мы можем обработать его дальше, чтобы проверить, есть ли у детали какие-либо вложения. Для проверки типа контента пишем:

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

Если у нас есть multipart, мы сначала проверяем, имеет ли он тип Part.ATTACHMENT , и, если это так, мы сохраняем файл в нашу папку назначения, используя метод saveFile . Итак, в утилите загрузки мы бы проверили:

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

Поскольку мы используем версию JavaMail API выше 1.4, мы можем использовать метод saveFile из интерфейса Part . Метод saveFile работает либо с объектом File , либо со строкой . В примере мы использовали строку. Этот шаг сохраняет вложения в указанную нами папку. Мы также поддерживаем список вложений для отображения.

До JavaMail API версии 1.4 нам приходилось записывать весь файл байт за байтом, используя FileStream и InputStream . В нашем примере мы использовали сервер Pop3 для учетной записи Gmail. Итак, для вызова метода в примере нам нужны действительные имя пользователя и пароль Gmail, а также папка для загрузки вложений.

Давайте посмотрим пример кода для загрузки вложений и их сохранения на диск:

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. Вывод

В этой статье показано, как загружать электронные письма на Java с помощью собственной библиотеки JavaMail для загрузки вложений электронной почты. Весь код для этого руководства доступен снова и снова на GitHub .