homura Docs App | Posts About Login
Ctrl+K

Cloudflare Email Service(送信)

Agents Week 2026 で public beta の Email Sending を、homura では SEND_EMAIL バインディングと Ruby ラッパー Cloudflare::Email から利用します。

概要

domain onboarding

  1. Cloudflare Dashboard → Email Sending → Onboard Domain で所有ドメインを選択。
  2. DNS(SPF / DKIM / DMARC / bounce 用 MX)が自動提案されるので承認・反映を待つ。
  3. 検証済みの送信元アドレスを決め、wrangler.toml[vars] HOMURA_MAIL_FROM に設定する。

未 onboarding のまま送ると E_SENDER_NOT_VERIFIEDE_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.mjsfetch 先頭で 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_emailhomura_mail_from を利用できます。

できること / できないこと

できることできないこと
送信トランザクショナルメール(Workers binding 経由)マーケティング向けの購読管理・テンプレート基盤は対象外
宛先仕様上は任意の宛先(Rate / アカウント制限は別途)インバウンド受信は 別 API
ローカルwrangler dev(既定はシミュレーション、remote: true で実送信も可)このリポジトリではデフォルト運用のみ記載
料金Cloudflare の Email Service / Workers 課金ポリシーに従う無料枠のみでの無制限は保証されない

セルフホストデモ

認証付きの簡易フォーム: /debug/mail