目录(7 节)
HEY CLI:让 AI 替你收拾邮箱
一千多封邮件,我一条命令没敲,只跟 Claude Code 说了几句中文。1 小时:86 封广告删掉,20 个营销发件人永久拒收,揪出 2 封钓鱼邮件。背后是 HEY 官方为 AI agent 设计的 hey-cli。
我的 HEY 邮箱里攒了一千多封邮件。昨天花了一个小时左右,让 Claude Code 通过 HEY 官方的命令行工具帮我清理,结果是:
- Paper Trail 里 86 封 广告和推广被删掉,16 封过期的域名提醒也清掉了;
- 20 个 只发广告的发件人被直接拒收,以后他们的邮件根本进不来;
- 两封冒充加拿大税务局和 DocuSign 的 钓鱼邮件 被识别出来,标成了垃圾邮件;
- Imbox 的 46 封”New For You”压到 9 封真正要我动手的;
- 8 篇 SemiAnalysis 长文被总结成一篇笔记,存进了 Obsidian。
更意外的是,它在翻 Hetzner 邮件时发现,我服务器上的 PostgreSQL 一直暴露在公网上,德国联邦信息安全局每个月都发报告,我一直没看。顺着这条线,把 4 台服务器都修好了。
这一切靠的是 Basecamp 开源的 hey-cli。
先说清楚:命令不是我敲的
下文会出现不少命令,但 整个过程我只亲手敲了一条:hey auth login,因为登录要在浏览器里点授权。其余全是我用中文跟 Claude Code 说一句话,它自己决定跑什么命令、跑完把结果整理给我看。
这是当天的原话,以及它在背后实际做的事:
| 我说的话(原话) | AI 在背后做的事 |
|---|---|
| 把 hey.com cli 用起来 | 找到官方项目,下载最新版并校验,安装 agent skill |
| paper_trail 里面无关紧要的邮件列出来,我想批量删除 |
hey box view --all 拉出 189 封,按发件人分成三类列给我看 |
| 1 | 选第 1 个方案:hey trash 删 86 封,再拉一次列表核对 |
| 还可以自动删除吗 | 查 hey screener history,比对哪些地址也寄账单,列出可以拒收的 20 个 |
| 要 |
hey screener deny 拒收这 20 个,再核对状态 |
| 8 个总结内容 |
hey thread read 逐封读 Screener 里待审的 8 封,认出 2 封钓鱼 |
| 只要处理这些:New for you | 判断哪些已过期、已付款,hey seen 和 hey move 归档,只留 9 封 |
| 处理一下 aside | 删广告,凭证移到 Paper Trail,待读的留着 |
| SemiAnalysis 做个总结吧,详细一点,然后保存到 obsidian | 读 8 篇长文,写成笔记,存进 Obsidian |
| 这个你帮我记一下,这两天我去更新发布一个 |
hey todo add 加一条待办,日期设在两天后 |
我的工作只有三种:提要求、看清单、说”要”或”不要”。命令行是给 AI 用的接口,不是给人用的。
hey-cli 是什么
hey-cli 是 HEY 官方的命令行工具(GitHub 上的 basecamp/hey-cli,MIT 协议),既是 CLI,也带一个终端界面(hey tui)。它能做的事基本覆盖了网页版:
- 看邮箱、读邮件、搜索、回复、写信、转发
- 管理 Screener(放行或拒收发件人)
- 移动、归档、删除、标记已读
- 标签、收藏夹、草稿、附件
- 日历、待办、日记
但它真正的设计目标写在官方说明里:主要给 AI agent 和脚本用。
为什么它特别适合 AI
我用下来,有三点设计特别对 agent 友好。
1. 默认输出结构化 JSON。 每条命令都返回 ok、data、summary,还有一个 breadcrumbs 字段,告诉你”下一步通常做什么”。比如没登录时,它直接提示下一步是 hey auth login。AI 不用去猜输出格式。
2. 内置 jq 过滤。 不用装 jq,直接 --jq:
hey box view imbox --limit 10 \
--jq '.data.postings[] | "\(.active_at[0:10]) \(.name)"'
另外还有 --markdown(读邮件时输出成 Markdown 文档)、--ids-only(只输出 ID,方便接管道)、--count。
3. 每条命令都带”给 agent 的说明”。 hey commands 会输出完整的命令目录,很多命令附有 agent_notes,把边界情况写得很清楚。比如:
-
trash用的是邮箱条目的 ID,不是邮件主题的 ID; - 一个
bundle行不是邮件,删它”返回成功但什么都没改”; -
todo add不带--date时,按 HEY 账户的时区算”今天”。
这些细节,正是 AI 最容易踩坑的地方。
五分钟上手
安装。 macOS 用 Homebrew,Arch/Omarchy 用 yay -S hey-cli,其他平台下载 GitHub release 的压缩包。我这边是让 Claude 装的:它下载最新的 release,校验 SHA-256 后放进 ~/.local/bin,不需要 sudo。
登录。 这一步要你自己来,因为要在浏览器里授权:
hey auth login
会打开浏览器走 OAuth(PKCE),凭证存进系统 keyring,自动续期。
装 agent skill。
hey skill install
它会把内置的 SKILL.md 装到 ~/.claude/skills/hey,Claude Code 之类的 agent 立刻就知道怎么用 HEY。
几个场景,以及背后的命令
下面的命令都是 AI 自己选、自己跑的。列出来是让你知道它在背后做了什么,你不需要记住它们。
整个过程就是一个循环:AI 拉数据、分类、列清单,我确认,它再执行和核对。
按发件人批量清理
先把一个邮箱的全部邮件拉下来,按发件人统计:
hey box view paper_trail --all \
--jq '.data.postings[] | .creator.email_address' | sort | uniq -c | sort -rn
AI 按”营销推广 / 过期通知 / 凭证收据”三类列给我看,我确认后:
hey trash <id1> <id2> ...
删掉的邮件进 Trash,后悔还能捡回来。
一劳永逸:在 Screener 拒收
删邮件是治标。HEY 的精髓是 Screener:拒收一个发件人,他以后的邮件就进不来了。hey-cli 能查到你过去每一个放行或拒收的决定(clearance),还能直接改:
hey screener history --all # 历史上所有放行/拒收决定
hey screener deny <clearance-id> # 改成拒收
hey screener deny <id> --spam # 拒收并标成垃圾邮件,顺带训练过滤器
我的 Screener 里攒了 1,884 个这样的决定。按年份一看,趋势很明显:
这里有个讲究:有些地址既发广告也发账单(比如 Cloudflare、Spotify)。AI 先比对”这个地址有没有发过我要保留的邮件”,有冲突的就不拒收。这一步人工做很烦,交给 AI 刚好。
清空”New For You”
hey seen <id>... # 过期活动、已付款的收据,标成已读
hey move <id>... --to paper_trail
最后只留下真正要处理的:孩子的缴费截止日、开发者账号保活、教堂排班。
把邮件变成知识
hey thread read <topic-id> --markdown
把 newsletter 输出成干净的 Markdown,交给 AI 总结,再写进 Obsidian。8 篇 SemiAnalysis,十分钟变成一篇带数据表格的精读笔记。
顺手记待办
hey todo add "Google Play:11-21 前发布更新" --date 2026-11-05
几个踩过的坑
前两个是 AI 自己撞上、自己查文档绕过去的,我是事后看记录才知道。
-
两种 ID 别搞混。 一封邮件有
topic_id(主题)和id(它在某个邮箱里的条目 ID)。trash、move、seen要的是后者。 -
邮件移动过以后,条目 ID 可能就变了。 遇到
not found,重新拉一次列表就好。 -
!跑的是非交互终端。 在 Claude Code 里用!跑需要交互输入的命令会失败,这时换个终端窗口,或者用--token、环境变量的方式。 - 删除和拒收都要人确认。 我的做法是:AI 列清单、给建议,我回一个”要”它才动手;删的东西进 Trash,拒收也随时可以改回放行。
结论
邮件客户端的发展方向,可能不是更漂亮的界面,而是 一个能被 AI 安全调用的接口。hey-cli 是我见过做得最认真的一个:结构化输出、agent_notes、一条命令装好 skill,都是为 agent 时代设计的。
邮箱这种”每天都在累积、又不值得花整块时间处理”的东西,最适合交给 AI。你说人话,做决定;它敲命令,跑腿。
— 汪晓明(蓝莲花)
转发此帖子?
与您的关注者分享。
回复