認証メールや通知メールの送信基盤を、Cloudflare Email Service・Resend・Amazon SESの3つで比較しました。結論を先に言うと、「まず楽な方で始めて、量が増えたら安い方に移る」という段階戦略は、この領域では成立しませんでした。移行コストの本体がコードではなく送信者レピュテーション、つまり受信側と積み上げる信頼だからです。量がある程度読めるなら、最初からAmazon SESを選ぶのが正解でした。
自分のサービスに認証メール・通知メールの送信を組み込むにあたって、実際に3サービスの料金を調べ、移行計画を立て、その計画が白紙になるまでの過程をそのまま記録します。料金はすべて2026年8月時点の調査値です。
3サービスの料金を並べると、SESが全域で最安
まず候補3つの料金体系です。
| 無料枠 | 基本料金 | 従量 | |
|---|---|---|---|
| Cloudflare Email Service | 3,000通/月 | Workers Paid $5/月が必須 | $0.35/1,000通 |
| Resend | 3,000通/月(100通/日上限) | Pro $20(5万通)〜$35(10万)、Scale $90(10万)〜$1,150(250万) | 超過$0.90/1,000通 |
| Amazon SES | 3,000通/月を12ヶ月(2025/7/15以降の新規は代わりに$200のAWSクレジット) | なし | $0.10/1,000通、添付$0.12/GB |
Cloudflare Email Serviceは2026年4月にEmail Sendingがpublic betaになったもので、利用にはWorkers Paid($5/月)が前提です。なお$0.35/1,000通はベータ価格で、Cloudflare自身がベータ中のAPIと価格は変わりうると明記しています。GAで上がる可能性も下がる可能性もあります。SESは公式の料金ページのとおり$0.10/1,000通で、課金は受信者数ベース(1通を100人宛に送ると100通)。Resendは料金ページのプラン制で、マーケティングメールはコンタクト数ベースの別課金、専用IPはScaleプランで+$30/月です。
通数別に月額を概算するとこうなります(Workers Paidの$5を新規に払う前提、SESは無料枠切れ後。Resendの100万通は公式プランの階梯上、Scaleプラン帯(10万通$90〜250万通$1,150)のどこかに落ちるため幅で示します)。
| 通数/月 | Cloudflare | Resend | SES |
|---|---|---|---|
| 1,000 | $5 | $0 | $0.1 |
| 10,000 | $7.45 | $20 | $1 |
| 50,000 | $21.45 | $20 | $5 |
| 100,000 | $38.95 | $35 | $10 |
| 1,000,000 | $354 | Scale帯($90〜$1,150の間) | $100 |
「Cloudflareは安い」という印象があるかもしれませんが、それは比較対象がResendやSendGridのときの話です。SESとは単価で3.5倍差($0.35 vs $0.10)が最初から最後まで付いて回ります。少量帯では$5の固定費があるぶん、むしろ差が広がる。Cloudflareが実質最安になるのは「すでにWorkers Paidを払っている」かつ「量が少ない」の2条件が揃ったときだけです。
「楽な方で始めて、後でSESに移る」計画を立てた
順位が出たところで、こう考えました。普段からCloudflareで開発しているので、Email Serviceが一番楽。SESはサンドボックス解除の申請やら何やらが面倒と聞く。なら初期はCloudflareで始めて、量が出てきたらSESに移行すればいい。
移行時にはコードの書き換えが発生しますが、そこは問題になりません。送信APIの呼び出しを差し替えるだけなら、いまはAIが数分で終わらせます。移行コストが実質ゼロなら、後から安い方に乗り換える前提で楽な方を選ぶのは合理的なはず。
この時点では、われながら筋のいい段階戦略だと思っていました。
移行コストの本体は、コードの中になかった
計画は「レピュテーション」という単語ひとつで白紙になりました。
受信側のメールサーバ(GmailやOutlook)は、送信元IPアドレスと送信ドメインで名寄せして、送信者の過去実績を蓄積しています。何通送ってきたか、どれくらい開封されたか、迷惑メール報告がどれくらい出たか、存在しないアドレス宛の送信がどれくらいあるか。これが送信者レピュテーションです。
新しい経路には、この履歴がありません。「怪しまれる」というより「まだ判断材料がない」状態です。履歴のないIPから突然大量のメールが届くと、受信側から見た挙動は統計的にスパム送信者とほぼ区別がつきません。まともな送信者は、普通そういう立ち上がり方をしないからです。結果として起きるのが、迷惑メール行き・レート制限・一時拒否。しかも到達率の劣化は静かに進行するので、「認証メールが届かないんですが」という問い合わせで気づくのが最悪のパターンです。
だから新しい経路ではウォームアップが要ります。初日は数百通、翌日はその倍、と数週間かけて送信量を増やし、履歴を作っていく作業です。エンジニアリングというより、外部の相手との信頼構築に近い。
そして決定的なのはここです。Cloudflareで積み上げた実績は、SESに持っていけません。
補足すると、IPとドメインは別々に評価されます。SESの共有IPを使えばIP側の評判は他の利用者と共通のものを借りられる(代わりに他人のスパムに巻き込まれるリスクも共有する)ので、数万通/月までなら共有IPで十分と言われます。専用IP(SESでは$24.95/IP/月)を持つ場合は、その評判を自分でゼロから育てることになります。同じドメインを使い続けるならドメイン評判は残るため、実際はもう少し穏やかに移れる可能性はあります。それでも経路が変われば受信側からの見え方は変わるので、段階的に流すのが安全です。自分のドメインがGmail側からどう見えているかはGoogle Postmaster Toolsで確認できます。静かな劣化に気づくために、登録しておいて損はありません。
「AIがコードを書くから移行は怖くない」の半分は間違いだった
白状すると、当初は「sendMail({to, subject, html})のような薄い関数1つに送信を閉じ込めておけば、移行は1ファイルの差し替えで済む」という設計を検討していました。マルチプロバイダ対応を作り込むのはやりすぎで、1関数で十分、と。
これに対する答えが冒頭の会話です。コード修正はもはやAIがやるので、問題にすらならない。これは正しくて、呼び出しの差し替え程度なら抽象化しておく価値自体が下がっています。エディタ選定で「AIが書くならエディタはどうでもよくなった」と結論した話と同じ構図です。
Zed vs VS Codeを突き詰めたら「エディタはどうでもよくなった」|Codexメイン時代のエディタ選定Codexなど CLIエージェント主体の開発でZedとVS Codeを本気で比較した記録。ZedのACP統合とサブスク対応の非対称を調べた末に、エディタの役割が「たまにコードを読むビューア」へ縮む過程と、差分レビューをPRに寄せるとエディタ選定が「好みの問題」になる判断フレームをまとめます。www.tentspace.netただし、論点はそこではありませんでした。移行の作業を並べると、コードの外側が大半を占めます。
- SESサンドボックス解除の申請(人間が用途を書いて出し、AWSの審査を待つ)
- DNS伝播の待ち時間
- SPF・DKIM・DMARCの検証
- バウンス・苦情の通知配線
- サプレッションリスト(送信停止リスト)の引き継ぎ
- IPウォームアップ
いずれも、AIの生成速度とはほぼ無関係に時間がかかります。コード生成で短縮できるのは自分の側の作業だけで、外部の相手との信頼構築は時間そのものが必要。この非対称性を見落とすと、送信量が逼迫してから動いて間に合わなくなります。
ちなみに金額差で移行を考えるラインの目安は月30万通あたりからです。10万通では差額が月$29で移行の手間に見合いません。30万通で月$80、100万通なら月$254(年約$3,000)。年$3,000の差なら、初期構築の面倒さでは説明できなくなります。
DNSがCloudflareにあっても、SESは問題なく使える
「ドメインをCloudflareで管理しているからCloudflare Emailが楽」と考えていたのも、調べてみると誤解でした。SESに必要なのはDNSレコードを追加できることだけで、権威DNSがどこにあるかは無関係です。
追加するのは次の3種類です。
- DKIM: SESが提示するCNAMEを3本(Easy DKIMなら鍵はSES管理)
- SPF: カスタムMAIL FROMサブドメインにTXT
v=spf1 include:amazonses.com ~allとMX 1本 - DMARC:
_dmarcにTXT。最初はp=noneでレポートだけ受け、確認後にquarantine→rejectと締める
Cloudflare固有の罠が1つあります。**DKIMのCNAMEをプロキシON(オレンジ雲)のまま入れると検証が壊れます。**必ずDNS only(グレー雲)にしてください。UIの初期状態でONになることがあります。
受信にCloudflare Email Routingを使っている場合も共存できます。ルートドメインのMXはCloudflareが握りますが、SESのカスタムMAIL FROMは別サブドメインにMXを置くので衝突しません。むしろDNSがCloudflareにあると反映が速く、SESの検証完了までの待ち時間が短くなるので有利でした。
最終構成と、規模感のオチ
最終的な構成は、**送信 = Amazon SES、受信 = Cloudflare Email Routing(無料)**に最初から決めました。着手時はSESのサンドボックス解除申請を最初に出しておくと、審査の待ち時間が他の作業と重なって浮きます。
オチを書いておくと、想定している送信量は月3,000通程度です。SESなら$0.30、日本円で約45円。無料枠が生きていればゼロです。3社ともこの量なら実質タダで、金額はそもそも判断材料ですらありませんでした。
この規模で効くのは金額ではなく運用です。SESは公式のEnforcement FAQにあるとおり、バウンス率5%・苦情率0.1%を超えるとアカウントがAWSのレビュー対象になるため、存在しないアドレスに送り続けない仕組みが最初から要ります。量が少ないぶん、数通のバウンスで比率が跳ねる。サプレッションリストとバウンス通知の配線は、通数に関係なく初日から必要でした。
SESが「面倒」と言われるのは、サンドボックス解除の申請が量に関係なく必要で、こうした運用を自前で持つからです。その代わり価格が最安。楽さを外部サービスに払うか、運用を自分で持って単価を取るか。Cloudflareの従量課金の読み方は別の記事でも書いていますが、単価表の比較だけでは答えが出ないところに、いつも本当の判断があります。
Cloudflare D1の料金解説|課金されるのはDB数ではなくスキャン行数Cloudflare D1の料金体系を整理します。Workers Paidの$5はアカウント単位でDBを何個作っても増えず、課金軸はrows read・rows written・ストレージの3つだけ。「返した行数ではなくスキャンした行数」という落とし穴と$134請求の外部事例、対策3点をまとめます。www.tentspace.net「AIがコードを書くから移行コストはゼロに近づく」は、半分だけ正しい。外部の相手との信頼関係が絡む領域では、移行コストは今もコードの外に残っています。送信基盤を選ぶときは、単価表の前にそこを見てください。





