apple-mail-search-2
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseApple Mail Search
Apple Mail 搜索
Search Apple Mail.app emails instantly via SQLite. ~50ms vs 8+ minutes with AppleScript.
通过SQLite即时搜索Apple Mail.app中的邮件。耗时约50毫秒,相比AppleScript的8+分钟大幅提升。
Installation
安装
bash
undefinedbash
undefinedCopy mail-search to your PATH
将mail-search复制到你的PATH路径下
cp mail-search /usr/local/bin/
chmod +x /usr/local/bin/mail-search
undefinedcp mail-search /usr/local/bin/
chmod +x /usr/local/bin/mail-search
undefinedUsage
使用方法
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 "recipient@example.com" # 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 statisticsbash
mail-search subject "invoice" # 按主题搜索
mail-search sender "@amazon.com" # 按发件人邮箱搜索
mail-search from-name "John" # 按发件人名称搜索
mail-search to "recipient@example.com" # 搜索已发送邮件
mail-search unread # 列出未读邮件
mail-search attachments # 列出带附件的邮件
mail-search attachment-type pdf # 查找PDF附件
mail-search recent 7 # 最近7天的邮件
mail-search date-range 2025-01-01 2025-01-31
mail-search open 12345 # 通过ID打开邮件
mail-search stats # 数据库统计信息Options
选项
-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-n, --limit N 最大结果数(默认:20)
-j, --json 以JSON格式输出
-c, --csv 以CSV格式输出
-q, --quiet 不显示表头
--db PATH 覆盖数据库路径Examples
示例
bash
undefinedbash
undefinedFind bank statements from last month
查找上个月的银行对账单
mail-search subject "statement" -n 50
mail-search subject "statement" -n 50
Get unread emails as JSON for processing
以JSON格式获取未读邮件用于后续处理
mail-search unread --json | jq '.[] | .subject'
mail-search unread --json | jq '.[] | .subject'
Find all PDFs from a specific sender
查找特定发件人的所有PDF附件
mail-search sender "@bankofamerica.com" -n 100 | grep -i statement
mail-search sender "@bankofamerica.com" -n 100 | grep -i statement
Export recent emails to CSV
将最近30天的邮件导出为CSV
mail-search recent 30 --csv > recent_emails.csv
undefinedmail-search recent 30 --csv > recent_emails.csv
undefinedWhy This Exists
开发背景
| Method | Time for 130k emails |
|---|---|
| AppleScript iteration | 8+ minutes |
| Spotlight/mdfind | Broken since Big Sur |
| SQLite (this tool) | ~50ms |
Apple removed the emlx Spotlight importer in macOS Big Sur. This tool queries the SQLite database directly.
Envelope Index| 方法 | 13万封邮件的处理时间 |
|---|---|
| AppleScript 遍历 | 8+ 分钟 |
| Spotlight/mdfind | 自Big Sur起失效 |
| SQLite(本工具) | ~50毫秒 |
苹果在macOS Big Sur中移除了emlx Spotlight导入器。本工具直接查询 SQLite数据库。
Envelope IndexTechnical Details
技术细节
Database:
~/Library/Mail/V{9,10,11}/MailData/Envelope IndexKey tables:
- - Email metadata (dates, flags, FKs)
messages - - Subject lines
subjects - - Email addresses and display names
addresses - - TO/CC mappings
recipients - - Attachment filenames
attachments
Limitations:
- Read-only (cannot compose/send)
- Metadata only (bodies in .emlx files)
- Mail.app only (not Outlook, etc.)
数据库路径:
~/Library/Mail/V{9,10,11}/MailData/Envelope Index核心表:
- - 邮件元数据(日期、标记、外键)
messages - - 邮件主题
subjects - - 邮箱地址和显示名称
addresses - - 收件人(TO/CC)映射
recipients - - 附件文件名
attachments
局限性:
- 只读(无法撰写/发送邮件)
- 仅支持元数据(邮件正文存储在.emlx文件中)
- 仅适用于Mail.app(不支持Outlook等其他邮件客户端)
Advanced: Raw SQL
进阶用法:原生SQL
For custom queries, use sqlite3 directly:
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;
"如需自定义查询,可直接使用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;
"License
许可证
MIT
MIT