You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java libpst读取PST文件时如何遍历所有文件夹获取唯一邮箱地址

使用Java libpst遍历PST所有文件夹提取唯一邮箱地址

是的,你需要递归遍历根文件夹下的所有子文件夹,才能覆盖收件箱、已发送邮件、自定义分类文件夹等所有存储邮件的目录——仅遍历根文件夹只能拿到顶层的默认容器,无法获取深层文件夹里的邮件内容。

实现思路

  1. 用HashSet存储邮箱地址,利用其自动去重特性保证唯一性
  2. 编写递归方法:先处理当前文件夹内的所有邮件,再递归遍历所有子文件夹
  3. 从每封邮件中提取收件人(TO)和抄送人(CC)的邮箱地址,加入集合

完整代码示例

import java.util.HashSet;
import java.util.Set;
import java.util.Vector;
import com.pff.PSTFile;
import com.pff.PSTFolder;
import com.pff.PSTMessage;
import com.pff.PSTRecipient;

public class PSTEmailExtractor {
    // 存储唯一邮箱的集合,自动去重
    private static final Set<String> uniqueEmails = new HashSet<>();

    public static void main(String[] args) {
        try {
            // 初始化PST文件
            PSTFile pstFile = new PSTFile("path/to/your/target.pst");
            // 从根文件夹开始递归遍历所有内容
            traverseFolder(pstFile.getRootFolder());
            
            // 输出最终结果
            System.out.println("提取到的唯一邮箱地址:");
            uniqueEmails.forEach(System.out::println);
            
            pstFile.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 递归遍历文件夹,处理所有邮件和子文件夹
     */
    private static void traverseFolder(PSTFolder folder) throws Exception {
        // 处理当前文件夹下的所有邮件
        PSTMessage email = (PSTMessage) folder.getNextChild();
        while (email != null) {
            // 提取收件人(TO)
            extractRecipientEmails(email.getRecipients());
            // 提取抄送人(CC)
            extractRecipientEmails(email.getCCRecipients());
            
            // 迭代到下一封邮件
            email = (PSTMessage) folder.getNextChild();
        }

        // 递归处理所有子文件夹
        Vector<PSTFolder> subFolders = folder.getSubFolders();
        for (PSTFolder subFolder : subFolders) {
            traverseFolder(subFolder);
        }
    }

    /**
     * 提取收件人列表中的邮箱地址,加入去重集合
     */
    private static void extractRecipientEmails(PSTRecipient[] recipients) {
        if (recipients == null) return;
        for (PSTRecipient recipient : recipients) {
            String email = recipient.getEmailAddress();
            if (email != null && !email.isBlank()) {
                // 转小写避免大小写差异导致的重复
                uniqueEmails.add(email.toLowerCase());
            }
        }
    }
}

关键说明

  • HashSet自动处理重复邮箱,无需手动去重
  • 递归遍历确保不会遗漏任何层级的文件夹(包括已发送、自定义分类文件夹)
  • 邮箱地址转小写,避免User@Example.com和user@example.com被视为两个不同地址
  • 加入空值判断,防止空指针异常

内容的提问来源于stack exchange,提问作者Francisco Ramirez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:55:23