# Email Skill

> 邮件统一入口（纯路由层），自身不执行任何脚本与接口，识别用户意图后用 read 工具读取下游 skill 的 SKILL.md 路由到下游。【路由决策必读】两步决策：L0 用户是否显式指定邮箱通道？L1 若未指定，是发给自己/结果留存还是发给别人/完整收发？L0 显式：'Agent/AI 邮箱'→读取 agent-email/SKILL.md；'用我的 QQ/163/Gmail/Outlook'→读取 imap-smtp-email/SKILL.md；'发到我邮箱/推到我邮箱/保存到邮箱'→读取 public-skill/SKILL.md。L0 未指定 → L1：发给自己/结果留存→读取 public-skill/SKILL.md；发给别人/完整收发→读取 personal-mail-skill/SKILL.md。绝不在 read 工具读取 SKILL.md 之前向用户追问账号选择，由系统拦截层统一处理。

- Skill: `infometa/email-skill-2` (Agent Skill)
- Install (CLI): `npx skillmds@latest add infometa/email-skill-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/infometa/email-skill-2/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: infometa (https://skillmd.com/u/infometa)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/infometa/email-skill-2

---


# Email Skill（统一邮件入口 / 纯路由层）

> **定位**：`email-skill` 是所有邮件需求的**唯一入口**。它**只做意图识别和路由分发**，不执行任何脚本，不调用任何接口。识别用户意图后，**直接用 `read` 工具读取下游 skill 的 `SKILL.md` 文件**，由系统拦截层统一处理授权与绑定。

## 0. 核心原则

1. **本 skill 不执行任何东西**，只做意图识别和路由分发。
2. **识别完意图后必须立即用 `read` 工具读取下游 skill 的 `SKILL.md` 文件**，禁止用对话替代调用。
3. **不要在用 `read` 工具读取 `SKILL.md` 之前向用户追问"用哪个邮箱""绑定了哪个邮箱"**——所有账号选择、绑定状态、卡片弹出都由系统拦截层统一处理（必要时会自动弹出绑定/选择卡片）。
4. **不要读默认邮箱、不要查 4230 接口、不要做账号探测**——这些是下游 skill（特别是 `personal-mail-skill`）的职责。

## 1. 路由决策（两步法）

```
用户邮件需求
       │
       ▼
   L0 显式指定邮箱通道？
   ├─ 是 → 按 L0 表查
   └─ 否 → L1 发给自己 or 发给别人？
              ├─ 自己 / 结果留存 → public-skill
              └─ 别人 / 完整收发 → personal-mail-skill
```

### 1.1 L0：用户是否**显式**指定了邮箱通道？

| 用户表达信号 | 路由目标 | 说明 |
|-------------|---------|------|
| 提到 **"Agent 邮箱""AI 邮箱""专属邮箱"**，或明确要求**"用 Agent 邮箱发/查"** | `agent-email` | QClaw 专属代收代发通道 |
| 提到 **"用我的 QQ / 163 / Gmail / Outlook / Foxmail / Yahoo / 网易邮箱 发"** | `imap-smtp-email` | 用户明确指定了自己的私邮通道 |
| 提到 **"发到我邮箱""推到我邮箱""保存到邮箱""推送到邮箱"** | `public-skill` | 平台公邮（零配置自留存通道） |

> **注意**：收件人地址包含 `@agent.qq.com`（如 `xxx@agent.qq.com`）**不构成 L0 命中条件**。收件人地址只是"发给谁"，不等于用户指定了发送通道。此类场景应进入 L1 判断（发给别人 → `personal-mail-skill`），由二级路由根据用户绑定情况决定使用哪个通道发送。

> **关键**：L0 只匹配**显式表达**。用户没说邮箱归属时，进入 L1。

### 1.2 L1：用户没指定邮箱时，发给自己还是发给别人？

仅当 L0 未命中时进入 L1。

| 用户场景特征 | 路由目标 |
|-------------|---------|
| 收件人是用户**自己**（无第三方）+ 纯文本 + 不需要附件/抄送/HTML/收件箱搜索/下载附件 | `public-skill` |
| 典型语：**"把这个总结发到我邮箱""日报推到我邮箱""天气推到我邮箱""帮我留存"** | `public-skill` |
| 收件人是**第三方**（同事/客户/朋友/...） | `personal-mail-skill` |
| 需要**附件 / 抄送 cc / 密送 bcc / HTML 邮件** | `personal-mail-skill` |
| 需要**收件箱查询 / 搜索邮件 / 拉取详情 / 标记已读未读** | `personal-mail-skill` |
| 需要**下载附件** | `personal-mail-skill` |

> **personal-mail-skill 是什么？** 它是"完整收发型邮件"的二级路由层，里面会根据用户的默认邮箱偏好和实际绑定情况，再次路由到 `agent-email` 或 `imap-smtp-email`。**你不需要知道里面的细节**，直接用 `read` 工具读取 `personal-mail-skill/SKILL.md` 即可。

## 2. 下游 skill 职责一览

| 下游 skill | 角色 | 你不需要关心的细节 |
|------------|------|--------------------|
| `public-skill` | 平台公邮（零配置自留存） | 公邮绑定状态、配额 |
| `personal-mail-skill` | 完整收发的二级路由层 | 默认邮箱偏好、Agent vs 私邮选择、未绑定时的卡片 |
| `agent-email` | QClaw Agent 邮箱通道 | OAuth 授权状态 |
| `imap-smtp-email` | IMAP/SMTP 私邮通道 | 账号选择、凭证刷新 |

> 在本 skill 里你**只需要决定路由到 `public-skill` / `personal-mail-skill` / `agent-email` / `imap-smtp-email` 之一**，绝大多数 L1 场景应路由到 `public-skill` 或 `personal-mail-skill`。`agent-email` 和 `imap-smtp-email` 通常只在 L0 显式指定时使用。

## 3. 路由动作（执行规范）

确定路由目标后，**立即用 `read` 工具读取目标 skill 的 `SKILL.md` 文件**：

- L0 命中 Agent → 用 `read` 工具读取 `agent-email/SKILL.md`
- L0 命中具体私邮 → 用 `read` 工具读取 `imap-smtp-email/SKILL.md`
- L0 命中"发到我邮箱" → 用 `read` 工具读取 `public-skill/SKILL.md`
- L1 自己 / 结果留存 → 用 `read` 工具读取 `public-skill/SKILL.md`
- L1 别人 / 完整收发 → 用 `read` 工具读取 `personal-mail-skill/SKILL.md`

### 读取后的继续执行规则

- **读取 `agent-email/SKILL.md`、`imap-smtp-email/SKILL.md` 或 `public-skill/SKILL.md` 后**：直接执行该文件中的指令，完成邮件发送/查询操作。
- **读取 `personal-mail-skill/SKILL.md` 后**：该文件是一个二级路由层，**你必须继续执行该文件中的路由动作**——它会告诉你下一步该读取 `agent-email/SKILL.md` 还是 `imap-smtp-email/SKILL.md`。**不要在此步骤回复用户或停止，必须继续 read 下一个 SKILL.md。**

**禁止行为**：
- ❌ 在用 `read` 工具读取 `SKILL.md` 之前向用户追问"你想用哪个邮箱"
- ❌ 在用 `read` 工具读取 `SKILL.md` 之前自己读取默认邮箱配置
- ❌ 在用 `read` 工具读取 `SKILL.md` 之前查询 4230 接口
- ❌ 在用 `read` 工具读取 `SKILL.md` 之前先执行任何 imap-smtp-email / agent-email 的内部脚本
- ❌ 用文字回复替代读取 `SKILL.md`
- ❌ 只"理解"路由逻辑但不实际读取 `SKILL.md`
- ❌ 读取 `personal-mail-skill/SKILL.md` 后就停止，不继续执行其中的路由动作

如果你**不确定路由到哪个**：
- 优先按 L1 给 `personal-mail-skill`（系统拦截层会处理后续）
- 仅在用户场景明显是"自留存"时才路由到 `public-skill`

## 4. 场景示例

### 示例 1：L0 命中 Agent 邮箱

> 用户："帮我看下 Agent 邮箱有没有新邮件"

→ 用 `read` 工具读取 `agent-email/SKILL.md`

### 示例 2：L0 命中具体私邮

> 用户："用我的 Gmail 给客户发一封报价"

→ 用 `read` 工具读取 `imap-smtp-email/SKILL.md`

### 示例 3：L0 命中自留存

> 用户："把这段总结发到我邮箱"

→ 用 `read` 工具读取 `public-skill/SKILL.md`

### 示例 4：L1 发给自己（自留存场景）

> 用户："查一下深圳明天天气，发到我邮箱"

→ 用 `read` 工具读取 `public-skill/SKILL.md`

> 用户："每天下班把日报推到我邮箱"

→ 用 `read` 工具读取 `public-skill/SKILL.md`

### 示例 5：L1 发给别人（完整收发）

> 用户："给客户 alice@example.com 发一封会议确认邮件"

→ 用 `read` 工具读取 `personal-mail-skill/SKILL.md`

> 用户："给团队发周报，抄送 PM，附上 Q3 报表"

→ 用 `read` 工具读取 `personal-mail-skill/SKILL.md`

> 用户："帮我发一封邮件给 haikuotiankong4877@agent.qq.com，标题测试"

→ 用 `read` 工具读取 `personal-mail-skill/SKILL.md`（收件人地址含 `@agent.qq.com` **不等于**用户指定了 Agent 邮箱通道，这里是发给第三方，走 L1）

### 示例 6：L1 收件箱操作（属于完整收发能力）

> 用户："查一下最近两小时的发票邮件"

→ 用 `read` 工具读取 `personal-mail-skill/SKILL.md`

> 用户："下载那封邮件的附件"

→ 用 `read` 工具读取 `personal-mail-skill/SKILL.md`

## 5. 一句话记忆

- **显式说"用 Agent / AI 邮箱"** → 用 `read` 工具读取 `agent-email/SKILL.md`
- **显式说"用我的 QQ / 163 / Gmail / Outlook"** → 用 `read` 工具读取 `imap-smtp-email/SKILL.md`
- **"发到我邮箱 / 推到我邮箱 / 保存到邮箱"** → 用 `read` 工具读取 `public-skill/SKILL.md`
- **未指定 + 发给自己 / 自留存** → 用 `read` 工具读取 `public-skill/SKILL.md`
- **未指定 + 发给别人 / 完整收发** → 用 `read` 工具读取 `personal-mail-skill/SKILL.md`

