如何用Java解析本地邮件文件(如Thunderbird收件箱)?
解析本地Thunderbird收件箱文件的Java方案
Thunderbird的Inbox文件属于标准mbox格式的本地邮件存储,你完全可以用Jakarta Mail(搭配Eclipse Angus实现)解析这类文件,无需依赖远程邮件服务器的Store API。此外也有轻量级的专用库可选,以下是两种适配你需求的方案:
方案1:基于Jakarta Mail(Angus)解析mbox文件
Jakarta Mail的Angus实现内置了mbox协议的Provider,可直接处理本地mbox文件。如果要从System.in读取输入流,只需先将流写入临时文件,再通过Jakarta Mail加载:
import jakarta.mail.*; import jakarta.mail.internet.MimeMessage; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; public class MyProgram { public static void main(String[] args) throws Exception { // 将System.in内容写入临时mbox文件 Path tempFile = Files.createTempFile("inbox_temp", ".mbox"); try (InputStream input = System.in; OutputStream output = Files.newOutputStream(tempFile)) { input.transferTo(output); } // 配置Session使用mbox协议 Properties props = new Properties(); props.setProperty("mail.store.protocol", "mbox"); Session session = Session.getDefaultInstance(props); // 打开本地mbox文件 Store store = session.getStore(); store.connect("file://" + tempFile.toAbsolutePath()); // 获取收件箱并打开 Folder inbox = store.getFolder("INBOX"); inbox.open(Folder.READ_ONLY); // 遍历所有邮件 Message[] messages = inbox.getMessages(); for (Message msg : messages) { System.err.println(msg.getSubject()); // 处理附件 if (msg.getContent() instanceof Multipart multipart) { for (int i = 0; i < multipart.getCount(); i++) { BodyPart part = multipart.getBodyPart(i); if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) { try (InputStream attachementStream = part.getInputStream()) { // 在这里处理附件流 } } } } } // 清理资源 inbox.close(false); store.close(); Files.delete(tempFile); } }
方案2:轻量级mbox解析库(直接处理InputStream)
如果不想引入Jakarta Mail的完整依赖栈,可使用专门的mbox解析库(如com.github.marschall:mbox-parser),它支持直接从System.in读取并解析邮件,无需临时文件:
import com.github.marschall.mboxparser.MboxParser; import com.github.marschall.mboxparser.MboxEntry; import jakarta.mail.internet.MimeMessage; import java.io.InputStream; import java.util.Iterator; public class MyProgram { public static void main(String[] args) throws Exception { try (InputStream input = System.in) { // 解析System.in中的mbox内容 Iterator<MboxEntry> entryIterator = MboxParser.parse(input).iterator(); while (entryIterator.hasNext()) { MboxEntry entry = entryIterator.next(); // 将解析结果转为Jakarta Mail的MimeMessage,方便处理内容和附件 MimeMessage msg = new MimeMessage(null, entry.getContentInputStream()); System.err.println(msg.getSubject()); // 附件处理逻辑同方案1 if (msg.getContent() instanceof Multipart multipart) { for (int i = 0; i < multipart.getCount(); i++) { BodyPart part = multipart.getBodyPart(i); if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) { try (InputStream attachementStream = part.getInputStream()) { // 处理附件流 } } } } } } } }
两种方案都能实现你预期的遍历逻辑:方案1基于Jakarta Mail,兼容性强,适合已熟悉该API的场景;方案2更轻量,直接处理输入流,无需临时文件中转。
内容的提问来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

