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

Python实现Outlook OST文件邮件导出至硬盘(带GUI需求)

解决方案

1. 所需工具库

  • pypff:免费开源的Python库,专门用于读取本地OST/PST文件的内容与文件夹结构,完全符合本地OST文件处理需求
  • tkinter:Python自带的GUI库,无需额外安装,语法简单,适合新手快速搭建可视化界面

2. 安装依赖

打开命令行执行以下命令安装pypff:

pip install pypff

3. 完整代码实现

代码包含OST文件读取、文件夹层级加载、GUI选择、邮件导出四个核心功能:

import os
import pypff
import tkinter as tk
from tkinter import ttk, filedialog, messagebox

class OSTExporter:
    def __init__(self, root):
        self.root = root
        self.root.title("OST文件夹导出工具")
        self.ost_file_path = ""
        self.selected_folders = []
        self.pff_store = None

        # 搭建GUI组件
        self.setup_ui()

    def setup_ui(self):
        # 选择OST文件按钮
        ttk.Button(self.root, text="选择OST文件", command=self.load_ost).pack(pady=10)

        # 文件夹列表框(支持多选)
        self.folder_list = tk.Listbox(self.root, selectmode=tk.MULTIPLE, width=80, height=20)
        self.folder_list.pack(pady=5, padx=10)

        # 导出操作按钮
        ttk.Button(self.root, text="选择导出目录并导出", command=self.start_export).pack(pady=10)

    def load_ost(self):
        self.ost_file_path = filedialog.askopenfilename(filetypes=[("OST文件", "*.ost")])
        if not self.ost_file_path:
            return

        self.pff_store = pypff.file()
        try:
            self.pff_store.open(self.ost_file_path)
            self.folder_list.delete(0, tk.END)
            # 递归加载所有文件夹层级
            self.traverse_folders(self.pff_store.get_root_folder(), "")
        except Exception as e:
            messagebox.showerror("加载失败", f"无法读取OST文件:{str(e)}")
            self.pff_store = None

    def traverse_folders(self, folder, parent_path):
        current_full_path = f"{parent_path}/{folder.name}" if parent_path else folder.name
        self.folder_list.insert(tk.END, current_full_path)
        # 遍历子文件夹
        for i in range(folder.get_number_of_sub_folders()):
            sub_folder = folder.get_sub_folder(i)
            self.traverse_folders(sub_folder, current_full_path)

    def start_export(self):
        if not self.pff_store or not self.ost_file_path:
            messagebox.showwarning("提示", "请先加载OST文件")
            return

        selected_indices = self.folder_list.curselection()
        if not selected_indices:
            messagebox.showwarning("提示", "请选择要导出的文件夹")
            return

        export_dir = filedialog.askdirectory()
        if not export_dir:
            return

        self.selected_folders = [self.folder_list.get(i) for i in selected_indices]

        try:
            self.export_folder_content(self.pff_store.get_root_folder(), "", export_dir)
            messagebox.showinfo("导出完成", "所有选中文件夹的邮件已导出")
        except Exception as e:
            messagebox.showerror("导出失败", f"导出过程出错:{str(e)}")
        finally:
            self.pff_store.close()

    def export_folder_content(self, folder, parent_path, export_dir):
        current_full_path = f"{parent_path}/{folder.name}" if parent_path else folder.name
        # 检查当前文件夹是否在选中列表中
        if current_full_path in self.selected_folders:
            # 创建对应本地目录
            local_dir = os.path.join(export_dir, current_full_path.replace("/", os.sep))
            os.makedirs(local_dir, exist_ok=True)
            # 导出当前文件夹下的所有邮件为.eml格式
            for i in range(folder.get_number_of_messages()):
                msg = folder.get_message(i)
                # 处理主题中的特殊字符,避免文件创建失败
                safe_subject = msg.subject[:50].replace("/", "_").replace("\\", "_") if msg.subject else f"未命名邮件_{i}"
                eml_path = os.path.join(local_dir, f"{safe_subject}.eml")
                # 优先导出纯文本内容,无纯文本则导出HTML内容
                content = msg.get_plain_text_body() or msg.get_html_body() or b"无内容"
                with open(eml_path, "wb") as f:
                    f.write(content)
        # 递归处理子文件夹
        for i in range(folder.get_number_of_sub_folders()):
            sub_folder = folder.get_sub_folder(i)
            self.export_folder_content(sub_folder, current_full_path, export_dir)

if __name__ == "__main__":
    root = tk.Tk()
    app = OSTExporter(root)
    root.mainloop()

4. 使用步骤

  • 运行代码后,点击「选择OST文件」,选中你的本地OST文件(需先关闭Outlook,避免文件锁定)
  • 列表框会自动加载OST内所有文件夹的层级结构
  • 按住Ctrl键可多选目标文件夹,选好后点击「选择导出目录并导出」
  • 导出的邮件会以.eml格式保存到你指定的目录,完全保留原文件夹结构

注意事项

  • 若OST文件较大,加载和导出过程可能耗时较长,请耐心等待
  • 部分特殊字符的邮件主题会被替换为下划线,防止创建文件时出错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:50:21