mcpField
E
email-triage

email-triage

github.com/joelhooks生产力6553 次安装3 天前更新
代码仓库

关于 email-triage

email-triage 是一项使用 joelclaw email CLI 处理 Front 邮件的技能,供需要整理收件箱的人使用。它涵盖重要性分类、会话阅读与归档,并提供查询和批量操作指南。

主要功能

  1. 01扫描并筛选收件箱会话
  2. 02按重要性分类邮件
  3. 03读取会话与附件缓存
  4. 04按 ID 或查询批量归档
  5. 05提供 Front 搜索筛选指南

适用场景

  1. 01找出需要回复或采取行动的邮件
  2. 02整理低价值通知和营销邮件
  3. 03检查特定发件人或日期范围的邮件

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/joelhooks/joelclaw --skill email-triage

安装后在 Claude Code 中输入/email-triage确认已加载。

附带文件agents/openai.yamlassets/small-logo.svg

详细介绍

邮件分类

扫描 Joel 的电子邮件收件箱(Front),按重要性对会话进行分类,归档无关邮件,并找出需要关注的项目。所有操作均使用 joelclaw email CLI。

标准邮件接口

  • Front 是 joelclaw 中所有邮件分类操作的标准接口。
  • 切勿使用 gog gmail 进行邮件分类——[email protected]、VIP 会话和所有收件箱都在 Front 中。
  • 使用 gog 执行 Google Workspace 操作(Calendar、Drive、Docs 等),而非邮件分类。

Front 搜索 API 参考

搜索端点为 GET /conversations/search/{url_encoded_query}。 结果按最后活动日期排序(不可配置)。

有效的 is: 状态

open、archived、assigned、unassigned、snoozed、trashed、unreplied、waiting、resolved

没有 is:unread。 对于最后一条消息为收到的消息的会话,请使用 is:unreplied。

状态冲突(不能组合使用):

  • archived ↔ open ↔ trashed ↔ snoozed(互斥)
  • assigned ↔ unassigned(互斥)
日期筛选器——仅限 UNIX 时间戳
  • before:<unix_seconds> — 在此时间戳之前创建的消息/评论
  • after:<unix_seconds> — 在此时间戳之后创建的消息/评论
  • during:<unix_seconds> — 与此时间戳同一天的消息/评论

Front 不接受 before:YYYY-MM-DD——务必转换为 Unix 秒数。 CLI 的 --before 和 --after 标志接受 YYYY-MM-DD 并自动转换。

收件人筛选器
  • from:<handle> — 发件人(电子邮件、社交账号)
  • to:<handle> — 收件人(包括 to/cc/bcc)
  • cc:<handle>、bcc:<handle> — 指定字段
  • recipient:<handle> — 任意角色(from、to、cc、bcc)
  • 相同类型的多个筛选器采用 OR 逻辑:from:[email protected] from:[email protected] → 任意一个
  • 不同类型的筛选器采用 AND 逻辑:from:[email protected] to:[email protected] → 两者都匹配
实体筛选器(使用 ID,而非名称)
  • inbox:<inbox_id> — 例如 inbox:inb_41w25
  • tag:<tag_id> — 例如 tag:tag_13o8r1
  • assignee:<teammate_id> — 例如 assignee:tea_hjx3
  • participant:<teammate_id>、author:<teammate_id>、mention:<teammate_id>、commenter:<teammate_id>
  • contact:<contact_id>、link:<link_id>
  • custom_field:"<name>=<value>"
自由文本

不带前缀的词语会搜索主题和正文。短语请使用引号:"exact phrase"。

不支持否定

Front 搜索不支持否定——没有 -from:、NOT 或排除运算符。

每条查询最多 15 个筛选器。

CLI 命令

扫描收件箱
joelclaw email inbox                          # default: is:open, 50 results
joelclaw email inbox -n 100                   # more results
joelclaw email inbox -q "is:open is:unreplied"  # awaiting reply
joelclaw email inbox --from [email protected]  # by sender
joelclaw email inbox --before 2026-02-01      # auto-converts to unix ts
joelclaw email inbox --after 2026-01-15       # auto-converts to unix ts
joelclaw email inbox --page-token "TOKEN"     # pagination (from previous response)

可组合使用标志:

joelclaw email inbox --from [email protected] --after 2026-02-01 -n 20
归档单条会话
joelclaw email archive --id cnv_xxx
按 ID 批量归档(快速、并行、分批)
joelclaw email archive-ids --ids cnv_abc,cnv_def,cnv_ghi

会运行 10 个并发请求。适合对一页搜索结果进行分类——找出无关邮件的 ID 并批量归档。

按查询批量归档(默认仅模拟运行)
joelclaw email archive-bulk -q "is:open from:[email protected]"           # dry run — shows count + sample
joelclaw email archive-bulk -q "is:open from:[email protected]" --confirm  # execute
joelclaw email archive-bulk -q "is:open from:[email protected]" --limit 100 --confirm  # batch size
阅读会话
joelclaw email read --id cnv_xxx
joelclaw email read --id cnv_xxx --refresh   # bypass local cache

joelclaw email read 使用本地会话和附件缓存(默认 TTL:60 分钟)。缓存路径:~/.cache/joelclaw/email/。使用 --refresh 可绕过缓存,强制从 Front 重新获取。

阅读结果结构 + jq 模式

joelclaw email read 返回:

result.conversation: {id, subject, status, from: {name, email}, date, tags}
result.messages[]: {id, from: {name, email}, date, is_inbound, body_preview (or body), attachments[]}
result.attachment_summary: {total, cached, metadata_only, cache_errors}
result.cache: {hit, source, cache_path, age_seconds, ttl_seconds}

目前消息内容位于 body_preview 中,正在迁移到 body。为保持向后兼容,请将两者都视为有效字段。

正确的提取模式(当前字段):

joelclaw email read --id cnv_xxx 2>&1 | jq '.result.messages[] | {from: .from.email, date: .date, body: .body_preview}'

兼容新旧字段的提取模式:

joelclaw email read --id cnv_xxx 2>&1 | jq '.result.messages[] | {from: .from.email, date: .date, body: (.body // .body_preview)}'
列出收件箱
joelclaw email inboxes

分类工作流

1. 加载收件箱状态
joelclaw email inbox -n 50

解析 JSON 结果。每个会话包含:id、subject、from(姓名 + 电子邮件)、date、status、tags。

实用的后续查询:

joelclaw email inbox -q "is:open is:unreplied" -n 50   # awaiting reply
joelclaw email inbox --before 2026-01-01 -n 50          # old stuff to clean
joelclaw email inbox --from [email protected]    # CI noise check
2. 根据推断分类

阅读每段对话,并根据发件人、主题和上下文判断其类别。不要使用硬编码的域名列表。请酌情判断:

  • 需要回复 — 期待回复的真实人物。包括同事、合作者、朋友,以及发来私人消息的业务联系人。留意回复邮件线程(Re:)、问题、针对具体会议的邀请和请求。
  • 稍后阅读 — 值得保存的有趣内容。Joel 主动订阅的新闻简报(The Information、Astral Codex Ten、Lenny's Newsletter)、行业新闻和技术深度文章。
  • 需要操作 — 需要采取行动,但无需回复。账单、安全提醒、即将到期的试用、税务文件、真实订单的配送更新,以及需要 RSVP 的日历邀请。
  • 归档 — 没有价值的内容。营销垃圾邮件、促销优惠、冷邮件推销、重复通知、已解决的提醒、无人阅读的自动报告,以及供应商的追加销售。
3. 呈现分类摘要

为 Joel 整理结果。优先呈现重要内容:

## 🔴 Reply needed (N)
- **Name** — Subject (why it needs a reply)

## ⚡ Actionable (N)
- **Sender** — Subject (what action)

## 📖 Read later (N)
- **Source** — Subject

## 🗑️ Archive candidates (N)
- Count by type (e.g., "14 marketing, 8 CI failures, 5 duplicate notifications")
4. 执行决策

**最快清理噪声的方法:**扫描一页,收集噪声 ID,然后使用 archive-ids:

joelclaw email archive-ids --ids cnv_aaa,cnv_bbb,cnv_ccc,cnv_ddd

**按发件人清理:**使用带有 from: 筛选条件的 archive-bulk:

joelclaw email archive-bulk -q "is:open from:[email protected]" --limit 100 --confirm

**速率限制:**Front 允许约 50 req/s。归档大量邮件(>200)时,请在批次之间添加暂停,否则可能遇到 429 错误。CLI 会为 archive-ids 分批处理(并发数为 10),但 archive-bulk 会逐页迭代,处理极大量邮件时可能触及限制。

先阅读,再做决定:

joelclaw email read --id cnv_xxx

重要背景

  • Joel 在 8 个 Front 收件箱中收件,分别对应 [email protected]、[email protected]、[email protected]、[email protected]、[email protected]、LinkedIn、DM 和 Inngest
  • joelclaw email inboxes 会列出所有收件箱及其 ID
  • Joel 的队友 ID:tea_hjx3
  • CLI 会通过 secrets lease front_api_token 自动处理 Front API 身份验证
  • 回复应先起草,再等待批准——绝不要直接发送
  • Front 搜索结果最终才会保持一致——最近归档的项目可能还会在搜索结果中显示几分钟
  • 分页:有更多结果时,响应会包含 next_page_token;通过 --page-token 传入
  • 主题前缀 [aih] 表示来自 [email protected] Google Group 的 AI Hero 项目邮件线程。关键参与者:Alex Hillman([email protected])、Matt Pocock([email protected])、Amy Hoy([email protected])。将其视为 VIP:始终突出显示,绝不归档。

“需要回复”的信号

这些是判断依据,不是规则。请逐一酌情判断:

  • 以 Re: 开头,且发件人是真实人物(而非机器人或 noreply 地址)
  • 以 [aih] 开头——来自 [email protected] 的 AI Hero 合作邮件(Alex Hillman、Matt Pocock、Amy Hoy)。VIP:始终突出显示,绝不归档。
  • 主题行中有直接提问
  • 来自熟人的会议邀请
  • Joel 是上一封邮件的发件人,且有人回复了他
  • Slack 通知摘要(可能表示有错过、值得查看的对话)

“归档”的信号

  • 发件人为 noreply@、no-reply@、notifications@,且内容无需采取行动
  • 营销主题模式:“LAST chance”、“% off”、“deal”、“unlock”、“limited time”
  • 重复的对话(同一发件人发送的相同主题邮件——除最新一封外全部归档)
  • 已解决的监控提醒(主题中包含 RESOLVED)
  • 超过 24h 的 CI 失败通知(已过时——可能已经修复,也可能不会修复)
  • 未知发件人使用推销话术发送的冷邮件

常见噪声发件人(批量归档候选项)

这些发件人历史上发送量大,但信号价值低。使用带有 from: 筛选条件的 archive-bulk:

[email protected]        — CI failures, dependabot, PR notifications
[email protected]   — resolved uptime alerts
[email protected]  — neighborhood spam

务必先试运行,确认查询结果符合预期。

评论

支持 Markdown