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
相关产品推荐
相关产品推荐

