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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:53:16