1. 概述

在本教程中,我们将了解如何使用 Java 下载电子邮件附件。 为此,我们需要JavaMail API 。 JavaMail API 可以作为 Maven 依赖项或单独的 jar 提供。

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 和属性。带有附件的内容是一个名为 MultiPartBodyPart 如果电子邮件有任何附件,则其配置等于“ 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);
}

由于我们使用的 JavaMail API 版本高于 1.4,因此我们可以使用 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;
}  

5. 结论

本文展示了如何使用本机 JavaMail 库在 Java 中下载电子邮件附件。本教程的完整代码可 在 GitHub 上获取。