使用Java libpst读取PST文件时如何遍历所有文件夹获取唯一邮箱地址
使用Java libpst遍历PST所有文件夹提取唯一邮箱地址
是的,你需要递归遍历根文件夹下的所有子文件夹,才能覆盖收件箱、已发送邮件、自定义分类文件夹等所有存储邮件的目录——仅遍历根文件夹只能拿到顶层的默认容器,无法获取深层文件夹里的邮件内容。
实现思路
- 用
HashSet存储邮箱地址,利用其自动去重特性保证唯一性 - 编写递归方法:先处理当前文件夹内的所有邮件,再递归遍历所有子文件夹
- 从每封邮件中提取收件人(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
相关产品推荐
相关产品推荐

