技術 約5分で読めます

Cloudflare Email Serviceがパブリックベータに。エージェントからメールを送受信する

いけさん目次

Cloudflare Email Serviceがパブリックベータになった。
プライベートベータから始まって顧客サポートエージェント、請求書処理、本人確認フローなどの実例を積み上げ、今回一般公開された。

Agents Weekの一連の発表は Sandboxes GA・Durable Object Facets・統合CLIMesh・エンタープライズMCP参照アーキテクチャProject Think・Browser Run・Workflows v2 と続いてきたが、Email Serviceはその締めに位置する。
エージェントがユーザーの「いつもいる場所」に出向くという発想で、その場所のひとつが受信トレイだ。

送信側:Workers bindingとREST API

メール送信の仕組みから整理する。
Workers Paid プランで利用できる。

wrangler.jsonc に以下のbindingを追加すると、Workers内から env.EMAIL.send() でメールを送れるようになる。

"send_email": [{"name": "EMAIL"}]
export default {
  async fetch(request, env, ctx) {
    await env.EMAIL.send({
      to: "user@example.com",
      from: "notifications@your-domain.com",
      subject: "Your order has shipped",
      text: "Your order #1234 has shipped..."
    });
    return new Response("Email sent");
  },
};

APIキーや秘密情報の管理は不要で、SPF・DKIM・DMARCの設定はCloudflareが自動で処理する。
スパム判定されないための認証まわりをインフラ側に任せられる点は地味に重要で、メール送信機能を自前で実装するときに一番面倒な部分がごっそり省ける。

REST APIからも操作できる。

curl "https://api.cloudflare.com/client/v4/accounts/{account_id}/email/sending/send" \
  --header "Authorization: Bearer <API_TOKEN>" \
  --header "Content-Type: application/json" \
  --data '{
    "to": "user@example.com",
    "from": "notifications@your-domain.com",
    "subject": "Your order has shipped",
    "text": "Your order #1234 has shipped..."
  }'

TypeScript・Python・Go の各SDKにも対応している。
また Wrangler CLIから直接送ることもできる。

wrangler email send \
  --to "teammate@example.com" \
  --from "agent@your-domain.com" \
  --subject "Build completed" \
  --text "The build passed. Deployed to staging."

これはエージェントがローカルやサンドボックスで動いている場合に便利で、コンテキストのオーバーヘッドを抑えられる。
MCPサーバー経由でCloudflare APIにアクセスする方法も提供されており、Code Mode(旧Cursor Mode)でも操作できる。

受信側:Email Routingの拡張と onEmail フック

受信は既存の Email Routing サービスをベースに構築されている。
Email Routingはドメインへの着信メールをWorkerや外部アドレスに転送する機能で、複数年にわたって無料で提供されてきたものだ。

Agents SDKには onEmail フックが追加された。

import { Agent, routeAgentEmail } from "agents";
import { createAddressBasedEmailResolver } from "agents/email";
import PostalMime from "postal-mime";

export class SupportAgent extends Agent {
  async onEmail(email: AgentEmail) {
    const raw = await email.getRaw();
    const parsed = await PostalMime.parse(raw);

    // Durable Objectsでセッション間の状態を永続化
    this.setState({
      ...this.state,
      ticket: {
        from: email.from,
        subject: parsed.subject,
        body: parsed.text,
        messageId: parsed.messageId
      }
    });

    // 返信を送信
    await this.sendEmail({
      binding: this.env.EMAIL,
      fromName: "Support Agent",
      from: "support@yourdomain.com",
      to: this.state.ticket.from,
      inReplyTo: this.state.ticket.messageId,
      subject: `Re: ${this.state.ticket.subject}`,
      text: "Thanks for reaching out..."
    });
  }
}

export default {
  async email(message, env) {
    await routeAgentEmail(message, env, {
      resolver: createAddressBasedEmailResolver("SupportAgent"),
    });
  },
};

this.setState() で会話履歴や連絡先情報がエージェントインスタンスに紐づいて保存される。
バックエンドに別途データベースを立てなくても、受信トレイそのものがメモリストレージとして機能する構造だ。

アドレスベースのルーティング

単一ドメインから複数のエージェントへルーティングできる。

アドレスエージェント
support@yourdomain.comSupportAgent
sales@yourdomain.comSalesAgent
billing@yourdomain.comBillingAgent

サブアドレッシング(+ 区切り)にも対応しており、NotificationAgent+user123@yourdomain.com のようにユーザーIDをアドレスに埋め込んで特定のエージェントインスタンスに届けることができる。
大量ユーザーのエージェントをひとつのドメインで管理するときに使える。

HMAC-SHA256によるリプライルーティング

返信の正確なルーティングには HMAC-SHA256 署名が使われる。
これはヘッダー偽造を防ぐための仕組みで、受信したメールへの返信が必ず元のエージェントインスタンスに戻るよう保証する。
マルチエージェント構成でも会話コンテキストが混線しない。

参照実装「Agentic Inbox」

Cloudflareはオープンソースの参照実装「Agentic Inbox」も公開している。
メールクライアントとしての機能一式が含まれている。

  • 会話スレッドのUI表示とメールレンダリング
  • R2への添付ファイルストレージ
  • Workers AIによるメッセージ分類
  • エージェントがドラフトをレビューできるMCPサーバー
  • ワンクリックデプロイオプション

最後のMCPサーバーの部分が面白い。
エージェントがメールを受信してドラフトを作り、人間がMCPツール経由でそのドラフトを確認・承認してから送信する、というHITL(Human-in-the-Loop)フローを実装している。
Browser Runで追加されたLive ViewやHITL機能と組み合わせると、エージェントがメールを起点に作業を進めながら要所で人間に確認を取るシステムをシンプルに構築できる。

Email Routing との関係

Email Service は「Email Routing + 送信機能 + Agent統合」という位置付けだ。
既存のEmail Routingがカバーしていたのは着信のルーティングだけで、送信は別のサービス(SendGrid、Postmark等)に任せる必要があった。今回の発表でその非対称性が解消された。

プライベートベータ期間中に作られた実際のユースケースとして、顧客サポートエージェント、請求書処理、アカウント認証フロー、マルチエージェントワークフローが挙げられている。
いずれもメールが基盤として機能しているケースで、Webやチャットのような同期的なインターフェースではなく、非同期で応答を受け取るメールの性質がエージェントと噛み合う。
エージェント側はすぐに返信する必要がなく、処理が終わったタイミングで通知を送ればいい。

Agents Weekを通じてCloudflareが整備してきたSandboxes(コード実行環境)、Durable Object Facets(状態管理)、Workflows v2(非同期ジョブ制御)に、今回のEmail Service(メールI/O)が加わった格好だ。
メールはWebフォームやチャットほど目立たないチャネルだが、企業の業務フローに深く根ざしているだけに実務への影響は大きい。