Cloudflare Workers AI × Amazon SES — 業務担当が AI でメール配信を最適化する脱エンジニア手法
2026 年、メール配信は AI 必須に
メールマガジンや顧客通知メールを Amazon SES で送ると、1,000 通あたり $0.10(約 ¥15)。MailChimp や SendGrid と比べて圧倒的に安い。ただ、SES は「送るだけ」のサービスなので、開封率や到達率の最適化は別途必要です。
ここに Cloudflare Workers AI を組み合わせると、業務担当者がコードを最小限書くだけで、件名 A/B テスト・本文パーソナライズ・配信時刻最適化まで実現できる。シマント AI 自身が運用している構成を例に解説します。
ミドリ: タツヤさん、メール配信って Amazon SES が一番安いっていう話は知ってるんですけど、開封率を上げたかったら結局エンジニアに頼まないとダメじゃないですか?
タツヤ(nodding): 2025 年までならその通りだったね。でも 2026 年現在、Cloudflare Workers AI が出てきて状況が変わった。SES の前段に Workers AI を置けば、AI が件名と本文を最適化してくれて、しかも 1 通あたり $0.0001 で済む。
ミドリ(surprised): えっ、1 通 $0.0001? それ無料同然じゃないですか!
タツヤ(nodding): そう、Cloudflare Workers AI は Cloudflare が自社で持ってる GPU で推論を走らせるから、めちゃくちゃ安い。Llama 3.3 70B が約 $0.59 / M tokens、Mistral Small が $0.0006 / 1K tokens。1 通分のメール件名最適化で 0.01 円くらい。
ミドリ(thinking): それで、その「組み合わせ」って具体的にどんな構成?
アーキテクチャの全体像
タツヤ: こんな流れ。
[配信リスト (CSV / Google スプレッドシート)]
↓
[Cloudflare Workers (Cron Trigger or HTTP)]
↓ 顧客 1 人ずつ
[Workers AI: Mistral Small で件名 + 本文パーソナライズ]
↓ 最適化済みメッセージ
[Amazon SES API: 個別送信]
↓
[配信ログ (Cloudflare D1 or R2)]
↓
[Workers AI で開封パターン解析 → 翌日の配信時刻最適化]
ミドリ: Workers が真ん中で AI と SES の橋渡し、ですね。
タツヤ(nodding): その通り。Workers の中に AI コール + SES API コール + ログ書き込みを全部書く。1 ファイル、TypeScript で 100 行くらい。
サンプルコード — シマント自身が使っているもの
ミドリ: 100 行の中身、見せてもらえますか?
タツヤ: メインのループ部分を抜粋する。
import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";
interface Recipient {
email: string;
name: string;
segment: string;
pastOpenRate: number;
}
export default {
async scheduled(event: ScheduledEvent, env: Env, ctx: ExecutionContext) {
const recipients = await loadRecipients(env); // R2 から CSV を読む
const ses = new SESClient({
region: "ap-northeast-1",
credentials: {
accessKeyId: env.AWS_ACCESS_KEY_ID,
secretAccessKey: env.AWS_SECRET_ACCESS_KEY,
},
});
for (const r of recipients) {
// AI で件名と本文を最適化
const optimized = await env.AI.run("@cf/mistral/mistral-small-latest", {
messages: [
{ role: "system", content: "脱エンジニアの部屋メルマガ件名を最適化する" },
{
role: "user",
content: `顧客: ${r.name}, セグメント: ${r.segment}, 過去開封率: ${r.pastOpenRate}\n本日のテーマ: AI Agent 導入のコツ\n件名と本文を JSON で返して`,
},
],
});
const { subject, body } = JSON.parse(optimized.response);
// SES で送信
await ses.send(
new SendEmailCommand({
Source: "[email protected]",
Destination: { ToAddresses: [r.email] },
Message: {
Subject: { Data: subject, Charset: "UTF-8" },
Body: { Html: { Data: body, Charset: "UTF-8" } },
},
})
);
// ログ
await env.D1.prepare(
"INSERT INTO sent (email, subject, sent_at) VALUES (?, ?, datetime('now'))"
)
.bind(r.email, subject)
.run();
}
},
} satisfies ExportedHandler<Env>;
ミドリ(thinking): うわ、これだけで動くんですか?
タツヤ(smiling): うん、これだけ。Vibe Coding で Cursor に「Cloudflare Workers で R2 から CSV 読んで、Workers AI で件名最適化して、Amazon SES で送る」って書けば、ほぼこの形が出てくる。業務担当でも Cursor 使えば書ける範囲。
コスト試算 (月 10,000 通配信)
ミドリ(thinking): お金の話、もう少し詳しく教えてください。
タツヤ(nodding): 月 10,000 通だとこんな試算。
| 項目 | 単価 | 月額 |
|---|---|---|
| Amazon SES (送信) | $0.10 / 1,000 通 | $1.00 |
| Cloudflare Workers (実行) | 100,000 リクエスト/日 まで無料 | $0 |
| Cloudflare Workers AI (Mistral Small) | $0.0006 / 1K tokens | 約 $1.20 |
| Cloudflare D1 (ログ) | 5GB まで無料 | $0 |
| Cloudflare R2 (CSV 保存) | 10GB まで無料 | $0 |
| 合計 | 約 $2.20 (¥330) |
ミドリ(surprised): 月 ¥330!? 嘘でしょ……。
タツヤ: ホント。SendGrid Pro の 10,000 通プラン (月 $30) と比べて 15 分の 1。これが Cloudflare の最大の魅力。個人開発者から中小企業まで、コスト面で他社の追随を許さない。
開封率の改善 — シマント AI 自身の事例
ミドリ: 実際にどれくらい開封率が上がるんですか?
タツヤ(thinking): うちで 2026 年 1 月から運用してて、こんな数字が出てる。
| 期間 | 件名最適化 | 開封率 | クリック率 |
|---|---|---|---|
| 2025-10〜12 | なし (固定件名) | 18.2% | 2.1% |
| 2026-01〜03 | Workers AI で動的最適化 | 31.8% | 4.6% |
開封率 +13.6 ポイント、クリック率 +2.5 ポイント。
ミドリ(surprised): ほぼ倍ですね……。
タツヤ(nodding): うん。AI が顧客セグメントごとに件名を変えるだけで、ここまで違う。例えば:
- 経営者層: 「【30 秒で読める】AI で年商 10% 増の事例」
- 業務担当者: 「ミドリさん、今月の業務効率を 50% 改善する方法」
- 元エンジニア: 「Cloudflare Workers AI × SES で月 ¥330 配信を実現」
って、同じ内容でも切り口が変わる。LLM ならではのパーソナライズ。
SES の送信ドメイン認証 — DKIM / SPF / DMARC
ミドリ: 配信って到達率も大事ですよね。スパム判定されないように。
タツヤ(nodding): そう、SES を使う前に 3 つの DNS 設定を必ずやる必要がある。
- SPF:
v=spf1 include:amazonses.com ~allを TXT レコードに - DKIM: AWS から発行される 3 つの CNAME を追加
- DMARC:
v=DMARC1; p=none; rua=mailto:[email protected]で開始
これは Cloudflare DNS なら 5 分で全部済む。シマントの場合は shimanto.com の DNS を Cloudflare 管理してるから、その画面でレコード追加するだけ。
ミドリ: 設定ミスがあるとどうなるんですか?
タツヤ(confused): 主要メールサービス (Gmail / Outlook / Yahoo) で 送ったメールが受信箱に届かず、迷惑メール or 拒否される。せっかく AI で件名最適化しても、届かなければ意味がない。
ミドリ(nodding): DNS 設定 → SES → AI 件名最適化、の順序ですね。
配信時刻の最適化 — AI で個人別に学習
タツヤ(smiling): 応用編として、AI で配信時刻も個人別に最適化できる。
ミドリ: 個人別に時刻を変える、ですか?
タツヤ(nodding): うん。過去の開封ログを D1 に蓄積して、Workers AI で「ミドリさんは平日 21 時、タツヤは土曜 10 時に開く傾向」って学習させる。翌週の配信時に、その人の最適時刻に合わせて送る仕組み。
ミドリ(surprised): それで開封率がさらに上がるんですか?
タツヤ: うちの計測だと、さらに +5 ポイント上がった。31.8% → 36.7%。月配信で送る数を増やしたい場合は、この仕組みが効く。
失敗パターンと注意点
ミドリ: 怖い話も聞いておきたいです。
タツヤ(thinking): 主に 4 つ。
- AI が変な件名を作る: たまに「無料でお金配ります!!」みたいなスパム的件名を生成する → ガードレールとして件名フィルタを入れる
- 送信元評価 (Sender Reputation) が下がる: バウンス率が高いリストに送り続けると SES からブラックリスト入り → 必ずバウンス処理を組み込む
- D1 のロギング肥大: 月 1 万通 × 12 ヶ月 = 12 万行、サイズ感は問題ないが古いデータは定期削除を
- AI 推論のレイテンシ: 1 通あたり 1〜2 秒かかる → バッチ送信時は Promise.all で並列化
ミドリ(nodding): ガードレール、バウンス処理、ログ削除、並列化。順番にチェックリストにできますね。
まとめ — 脱エンジニアの新しい王道
ミドリ(smiling): SES + Workers AI、ここまで強力だとは思わなかったです。
タツヤ(nodding): うん。これが「脱エンジニア」の本質的な姿。業務担当者が ChatGPT で件名を考える時代から、業務担当者が Cursor で 100 行コードを書いて、AI が顧客 1 人 1 人に最適化された件名を自動生成する時代へ。
ミドリ: そして月 ¥330 で 1 万通配信、開封率倍。
タツヤ(smiling): これがシマント AI が SES + Cloudflare で提唱してる構成。伴走支援も含めて、最初の 3 ヶ月は月 5 万円程度で構築 → 引き継ぎできる。
ミドリ: うちも導入検討します!
タツヤ: 嬉しい。Vibe Coding と組み合わせると、業務担当者がそのまま運用できるところまで持っていける。