Files
nexus/openclaw/xingshu/PST邮件处理流程总结.md

205 lines
6.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 <pst_file> -o <output_dir>` 将 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/<pst_name>/
readpst -S ~/pst-processing/incoming/<file>.pst -o ~/pst-processing/incoming/<pst_name>/
# 2. 建立索引 CSV
python3 ~/pst-processing/rules/index_pst.py <source_dir> <output_csv_dir>
# 3. 应用删除规则(复用现有规则)
python3 ~/pst-processing/rules/apply_rules.py <csv_dir>
# 4. 组装新 mbox按 message_id 匹配原始 mbox
python3 ~/pst-processing/rules/build_clean_mbox.py <source_mbox_dir> <output_mbox>
```
### 待开发脚本
- [ ] `index_pst.py` — 通用 PST 索引脚本
- [ ] `batch_process.sh` — 批量处理 wrapper
- [ ] `rules/delete_rules.json` — 已有,可直接复用
---
## 📁 当前文件结构
```
~/pst-processing/
├── rules/
│ ├── delete_rules.json # 规则定义
│ └── apply_rules.py # 规则执行脚本
├── 2025/ # 原始索引 CSV83个月
│ └── 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