关于 apple-mail
apple-mail 是通过 AppleScript 和 SQLite 操作 Mail.app 的命令行技能,可搜索和管理邮件。它会复制数据库后进行快速元数据搜索,因此 Mail.app 运行时也能使用。
主要功能
- 01列出和搜索邮件
- 02读取、发送和回复邮件
- 03删除邮件及更改已读状态
- 04刷新邮件账户
- 05快速 SQLite 元数据搜索
- 06按消息 ID 批量操作
适用场景
- 01按查询词或邮箱查找邮件
- 02读取或回复指定邮件
- 03发送带附件的邮件
- 04批量标记或删除邮件
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ sundial-org/ awesome-openclaw-skills --skill apple-mail安装后在 Claude Code 中输入/apple-mail确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/mail-accounts.shmail-delete.shmail-fast-search.shmail-list.shmail-mailboxes.shmail-mark-read.shmail-mark-unread.shmail-read-emlx.pymail-read.shmail-refresh.shmail-reply.shmail-search.shmail-send.sh详细介绍
Apple Mail
通过 AppleScript 和 SQLite 与 Mail.app 交互。从以下目录运行脚本:cd {baseDir}
命令
| 命令 | 用法 |
|---|---|
| 刷新 | scripts/mail-refresh.sh [account] [wait_seconds] |
| 列出最近邮件 | scripts/mail-list.sh [mailbox] [account] [limit] |
| 搜索 | scripts/mail-search.sh "query" [mailbox] [limit] |
| 快速搜索 | scripts/mail-fast-search.sh "query" [limit] |
| 阅读邮件 | scripts/mail-read.sh <message-id> [message-id...] |
| 删除 | scripts/mail-delete.sh <message-id> [message-id...] |
| 标记为已读 | scripts/mail-mark-read.sh <message-id> [message-id...] |
| 标记为未读 | scripts/mail-mark-unread.sh <message-id> [message-id...] |
| 发送 | scripts/mail-send.sh "[email protected]" "Subject" "Body" [from-account] [attachment] ¹ |
| 回复 | scripts/mail-reply.sh <message-id> "body" [reply-all] |
| 列出账户 | scripts/mail-accounts.sh |
| 列出邮箱 | scripts/mail-mailboxes.sh [account] |
刷新邮件
强制 Mail.app 检查新邮件:
scripts/mail-refresh.sh # All accounts, wait up to 10s
scripts/mail-refresh.sh Google # Specific account only
scripts/mail-refresh.sh "" 5 # All accounts, max 5 seconds
scripts/mail-refresh.sh Google 0 # Google account, no wait
智能同步检测:
- 脚本监控数据库中的邮件数量
- 同步完成后提前返回(2 秒内无变化)
- 报告新邮件数量:
Sync complete in 2s (+3 messages)
注意:
- Mail.app 必须正在运行(否则脚本会报错)
mail-list.sh不会自动刷新——如果需要最新数据,请先调用mail-refresh.sh
输出格式
列表/搜索返回:ID | ReadStatus | Date | Sender | Subject
●= 未读,空白 = 已读
Gmail 邮箱
⚠️ Gmail 特殊文件夹需要使用 [Gmail]/ 前缀:
| 显示为 | 使用 |
|---|---|
Spam | [Gmail]/Spam |
Sent Mail | [Gmail]/Sent Mail |
All Mail | [Gmail]/All Mail |
Trash | [Gmail]/Trash |
自定义标签无需前缀。
快速搜索(SQLite)
✨ 现在即使 Mail.app 正在运行也安全——会先将数据库复制到临时文件。
scripts/mail-fast-search.sh "query" [limit] # ~50ms vs minutes
此前要求退出 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 # Delete one
scripts/mail-delete.sh 12345 12346 12347 # Delete multiple
标记为已读/未读:
scripts/mail-mark-read.sh 12345 12346 # Mark as read
scripts/mail-mark-unread.sh 12345 # Mark as unread
批量操作示例:
# Find spam emails
scripts/mail-fast-search.sh "spam" 50 > spam.txt
# Extract IDs and delete them
grep "^[0-9]" spam.txt | cut -d'|' -f1 | xargs scripts/mail-delete.sh
阅读邮件正文
scripts/mail-read.sh 12345 # Single email
scripts/mail-read.sh 12345 12346 12347 # Multiple emails (separated output)
使用经过位置优化的查找(每封邮件约 2 秒)。多封邮件之间以 ======== 分隔,末尾附有摘要。
错误
| 错误 | 原因 |
|---|---|
Mail.app is not running | 运行脚本前请打开 Mail.app |
Account not found | 账户无效——请检查 mail-accounts.sh |
Message not found | ID 无效或邮件已删除——请从 mail-list.sh 获取最新 ID |
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
邮件查找方法(已优化):
- 查询 SQLite,获取账户 UUID、邮箱路径和大致位置
- AppleScript 直接访问指定账户(无需遍历)
- 从大致位置开始搜索(前后各留 5 封邮件的缓冲)
- 仅在位置提示失效时才回退到完整邮箱搜索
安全性:
- 快速搜索会先将数据库复制到临时文件,再进行查询
- 即使 Mail.app 正在运行,也可以安全使用
- 删除、读取和标记操作会查询实时数据库,但访问量很少
注意事项
- 邮件 ID 是内部 ID,请通过列表或搜索获取最新 ID
- 发送前请确认收件人
- AppleScript 搜索速度较慢,但结果全面;SQLite 获取元数据的速度较快
- 删除、标记操作支持批量处理(传入多个 ID)
- 如果需要获取最新邮件,列出邮件前请务必刷新
¹ 已知限制: Mail.app 会在已发送邮件开头添加一个空行。这是 AppleScript/Mail.app 的行为,无法绕过。