介绍
# Apple Mail Search
通过 SQLite 即时搜索 Apple Mail.app 邮件。耗时约 50 毫秒,而 AppleScript 需要 8 分钟以上。
## 安装
```bash # Copy mail-search to your PATH cp mail-search /usr/local/bin/ chmod +x /usr/local/bin/mail-search ```
## 用法
```bash mail-search subject "invoice" # Search subjects mail-search sender "@amazon.com" # Search by sender email mail-search from-name "John" # Search by sender name mail-search to "[email protected]" # Search sent mail mail-search unread # List unread emails mail-search attachments # List emails with attachments mail-search attachment-type pdf # Find PDFs mail-search recent 7 # Last 7 days mail-search date-range 2025-01-01 2025-01-31 mail-search open 12345 # Open email by ID mail-search stats # Database statistics ```
## 选项
``` -n, --limit N Max results (default: 20) -j, --json Output as JSON -c, --csv Output as CSV -q, --quiet No headers --db PATH Override database path ```
## 示例
```bash # Find bank statements from last month mail-search subject "statement" -n 50
# Get unread emails as JSON for processing mail-search unread --json | jq '.[] | .subject'
# Find all PDFs from a specific sender mail-search sender "@bankofamerica.com" -n 100 | grep -i statement
# Export recent emails to CSV mail-search recent 30 --csv > recent_emails.csv ```
## 存在原因
| 方法 | 13 万封邮件耗时 | |--------|---------------------| | AppleScript 迭代 | 8+ 分钟 | | Spotlight/mdfind | **自 Big Sur 起损坏** | | SQLite(本工具) | ~50ms |
Apple 在 macOS Big Sur 中移除了 emlx Spotlight 导入器。本工具直接查询 `Envelope Index` SQLite 数据库。
## 技术细节
**数据库:** `~/Library/Mail/V{9,10,11}/MailData/Envelope Index`
**关键表:** - `messages` - 邮件元数据(日期、标志、外键) - `subjects` - 主题行 - `addresses` - 电子邮件地址和显示名称 - `recipients` - 收件人/抄送 (TO/CC) 映射 - `attachments` - 附件文件名
**局限性:** - 只读(无法撰写/发送) - 仅限元数据(正文在 .emlx 文件中) - 仅限 Mail.app(不支持 Outlook 等)
## 高级:原始 SQL
对于自定义查询,请直接使用 sqlite3:
```bash sqlite3 -header -column ~/Library/Mail/V10/MailData/Envelope\ Index " SELECT m.ROWID, s.subject, a.address FROM messages m JOIN subjects s ON m.subject = s.ROWID LEFT JOIN addresses a ON m.sender = a.ROWID WHERE s.subject LIKE '%your query%' ORDER BY m.date_sent DESC LIMIT 20; " ```
## 许可证
MIT