Gmail 自動標籤
目標
擷取收件匣郵件,透過平行子代理分類為「需要採取行動」/「等待回覆」/「參考資料」,並透過 Gmail API 批次套用標籤。
腳本
./scripts/gmail_label_fetch.py- 擷取郵件摘要為精簡 JSON./scripts/gmail_label_split.py- 將郵件分割為 N 個區塊以進行平行分類./scripts/gmail_label_merge.py- 合併分類後的區塊為單一 labels.json./scripts/gmail_label_apply.py- 批次套用標籤分類
子代理
email-classifier— 定義於.claude/agents/email-classifier.md- 模型:Sonnet 4.5(快速、成本效益高的分類)
- 每個子代理讀取一個區塊,寫入一個分類輸出檔案
流程(平行 — 預設)
步驟 1:擷取郵件
python3 .claude/skills/gmail-label/scripts/gmail_label_fetch.py \
--account ACCOUNT --query "in:inbox" --limit 100 --output .tmp/emails.json
步驟 2:分割為區塊
python3 .claude/skills/gmail-label/scripts/gmail_label_split.py \
--input .tmp/emails.json --chunks 10 --output-dir .tmp/chunks
步驟 3:平行分類(產生 10 個子代理)
在背景中產生 10 個 email-classifier 子代理,每個處理一個區塊。每個子代理:
- 讀取
.tmp/chunks/chunk_N.json - 分類每封郵件
- 寫入
.tmp/chunks/classified_N.json
使用 Task 工具搭配 run_in_background: true 和 model: "sonnet"。在單一訊息中啟動所有 10 個以實現真正的平行處理:
對於每個區塊 0-9,產生一個 Task:
subagent_type: "email-classifier"
model: "sonnet"
run_in_background: true
prompt: "讀取 /absolute/path/.tmp/chunks/chunk_N.json,分類每封郵件,將結果寫入 /absolute/path/.tmp/chunks/classified_N.json"
關鍵:不要使用 TaskOutput 來讀取子代理結果。 子代理會將結果寫入檔案 — 主代理不需要看到分類資料。讀取 TaskOutput 會淹沒上下文視窗,並在處理大量郵件(500 封以上)時導致「提示過長」錯誤。
改為輪詢檔案是否存在:
# 等待所有分類檔案存在(逾時 120 秒後)
for i in $(seq 0 9); do
while [ ! -f ".tmp/chunks/classified_$i.json" ]; do sleep 2; done
done
然後直接進行步驟 4(合併)。
步驟 4:合併分類結果
python3 .claude/skills/gmail-label/scripts/gmail_label_merge.py \
--input-dir .tmp/chunks --output .tmp/labels.json
步驟 5:套用標籤
python3 .claude/skills/gmail-label/scripts/gmail_label_apply.py \
--account ACCOUNT --input .tmp/labels.json
分類指南
需要採取行動:
- 需要驗證的安全性警示
- 具有截止日期的信用卡到期 / 網域續約通知
- Slack @提及提出的問題
- 需要打招呼的新團隊成員(Slack 加入通知)
- 需要回覆的客戶郵件
- 商家資訊更新(Google Business Profile、Bing Places)
- Stripe 需要採取動作的通知
等待回覆:
- 等待回覆的銷售開發郵件
- 等待解決的支援單
- 已送出、等待回覆的提案
參考資料:
- 行銷電子報(DigitalMarketer 等)
- 慈善/非營利電子報(RAPS 等)
- Google Business Profile 成效報告
- 促銷優惠(Blinkist、特賣等)
- 平台更新通知(Google Play、Apify 等)
- 確認碼(已使用)
- 房地產電子報(Westbank 等)
- 遊戲帳戶郵件(Riot Games 等)
- 資訊性安全警示(已開啟雙重驗證等)
- 健康建議
- 法律/政策更新通知
帳戶註冊
帳戶儲存在工作區根目錄的 gmail_accounts.json 中。每個帳戶需要:
email- Gmail 地址token_file- OAuth 權杖檔案路徑
新增帳戶
python3 .claude/skills/gmail-inbox/scripts/gmail_multi_auth.py --account ACCOUNT_NAME --email EMAIL
效能
- 序列流程:100 封郵件約 36 秒(擷取 1 秒 + 分類 34 秒 + 套用 1 秒)
- 平行流程:100 封郵件約 30 秒(分類 19 秒 + 合併 <1 秒 + 套用約 10 秒)
- 分類是瓶頸;10 個平行子代理將其從 34 秒降至 19 秒(約 1.8 倍加速)
- 子代理啟動開銷(約 4 秒交錯)限制了理論增益
- 套用步驟可能因 Gmail API 速率限制而有所變動
結構
輸入
| 名稱 | 類型 | 必填 | 描述 |
|---|---|---|---|
account | string | 是 | 註冊表中的 Gmail 帳戶名稱 |
query | string | 否 | Gmail 搜尋查詢(預設:'in:inbox') |
limit | integer | 否 | 要分類的最大郵件數(預設:100) |
chunks | integer | 否 | 平行分類的區塊數(預設:10) |
輸出
| 名稱 | 類型 | 描述 |
|---|---|---|
labels_applied | object | 每個類別的計數:需要採取行動、等待回覆、參考資料 |
憑證
| 名稱 | 來源 |
|---|---|
credentials.json | 檔案 |
token_*.json | 檔案(自動產生) |
可組合使用
與此技能搭配良好的技能:gmail-inbox
成本
Claude Sonnet API 用於分類