為什麼 Email 是 Agent 最好的介面
Email 是世界上最普及的溝通介面。不需要安裝任何 SDK,不需要申請帳號,每個人都已經有一個地址。對開發者來說,Email 早已是基礎設施的一部分:用戶註冊驗證、訂單通知、發票寄送——這些場景無處不在。
但 agent 對 Email 的需求和過去的通知系統完全不同。客服 agent 需要接收客戶的問題並回覆;發票處理 agent 需要讀取附件、提取數字、更新系統;帳號驗證 agent 需要確認郵件內容是否符合規則。隨著 agent 承擔更多真實工作,Email 從「通知管道」變成了「工作介面」。
理解這個轉變,需要先釐清 chatbot 和 agent 最根本的差異:
Chatbot——現在回答,或什麼都不做。它活在即時對話的框架裡,你等它,它等你,沒有對話就沒有行動。
Agent——按自己的節奏工作。接到一封 Email,可以花一小時查三個系統、比對資料、評估風險,最後才回覆一封完整的答案。它可以排定後續任務、把邊緣案例轉交人工處理、在你睡覺的時候繼續工作。
Email 的非同步天性,剛好完美匹配 agent 的工作模式。這正是 Cloudflare 在 Agents Week 發布 Email Service 時強調的核心洞察。
1. 無需客戶安裝任何東西——對方只需要有 Email 帳號,不需要下載 app、不需要 API 金鑰、不需要建立帳號。覆蓋範圍是 100% 的企業用戶。
2. 天然非同步——agent 可以花多久時間就花多久。沒有 timeout 壓力,沒有「用戶在等」的即時性限制。查資料庫、呼叫外部 API、等待第三方確認——全都可以。
3. 天然的 human-in-the-loop——客戶在等待期間保留完整主動權:可以追加說明、可以取消請求、可以轉發給同事。Email 對話串就是天然的稽核日誌。
Email Sending:Public Beta 開放
Cloudflare Email Sending 在 Agents Week 正式從 Private Beta 升級為 Public Beta,任何人都可以申請使用。核心功能是讓 Workers 透過原生 binding 直接發送交易型 Email——不需要第三方 SMTP 服務,不需要管理 API 金鑰,不需要在 code 裡處理 credentials。
export default {
async fetch(request, env, ctx) {
await env.EMAIL.send({
to: "user@example.com",
from: "notifications@your-domain.com",
subject: "訂單已出貨",
text: "您的訂單 #1234 已出貨,預計 3 天內送達。"
});
return new Response("Email sent");
},
};
SPF、DKIM、DMARC 全部自動配置。把 domain 加入 Cloudflare Email Service 後,系統自動設定所有必要的 DNS 記錄,不需要手動處理 email authentication——這三個縮寫困擾了無數開發者,現在 Cloudflare 把它們藏在抽象層之下。
Email Sending 加上 Email Routing(已免費提供多年),Cloudflare 現在提供了完整的雙向 Email 基礎設施:收信(Routing)+ 發信(Sending),都在同一個平台,都透過 Workers 控制,都不需要獨立的 Email 服務帳號。
已全面開放申請
配置無需手動
原生 binding 處理
對 agent 開發者來說,最重要的意義是:以前 agent 可以透過 Email Routing 接收郵件,但回覆只能同步回覆(轉送給 Cloudflare 帳號成員),無法自由寄出到任意地址。Email Sending 的 Public Beta 打破了這個限制——現在 agent 可以真正「收一封、思考、回一封」,循環完整閉合。
Agents SDK:onEmail Hook 完整管線
Cloudflare Agents SDK 早已內建 onEmail hook,讓 agent 以 first-class 的方式接收和處理 inbound Email。Email Sending 的加入,讓整個管線真正完整:接收、處理、持久化、回覆,全部在一個 Agent class 裡。
export class SupportAgent extends Agent {
async onEmail(email: AgentEmail) {
const raw = await email.getRaw();
const parsed = await PostalMime.parse(raw);
// 持久化狀態(跨 session 存活,Durable Objects 後端)
this.setState({
ticket: {
from: email.from,
subject: parsed.subject,
body: parsed.text,
messageId: parsed.messageId,
},
});
// 踢起非同步任務(可以花幾小時處理)
// await this.scheduleTask(...)
// 回覆(可以在這裡,也可以在 Queue handler 裡)
await this.sendEmail({
binding: this.env.EMAIL,
from: "support@yourdomain.com",
to: this.state.ticket.from,
inReplyTo: this.state.ticket.messageId,
subject: `Re: ${this.state.ticket.subject}`,
text: "已收到您的訊息,我們將盡快處理。",
});
}
}
這段 code 看起來直白,但背後藏著三個關鍵設計決策:
support@yourdomain.com 直接路由到 "support" agent instance。更強大的是 sub-addressing:notifications+user123@yourdomain.com 可以把 user123 作為 namespace 或 instance ID,讓同一個 Agent class 處理不同用戶的郵件串,每個用戶都有自己隔離的狀態和對話歷史。不需要在 code 裡解析路由邏輯,地址結構本身就是路由規則。
setState() 呼叫背後是 Durable Objects 的持久化存儲。Agent 記住每一封郵件的聯絡人資訊、對話歷史、處理進度,不需要獨立的資料庫。下一封來自同一地址的郵件,agent 可以取出完整上下文繼續處理——這才是真正的「對話型 agent」,而不是每次都重新開始的無狀態函數。
把這三個設計放在一起,你得到的不只是「能收發 Email 的 Worker」,而是一個真正具備對話記憶、安全隔離、可長期運作的 email agent 基礎設施。
Email MCP + Wrangler CLI:任意 Agent 都能用
Email Service 不是只給部署在 Cloudflare 上的 agent 用的。現實是:大量 agent 跑在其他地方——Claude Code、Cursor、Copilot 跑在本機;生產 agent 跑在 containers 或外部雲端。Cloudflare 提供了兩個接入路徑,讓任何有工具呼叫能力的 agent 都能使用 Email Service。
透過 Cloudflare MCP server 存取 Email API,使用同一個驅動 Agent Lee 的 Codemode-powered server。任何支援 MCP 的 coding agent 都可以接入。一個典型的 prompt:「Build 完成時發通知到 hello@example.com」——agent 直接呼叫 Email MCP tool,不需要你寫任何 glue code。
適合有 bash 存取的 agent,或者想避免 MCP context window 開銷的場景。wrangler email send 從幾乎零 context overhead 開始,agent 按需 discover capabilities。對 bash-capable agent 來說,這是最輕量的接入方式。
wrangler email send \ --to "teammate@example.com" \ --from "agent@your-domain.com" \ --subject "Build completed" \ --text "The build passed. Deployed to staging."
除了 MCP server 和 CLI,Cloudflare 同步發布了 Cloudflare Email Service Skill——一份給 coding agent 用的完整指引,涵蓋 Workers binding 配置、透過 REST API 發信、用 Email Routing 處理 inbound、用 Agents SDK 建構完整管線、透過 Wrangler 和 MCP 管理、以及 deliverability 最佳實踐。
Skill 的設計邏輯是:coding agent(Claude Code、Cursor 等)本身不知道怎麼正確使用 Email Service,但如果你把 Skill inject 進去,agent 就有了足夠的 context 做出正確的實作決策——包括什麼時候用 binding、什麼時候用 REST API、如何處理 bounce。
Agentic Inbox:開源的 Email Agent 參考實作
在 Private Beta 期間,Cloudflare 發現一個共同的需求:人們希望能看見 agent 在做什麼。最自然的方式是什麼?一個完整的 email client,但裡面有 agent automations 內建進去。這就是 Agentic Inbox——Cloudflare 開源的 Email Agent 參考實作。
Agentic Inbox 的技術棧展示了 Cloudflare 自家產品的整合能力:Email Routing(inbound 收信)+ Email Sending(outbound 發信)+ Workers AI(郵件分類與摘要)+ R2(附件儲存)+ Agents SDK(有狀態的業務邏輯)。每個元件都是標準的 Cloudflare 產品,沒有引入外部依賴。
Email for Agents 把「chatbot」和「agent」之間最清晰的界限說出來了:chatbot 現在回答或不回答,agent 按自己的節奏工作。收信、思考一小時、查三個系統、然後完整回覆——這才是真正能替你工作的 agent。
Email 的非同步天性剛好完美匹配 agent 的工作模式。更重要的是,Email 的「人人都有帳號」特性,讓 agent 可以直接服務你的客戶、供應商、合作夥伴——不需要他們安裝任何東西,不需要他們改變任何習慣。這是 chatbot 無法做到的滲透率。
Agentic Inbox 的 MCP server 設計尤其值得注意:它是「agent 幫你草擬、你來審核發送」的最佳實踐示範,把 human-in-the-loop 做成了產品功能,而不是妥協。
快速開始:三條路徑
根據你的使用場景,有三條不同的接入路徑:
wrangler.jsonc 加入 [[send_email]] binding,然後在 Worker 裡直接呼叫 env.EMAIL.send()。適合已有 Workers 的專案,想加上 Email 通知能力,5 分鐘內可以跑通。
Agent class,實作 onEmail hook 接收,呼叫 sendEmail() 回覆,用 setState() 持久化狀態,整個收發管線在一個 class 裡。適合需要對話歷史、多輪處理、非同步任務的 email agent。
{
"send_email": [
{
"name": "EMAIL",
"destination_address": "notifications@your-domain.com"
}
]
}
加上 binding 後,你的 Worker 裡就有 env.EMAIL 可用——呼叫 env.EMAIL.send() 就能發信,SPF/DKIM/DMARC 全自動處理。配合 Email Routing 設定收信規則,雙向 Email 管線就完整了。
前往 developers.cloudflare.com/email-service 申請 Email Sending Public Beta 存取權,或直接 fork Agentic Inbox 開始探索完整的 email agent 架構。Email Routing 無需申請,在 Cloudflare 儀表板的 Email 區塊直接設定即可。