用 Java 下載電子郵件附件

1. 概述

在本教程中,我們將了解如何使用 Java 下載電子郵件附件。為此,我們需要 JavaMail API 。 JavaMail API 可作為
依賴項或作為單獨的 jars 使用。

2. JavaMail API 概述

JavaMail API 用於撰寫、發送和接收來自電子郵件服務器(如 Gmail)的電子郵件。它為使用抽像類和接口的電子郵件系統提供了一個框架。 API 支持大多數 RFC822 和 MIME Internet 消息傳遞協議,如 SMTP、POP、IMAP、MIME 和 NNTP。

3. JavaMail API 設置

我們需要在 Java 項目中添加 javax.mail Maven 依賴項以使用 JavaMail API:

<dependency>

 <groupId>com.sun.mail</groupId>

 <artifactId>javax.mail</artifactId>

 <version>1.6.2</version>

 </dependency>

4. 下載電子郵件附件

為了在 Java 中處理電子郵件,我們使用javax.mail包中Message類。 Message實現了javax.mail.Part接口。

Part接口具有BodyPart和屬性。帶有附件的內容是一個名為MultiPart BodyPart如果電子郵件有任何附件,則它的處置等於“ Part.ATTACHMENT ”。如果沒有附件,則處置為nullPart接口的getDisposition方法為我們獲取處置。

我們看一個基於Maven的簡單項目,以了解下載電子郵件附件的工作方式。我們將專注於下載電子郵件並將附件保存到磁盤。

我們的項目有一個實用程序,可以處理下載電子郵件並將它們保存到我們的磁盤。我們還顯示附件列表。

要下載附件,我們首先檢查內容類型是否具有多部分內容。如果是,我們可以進一步處理以檢查零件是否有任何附件。為了檢查內容類型,我們寫:

if (contentType.contains("multipart")) {

 //send to the download utility...

 }

如果我們有一個多部分,我們首先檢查它是否屬於Part.ATTACHMENT saveFile方法將文件保存到我們的目標文件夾。因此,在下載實用程序中,我們將檢查:

if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {

 String file = part.getFileName();

 part.saveFile(downloadDirectory + File.separator + part.getFileName());

 downloadedAttachments.add(file);

 }

由於我們使用的是高於 1.4 的 JavaMail API 版本,因此我們可以使用Part接口中saveFile方法。 saveFile方法適用於File像或String 。我們在示例中使用了一個字符串。此步驟將附件保存到我們指定的文件夾中。我們還維護一個顯示附件列表。

在 JavaMail API 1.4 版之前,我們必須使用FileStreamInputStream逐字節寫入整個文件。在我們的示例中,我們為 Gmail 帳戶使用了 Pop3 服務器。因此,要調用示例中的方法,我們需要一個有效的 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;

 }