Cloudflare Email Service(送信)
Agents Week 2026 で public beta の Email Sending を、homura では SEND_EMAIL バインディングと Ruby ラッパー Cloudflare::Email から利用します。
概要
- Workers の binding だけで送信でき、別途 API キーをコードに埋め込む必要はありません。
- このサイトではテスト用に
/debug/mailを用意しています(本番では認可されたセッションのみ)。
domain onboarding
- Cloudflare Dashboard → Email Sending → Onboard Domain で所有ドメインを選択。
- DNS(SPF / DKIM / DMARC / bounce 用 MX)が自動提案されるので承認・反映を待つ。
- 検証済みの送信元アドレスを決め、
wrangler.tomlの[vars] HOMURA_MAIL_FROMに設定する。
未 onboarding のまま送ると E_SENDER_NOT_VERIFIED や E_SENDER_DOMAIN_NOT_AVAILABLE などが返ります。
# wrangler.toml(抜粋)
[[send_email]]
name = "SEND_EMAIL"
[vars]
HOMURA_MAIL_FROM = "noreply@example.com"
Cloudflare::Email
送信バインディングは Worker の env.SEND_EMAIL が正です。worker_module.mjs の fetch 先頭で globalThis.__OPAL_WORKERS__.sendEmailBinding にコピーしたうえで、Rack 側は env['cloudflare.SEND_EMAIL'](Cloudflare::Email ラッパー)として参照します。D1 / Queue などが cloudflare.env 経由で触るパターンとは別に、Email はこの明示注入経路が主軸です(Miniflare でも同じ JS オブジェクトを拾えるようにするため)。
mail = send_email # => env['cloudflare.SEND_EMAIL'](内部は env.SEND_EMAIL と同一バインディング)
mail.send(
to: 'you@example.com',
from: ENV_STYLE_FROM, # 実際は vars の HOMURA_MAIL_FROM を参照
subject: 'Hello',
text: 'Plain text body',
html: '<p>Optional rich body</p>' # 省略可/text と併用可(どちらか必須)
).__await__
アプリ側ではヘルパー send_email と homura_mail_from を利用できます。
できること / できないこと
| できること | できないこと | |
|---|---|---|
| 送信 | トランザクショナルメール(Workers binding 経由) | マーケティング向けの購読管理・テンプレート基盤は対象外 |
| 宛先 | 仕様上は任意の宛先(Rate / アカウント制限は別途) | インバウンド受信は 別 API |
| ローカル | wrangler dev(既定はシミュレーション、remote: true で実送信も可) | このリポジトリではデフォルト運用のみ記載 |
| 料金 | Cloudflare の Email Service / Workers 課金ポリシーに従う | 無料枠のみでの無制限は保証されない |
セルフホストデモ
認証付きの簡易フォーム: /debug/mail