星枢: PST邮件处理流程总结笔记 (2026-04-13)

This commit is contained in:
2026-04-13 21:30:59 +08:00
parent 8ee4716240
commit e41a8e3c99

View File

@@ -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 <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