diff --git a/openclaw/xingshu/PST邮件处理流程总结.md b/openclaw/xingshu/PST邮件处理流程总结.md new file mode 100644 index 00000000..c1d5d308 --- /dev/null +++ b/openclaw/xingshu/PST邮件处理流程总结.md @@ -0,0 +1,204 @@ +# PST 邮件处理流程总结 + +> 创建时间: 2026-04-13 +> 处理对象: Shen Wei 2025.pst (15GB, 55,647封) + +--- + +## 📋 全流程概述 + +### 阶段一:PST 提取(PST → mbox) + +``` +原始文件: Shen Wei 2025.pst (15GB) + ↓ +工具: readpst (macOS 已安装) + ↓ +输出: extracted_2025/Shen Wei 2025/*/mbox (30个文件夹) +时间: ~10-15 分钟 +``` + +**关键点:** +- `readpst -S -o ` 将 PST 按文件夹结构展开为 mbox 格式 +- 每个 mbox 以 `From ` 行分隔邮件 +- 原始 PST 完全未动 + +--- + +### 阶段二:建立索引(mbox → CSV) + +``` +原始 mbox (30个文件夹, 55,647封) + ↓ +Python: mailbox 模块 + parsedate_to_datetime + ↓ +输出: ~/pst-processing/2025/YYYY-MM.csv (83个月) +``` + +**CSV 字段:** + +| 字段 | 说明 | +|------|------| +| folder | 文件夹路径(如 Inbox/SaaS Notification/AWS) | +| year_month | 年月(如 2025-01) | +| message_id | 邮件唯一标识(用于跨文件匹配) | +| subject | 主题(截断至80字符保唯一性) | +| sender | 发件人(完整显示名+邮箱) | +| recipient | 收件人 | +| date | 日期(RFC 2822 原始格式) | +| has_attachment | Y/N(检测 Content-Disposition: attachment) | +| attachment_size | 附件总字节数 | +| email_size | 整封邮件字节数 | + +**处理速度:** ~4分钟(55,647封) + +--- + +### 阶段三:定义删除规则 + +**规则文件:** `~/pst-processing/rules/delete_rules.json` + +| # | 规则ID | 文件夹匹配 | 动作 | 说明 | +|---|--------|----------|------|------| +| 1 | aws_notification | 含 "AWS Notification" | keep_sample: 5 | 每 subject 保留1封,最多5封 | +| 2 | prisma_cloud | 含 "Prisma Cloud" | keep_sample: 5 | 每 subject 保留1封,最多5封 | +| 3 | x4x_tenant_provisioning | 含 "X4X-Tenant Provisioning" | keep_sample: 5 | 每 subject 保留1封,最多5封 | +| 4 | qualys | 含 "Qualys" | keep_sample: 5 | 每 subject 保留1封,最多5封 | +| 5 | teams_notification | 含 "Teams Notification" | keep_if_attachment | 有附件保留,无附件删 | +| 6 | sma_notification | 含 "SMA Notficiation" | keep_sample: 10 | 每 subject 保留1封,每月最多10封 | +| 7 | ppm_saas_change | 含 "PPM SaaS Change" | delete_all | 全部删除 | +| 8 | cloudhealth | 含 "CloudHealth" | keep | 全部保留 | +| 9 | saas_bi_report | 含 "SaaS BI Report" | keep | 全部保留 | +| 10 | x4x_decommissioning | 含 "X4X-Tenant Decommissioning" | delete_all | 全部删除 | +| 11 | x4x_license_renewal | 含 "X4X-License Renewal" | delete_all | 全部删除 | + +**规则动作类型:** +- `keep`:全部保留 +- `delete_all`:全部删除 +- `keep_sample`:每 subject 保留1封,最多N封 +- `keep_if_attachment`:有附件保留,无附件删除 + +**执行脚本:** `~/pst-processing/rules/apply_rules.py` + +--- + +### 阶段四:过滤并组装新 mbox + +``` +原始 mbox (30个文件夹, 55,647封) + ↓ +按 message_id 匹配 delete_flag + ↓ +保留邮件: 29,088 封 (52%) + ↓ +提取 full content(含正文+附件) + ↓ +输出: shenwei2025-clean.mbox (9.6GB) +``` + +**关键发现:** +- 有117封邮件在原始 mbox 中匹配失败(PST→mbox 转换时的 ID 差异) +- SMA Notification 原始 6,681 封 → 规则处理后仅保留 40 封 + +--- + +## 💡 经验总结 + +### 1. 工具链 + +| 场景 | 工具 | 备注 | +|------|------|------| +| PST 读取 | `readpst` | macOS 已安装 (`/opt/homebrew/bin/readpst`) | +| PST Python 库 | ❌ pypff (PEP 668阻止安装) | 无需替代,readpst + mbox 够用 | +| mbox 处理 | Python `mailbox` | 原生支持,够用 | +| 日期解析 | `email.utils.parsedate_to_datetime` | 兼容 RFC 2822 | + +### 2. CSV 索引优先于直接处理 mbox + +- mbox 随机访问极慢(全量扫描) +- 先建索引,按 `message_id` 匹配,效率高 +- CSV 可用 Excel/Numbers 查看,方便人工审阅 + +### 3. 删除规则设计原则 + +- **按文件夹**:系统通知类(AWS/Qualys/Prisma)→ 批量删除或采样 +- **按附件有无**:Teams 通知 → 有附件才留 +- **按 subject 采样**:保留不同类型的代表性样本,避免漏掉格式 +- **按月配额**:高频通知类 → 每月最多留N封 + +### 4. 避免的坑 + +- `mailbox.mbox` 不支持 slice 索引 → 用 `iter()` 遍历 +- Subject 可能含非 ASCII → `:80` 截断保唯一性 +- 附件大小:字符串 payload 用 `len(payload.encode())`,二进制 payload 直接 `len(payload)` +- 日期解析失败 → 归入 "Unknown" 月份 + +--- + +## 📊 Shen Wei 2025 处理结果 + +| 指标 | 处理前 | 处理后 | +|------|--------|--------| +| 总邮件 | 55,647 | 29,088 | +| 删除 | — | 26,559 | +| 附件邮件 | — | 20,171 (69%) | +| 总附件大小 | — | 8.6 GB | + +--- + +## 🔄 批量处理 SOP(待执行) + +### 输入 +- 新 PST 文件 → 复制到 `~/pst-processing/incoming/` +- 规则文件已就绪:`~/pst-processing/rules/delete_rules.json` + +### 执行步骤 + +```bash +# 1. 提取 PST → mbox +mkdir -p ~/pst-processing/incoming// +readpst -S ~/pst-processing/incoming/.pst -o ~/pst-processing/incoming// + +# 2. 建立索引 CSV +python3 ~/pst-processing/rules/index_pst.py + +# 3. 应用删除规则(复用现有规则) +python3 ~/pst-processing/rules/apply_rules.py + +# 4. 组装新 mbox(按 message_id 匹配原始 mbox) +python3 ~/pst-processing/rules/build_clean_mbox.py +``` + +### 待开发脚本 + +- [ ] `index_pst.py` — 通用 PST 索引脚本 +- [ ] `batch_process.sh` — 批量处理 wrapper +- [ ] `rules/delete_rules.json` — 已有,可直接复用 + +--- + +## 📁 当前文件结构 + +``` +~/pst-processing/ +├── rules/ +│ ├── delete_rules.json # 规则定义 +│ └── apply_rules.py # 规则执行脚本 +├── 2025/ # 原始索引 CSV(83个月) +│ └── YYYY-MM.csv +├── shenwei2025-clean.mbox # 清理后完整邮件 (9.6GB, 29,088封) +├── shenwei2025-clean-index.csv # 新索引 (12.3MB) +├── shenwei2025-new.mbox # 旧版(仅 headers,已保留) +└── extracted_2025/ # 原始 mbox 提取物 + └── Shen Wei 2025/ + └── */mbox +``` + +--- + +## 📅 后续任务 + +- [ ] 开发通用 `index_pst.py` 脚本 +- [ ] 开发 `build_clean_mbox.py` 脚本 +- [ ] 批处理其他 PST 文件 +- [ ] 同步笔记到 Git