kmkkiii.com

Cloudflare Email Sendingがパブリックベータ版になりました

/ Updated:
📧

Cloudflareのメール送信機能がパブリックベータ版で利用できるようになりました。

このprivate beta版発表の記事見て、waitlist登録して待っていたら急に公開されて驚きです。

料金体系

メール送信機能はWorkers Paidプラン($5/月)で利用でき、月3,000通まではプランに含まれ、以降1,000通ごとに$0.35かかる料金体系となっています。

1ヶ月に無料で送信できる通数はResend同じですね。

制限

1日の送信制限

Cloudflareアカウント状況の評価によって設定されていることがあるらしく、自分のアカウントでは200通/日でした。

メールのコンテンツ制限

  • 宛先はCC、BCC合算で50/通
  • 件名は998文字制限(RFC 5322準拠)
  • 添付ファイル込みでメッセージサイズは25MiBまで
  • ヘッダーサイズは16KBまで

Workersの制限

Workersバインディングを介したメール送信が制限の適用対象

  • CPU時間は、50ms/リクエスト
  • サブリクエストは、メール送信操作込みで50
  • メモリは、128MB

メール到達率

ハードバウンス

送信先のメールアドレスやドメインが存在しないなど永続的な失敗の場合は再試行されず、サプレッションリストに自動的にアドレスが追加されます。

ソフトバウンス

一方受信者のメールボックスがいっぱいだったり、メールサーバーがダウンしていたり、一時的な失敗は指数バックオフ方式で自動的に再試行されます。

Email Sending管理画面

設定したドメインの一覧が確認できます。

ダッシュボード
ダッシュボード

ドメイン設定

ドメインをオンボードボタンから行えます。

ゾーン選択でメール送信に使用するドメインを選択し、必要に応じてサブドメインを入力します。

追加されるDNSレコードを確認し、問題なければ完了ボタンでメール送信に使用できるようになります。

ドメイン設定
ドメイン設定

サプレッションリスト

抑制ボタンから確認できます(あふれる直訳感)。

ハードバウンス、ソフトバウンス、スパム報告に基づいて自動的に登録されたメールアドレスのほか、手動で登録(有効期限設定あり)することもできます。

リストから削除することも可能(スパム報告によって追加されたメールアドレスは削除不可)。

サプレッションリスト
サプレッションリスト

実装

REST API か Workersバインディングのどちらかを使用してメール送信を行うことができます。

REST API

エンドポイントに使用するaccount_idAPIトークンが必要です。

APIトークンはAuthorizationヘッダーに含めます。

# request
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": "recipient@example.com",
    "from": "welcome@yourdomain.com",
    "subject": "Welcome to our service!",
    "html": "<h1>Welcome!</h1><p>Thanks for signing up.</p>",
    "text": "Welcome! Thanks for signing up."
  }'

# response
{
  "success": true,
  "errors": [],
  "messages": [],
  "result": {
    "delivered": ["recipient@example.com"], # 即座に配信されたメールアドレス
    "permanent_bounces": [], # 永久に配信不能となったメールアドレス
    "queued": [] # キューイングされたメールアドレス
  }
}

REST APIは数値エラーコードを返しますが、Workersバインディング使用の場合はエラーコードが文字列でスローされるみたいです。

Workersバインディング

バインディング設定

// wrangler.jsonc
{
  "$schema": "./node_modules/wrangler/config-schema.json",
  "send_email": [
    {
      "name": "EMAIL"
    }
  ]
}

送信方

const response = await env.EMAIL.send({
  to: ["user1@example.com", "user2@example.com", "user3@example.com"], // 複数の宛先を指定
  from: { email: "newsletter@yourdomain.com", name: "Newsletter Team" },
  subject: "Monthly Newsletter",
  html: "<h1>This month's updates</h1>",
  text: "This month's updates",
});

その他の

ユーザー登録フローやマジックリンク認証、メール添付ファイルの例が掲載されています。

ローカル開発

リモートバインディングを使用することで、実際のメール送信機能をローカルで確認することができます。

ただし、使用料としてカウントされるので注意が必要です。

リモートバインディングを使用しない場合は、ローカルではシミュレーションのみで、ログに送信メタデータ(from/to/subject)が出力され、本文は /tmp/miniflare-.../email-text/*.txtファイルとして書き出されます。

ログ出力
ログ出力

制限事項

画像やPDFなどのバイナリ添付ファイルは、ローカルシミュレータでシリアライズできないためテストできません。

現状はWorkerをデプロイし、デプロイされたバージョンに対してテストをする必要があります。

所感

Cloudflareスタックで開発していて丁度メール通知機能追加に着手しようとしていたのでナイスタイミングでした。

Resendなどの外部プロバイダーを使わず、Cloudflareで完結できるのはいいですね。

Workersバインディングを使えば、APIキーの発行もなしですぐにメール送信ができるようになってお手軽です。