1. 概述

邮件管理开发中,经常需要操作邮件文件夹来组织、读取和管理邮件。使用JavaMail API可以轻松获取邮件账户中的可用文件夹列表。

本教程将探讨如何通过JavaMail API获取邮件账户中的可用文件夹列表。

2. 环境配置

首先需要在pom.xml中添加jakarta.mail依赖:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail-api</artifactId>
    <version>2.0.1</version>
</dependency>

JavaMail API是一组类和接口,为Java中读取和发送邮件提供框架。该库允许我们处理邮件相关任务,如连接邮件服务器和读取邮件内容。

3. 连接邮件服务器

getMailProperties()方法配置邮件会话属性,包括SMTP服务器的主机、端口、认证和TLS设置。该方法返回IMAP协议对应的属性:

Properties getMailProperties() {
    Properties properties = new Properties();
    properties.put("mail.store.protocol", "imap");
    properties.put("mail.imap.host", "imap.example.com");
    properties.put("mail.imap.port", "993");
    properties.put("mail.imap.ssl.enable", "true"); 
    return properties;
}

现在我们通过getMailProperties()方法获取属性。获得Session对象后,使用getStore()方法连接邮件服务器,返回Store对象:

public List<String> connectToMailServer(String email, String password) throws Exception {
    Properties properties = getMailProperties();

    Session session = Session.getDefaultInstance(properties);
    Store store = session.getStore();
    store.connect(email, password);

    List<String> availableFolders = retrieveAvailableFoldersUsingStore(store);
    store.close();
    return availableFolders;
}

成功连接邮件服务器后,下一步是使用retrieveAvailableFoldersUsingStore()方法获取可用文件夹列表并返回。

3.1. 连接Gmail服务器

连接Gmail服务器需要启用IMAP设置并创建应用专用密码。操作步骤:

  • 在"转发和POP/IMAP"标签页下确保IMAP已启用
  • 在侧边栏选择安全选项,如果未启用则开启两步验证(2FA)
  • 在搜索栏中搜索"应用密码",为我们的应用创建新的应用专用密码;连接服务器时将使用此密码

⚠️ 注意:Gmail的安全策略较严格,不使用应用专用密码可能导致连接失败。

4. 获取文件夹列表

查看retrieveAvailableFoldersUsingStore()方法,它负责使用提供的Store对象从邮件服务器获取所有可用文件夹:

List<String> retrieveAvailableFoldersUsingStore(Store store) throws MessagingException {
    List<String> folderList = new ArrayList<>();
    Folder defaultFolder = store.getDefaultFolder();
    listFolders(defaultFolder, folderList);
    return folderList;
}

**该方法通过store.getDefaultFolder()获取Store对象的默认文件夹(通常是邮件服务器的根文件夹),然后调用listFolders()方法并传入默认文件夹和空列表folderList**。最后返回更新后的folderList

void listFolders(Folder folder, List<String> folderList) throws MessagingException {
    Folder[] subfolders = folder.list();
    if (subfolders.length == 0) {
        folderList.add(folder.getFullName());
    } else {
        for (Folder subfolder : subfolders) {
            listFolders(subfolder, folderList);
        }
    }
}

listFolders()方法递归遍历文件夹结构并将文件夹名称添加到列表中。如果当前文件夹有子文件夹,该方法会为每个子文件夹递归调用自身,遍历整个文件夹结构并添加名称到列表。

使用IMAP协议连接邮件服务器。IMAP(互联网消息访问协议)是标准邮件协议,允许我们从多个设备访问邮件,同时保持服务器上的消息同步

@Test
void givenEmail_whenUsingIMAP_thenRetrieveEmailFolder() throws Exception {
    RetrieveEmailFolder retrieveEmailFolder = new RetrieveEmailFolder();
    List<String> availableFolders = retrieveEmailFolder.connectToMailServer("imap.gmail.com", "user@example.com", "app-specific-password");
    assertTrue(availableFolders.contains("INBOX"));
    assertTrue(availableFolders.contains("Spam"));
}

在上述测试中,我们通过提供Gmail的imapHostemailpassword连接到Gmail邮件服务器。

对于Gmail账户,availableFolders列表通常包含以下值:

INBOX
[Gmail]/All Mail
[Gmail]/Drafts
[Gmail]/Important
[Gmail]/Sent Mail
[Gmail]/Spam
[Gmail]/Starred
[Gmail]/Trash

✅ 关键点:

  • 递归遍历文件夹结构确保获取所有层级文件夹
  • Gmail的特殊文件夹使用[Gmail]前缀
  • 连接前必须启用IMAP和应用专用密码

5. 总结

本文介绍了如何使用IMAP协议获取邮件账户中的可用文件夹。我们讨论了:

  • JavaMail API的配置
  • 邮件服务器的连接方法
  • 文件夹列表的获取技巧

如往常一样,示例源代码可在GitHub上获取。


原始标题:How to Retrieve a List of Available Folders in a Mail Account Using JavaMail | Baeldung