apple-mail-search-2

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Apple 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
undefined
bash
undefined

Copy mail-search to your PATH

将mail-search复制到你的PATH路径下

cp mail-search /usr/local/bin/ chmod +x /usr/local/bin/mail-search
undefined
cp mail-search /usr/local/bin/ chmod +x /usr/local/bin/mail-search
undefined

Usage

使用方法

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 statistics
bash
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
undefined
bash
undefined

Find 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
undefined
mail-search recent 30 --csv > recent_emails.csv
undefined

Why This Exists

开发背景

MethodTime for 130k emails
AppleScript iteration8+ minutes
Spotlight/mdfindBroken since Big Sur
SQLite (this tool)~50ms
Apple removed the emlx Spotlight importer in macOS Big Sur. This tool queries the
Envelope Index
SQLite database directly.
方法13万封邮件的处理时间
AppleScript 遍历8+ 分钟
Spotlight/mdfind自Big Sur起失效
SQLite(本工具)~50毫秒
苹果在macOS Big Sur中移除了emlx Spotlight导入器。本工具直接查询
Envelope Index
SQLite数据库。

Technical Details

技术细节

Database:
~/Library/Mail/V{9,10,11}/MailData/Envelope Index
Key tables:
  • messages
    - Email metadata (dates, flags, FKs)
  • subjects
    - Subject lines
  • addresses
    - Email addresses and display names
  • recipients
    - TO/CC mappings
  • attachments
    - Attachment filenames
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
    - 邮箱地址和显示名称
  • recipients
    - 收件人(TO/CC)映射
  • 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