| name | email-skill |
| description | 邮件统一入口(纯路由层),自身不执行任何脚本与接口,识别用户意图后用 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 之前向用户追问账号选择,由系统拦截层统一处理。 |
| version | 0.2.0 |
| trigger_keywords | ["发邮件","发送邮件","写邮件","邮箱","email","send email","收邮件","查邮件","检查邮箱","收件箱","inbox","搜索邮件","查找邮件","下载附件","邮件附件","绑定邮箱","邮箱绑定","日报推送","天气推送","报告推送","提醒推送","邮件通知","邮件推送","推送到邮箱","消息留存","Agent邮箱","AI邮箱"] |
| exclude_when | ["操作与邮件完全无关(如日历、文件管理、聊天)","用户要求发送短信或站内信(非邮件渠道)"] |
Email Skill(统一邮件入口 / 纯路由层)
定位:email-skill 是所有邮件需求的唯一入口。它只做意图识别和路由分发,不执行任何脚本,不调用任何接口。识别用户意图后,直接用 read 工具读取下游 skill 的 SKILL.md 文件,由系统拦截层统一处理授权与绑定。
0. 核心原则
- 本 skill 不执行任何东西,只做意图识别和路由分发。
- 识别完意图后必须立即用
read 工具读取下游 skill 的 SKILL.md 文件,禁止用对话替代调用。
- 不要在用
read 工具读取 SKILL.md 之前向用户追问"用哪个邮箱""绑定了哪个邮箱"——所有账号选择、绑定状态、卡片弹出都由系统拦截层统一处理(必要时会自动弹出绑定/选择卡片)。
- 不要读默认邮箱、不要查 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 命中条件。收件人地址只是"发给谁",不等于用户指定了发送通道。但如果收件人是用户自己的 Agent 邮箱地址("发给自己"),应视为自留存场景,路由到 public-skill。仅当收件人是别人的 @agent.qq.com 地址时,才进入 L1 按"发给别人"处理(→ personal-mail-skill)。
关键:L0 只匹配显式表达。用户没说邮箱归属时,进入 L1。
1.2 L1:用户没指定邮箱时,发给自己还是发给别人?
仅当 L0 未命中时进入 L1。
| 用户场景特征 | 路由目标 |
|---|
| 收件人是用户自己(无第三方)+ 纯文本 + 不需要附件/抄送/HTML/收件箱搜索/下载附件 | public-skill |
| 典型语:"把这个总结发到我邮箱""日报推到我邮箱""天气推到我邮箱""帮我留存" | public-skill |
收件人是用户自己的 Agent 邮箱地址(形如用户自己的 xxx@agent.qq.com),意图为"发给自己" | public-skill |
收件人是第三方(同事/客户/朋友/其他人的 @agent.qq.com) | 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
3.5 Skill 文件查找路径(优先级从高到低)
用 read 工具读取下游 skill 的 SKILL.md 时,按以下顺序查找,找到即停:
路径约定:<HOME> 表示当前操作系统用户主目录(macOS/Linux: ~ 即 /Users/<user> 或 /home/<user>;Windows: %USERPROFILE% 即 C:\Users\<user>)。
- 当前用户本地目录:
<HOME>/.qclaw/skills/<skill-name>/SKILL.md
- 降级目录(依次尝试):
<HOME>/.openclaw/skills/<skill-name>/SKILL.md
<HOME>/.openclaw/workspace/skills/<skill-name>/SKILL.md
<HOME>/.agents/skills/<skill-name>/SKILL.md
<HOME>/.qclaw/skillhub-skills/<skill-name>/SKILL.md
规则:优先从 <HOME>/.qclaw/skills/ 读取;仅当该目录下找不到目标 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 地址,属于发给第三方,走 L1 → personal-mail-skill)
示例 5.5:L1 发给自己的 Agent 邮箱(自留存)
用户:"帮我发一封邮件给自己"(用户绑定的 Agent 邮箱地址是 maomaotou2521@agent.qq.com)
→ 用 read 工具读取 public-skill/SKILL.md(收件人是用户自己的 Agent 邮箱,属于"发给自己"场景)
用户:"把刚才的内容发到 maomaotou2521@agent.qq.com"(该地址恰好是用户自己的 Agent 邮箱)
→ 用 read 工具读取 public-skill/SKILL.md(收件人是用户自己的邮箱地址 = 自留存)
示例 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
- 未指定 + 发给自己 / 自留存(包括收件人恰好是自己的 Agent 邮箱) → 用
read 工具读取 public-skill/SKILL.md
- 未指定 + 发给别人 / 完整收发 → 用
read 工具读取 personal-mail-skill/SKILL.md