名称: apple-mail
描述: 适用于 macOS 的 Apple Mail.app 集成。快速直接访问(无需枚举),可读取收件箱、搜索邮件、发送邮件、回复和管理消息。
元数据: {"clawdbot":{"emoji":"📧","os":["darwin"],"requires":{"bins":["sqlite3"]}}}
通过 AppleScript 和 SQLite 与 Mail.app 交互。从以下目录运行脚本:cd {baseDir}
| 命令 | 用法 |
|---|---|
| 刷新 | scripts/mail-refresh.sh [账户] [等待秒数] |
| 列出最近邮件 | scripts/mail-list.sh [邮箱] [账户] [数量限制] |
| 搜索 | scripts/mail-search.sh "查询" [邮箱] [数量限制] |
| 快速搜索 | scripts/mail-fast-search.sh "查询" [数量限制] |
| 读取邮件 | scripts/mail-read.sh <邮件ID> [邮件ID...] |
| 删除 | scripts/mail-delete.sh <邮件ID> [邮件ID...] |
| 标记为已读 | scripts/mail-mark-read.sh <邮件ID> [邮件ID...] |
| 标记为未读 | scripts/mail-mark-unread.sh <邮件ID> [邮件ID...] |
| 发送 | scripts/mail-send.sh "收件人@邮箱.com" "主题" "正文" [发件账户] [附件] ¹ |
| 回复 | scripts/mail-reply.sh <邮件ID> "正文" [回复所有人] |
| 列出账户 | scripts/mail-accounts.sh |
| 列出邮箱 | scripts/mail-mailboxes.sh [账户] |
强制 Mail.app 检查新消息:
scripts/mail-refresh.sh # 所有账户,最多等待 10 秒
scripts/mail-refresh.sh Google # 仅特定账户
scripts/mail-refresh.sh "" 5 # 所有账户,最多 5 秒
scripts/mail-refresh.sh Google 0 # Google 账户,不等待
智能同步检测:
- 脚本监控数据库消息计数
- 当同步完成(2 秒内无变化)时提前返回
- 报告新消息数量:Sync complete in 2s (+3 messages)
注意:
- Mail.app 必须正在运行(否则脚本会报错)
- mail-list.sh 不会自动刷新——如果需要最新数据,请先调用 mail-refresh.sh
列表/搜索返回格式:ID | 阅读状态 | 日期 | 发件人 | 主题
- ● = 未读,空白 = 已读
⚠️ Gmail 的特殊文件夹需要 [Gmail]/ 前缀:
| 显示名称 | 使用方式 |
|---|---|
Spam |
[Gmail]/Spam |
Sent Mail |
[Gmail]/Sent Mail |
All Mail |
[Gmail]/All Mail |
Trash |
[Gmail]/Trash |
自定义标签无需前缀。
✨ 现在即使 Mail.app 正在运行也是安全的 —— 会先将数据库复制到临时文件。
scripts/mail-fast-search.sh "查询" [数量限制] # ~50ms vs 数分钟
以前需要退出 Mail.app。现在通过先复制数据库到临时文件再进行查询,可随时使用。
各操作速度:
| 操作 | 速度 | 说明 |
|-----------|-------|-------|
| mail-fast-search.sh | ~50ms | SQLite 查询,最快 |
| mail-accounts.sh | <1s | 简单的 AppleScript |
| mail-list.sh | 1-3s | AppleScript,直接访问邮箱 |
| mail-send.sh | 1-2s | 创建并发送消息 |
| mail-read.sh | ~2s | 位置优化查找 |
| mail-delete.sh | ~0.5s | 位置优化查找 |
| mail-mark-*.sh | ~1.5s | 位置优化查找 |
优化技术:
SQLite 提供账户 UUID 和邮件的大致位置。AppleScript 直接跳转到该位置,而不是从头开始遍历。
支持批量操作:
- mail-read.sh 123 456 789 - 读取多个(输出间有分隔符)
- mail-delete.sh 123 456 789 - 删除多个
- mail-mark-read.sh 123 456 - 将多个标记为已读
- mail-mark-unread.sh 123 456 - 将多个标记为未读
⚠️ 无自动刷新: 脚本读取的是缓存数据。如果需要最新的邮件,请先调用 mail-refresh.sh。
删除邮件:
scripts/mail-delete.sh 12345 # 删除一封
scripts/mail-delete.sh 12345 12346 12347 # 删除多封
标记为已读/未读:
scripts/mail-mark-read.sh 12345 12346 # 标记为已读
scripts/mail-mark-unread.sh 12345 # 标记为未读
批量操作示例:
# 查找垃圾邮件
scripts/mail-fast-search.sh "spam" 50 > spam.txt
# 提取 ID 并删除它们
grep "^[0-9]" spam.txt | cut -d'|' -f1 | xargs scripts/mail-delete.sh
scripts/mail-read.sh 12345 # 单封邮件
scripts/mail-read.sh 12345 12346 12347 # 多封邮件(输出分隔)
使用位置优化查找(每封约 2 秒)。多封邮件之间用 ======== 分隔,末尾有摘要。
| 错误 | 原因 |
|---|---|
Mail.app is not running |
运行脚本前请先打开 Mail.app |
Account not found |
无效账户 —— 检查 mail-accounts.sh |
Message not found |
无效/已删除的 ID —— 从 mail-list.sh 获取新的列表 |
Can't get mailbox |
无效名称 —— 检查 mail-mailboxes.sh |
Mail database not found |
SQLite 数据库缺失 —— 检查 ~/Library/Mail/V{9,10,11}/MailData/ |
数据库: ~/Library/Mail/V{9,10,11}/MailData/Envelope Index
消息查找方法(优化版):
1. 查询 SQLite 获取账户 UUID、邮箱路径和大致位置
2. AppleScript 直接访问特定账户(无需遍历)
3. 从大致位置开始搜索(±5 条消息的缓冲区)
4. 仅在位置提示失败时回退到完整邮箱搜索
安全性:
- 快速搜索在查询前将数据库复制到临时文件
- 即使 Mail.app 正在运行也可以安全使用
- 删除/读取/标记操作查询实时数据库,但访问量最小
¹ 已知限制: Mail.app 会在发送的邮件开头添加一个空行。这是 AppleScript/Mail.app 的行为,无法绕过。