結論(おすすめ1つ)
Resend に乗り換えるべきだ。
Mailchimp Transactional(旧 Mandrill)から移行する場合、現時点で開発者体験・SDK の品質・デバッグのしやすさにおいて Resend が最もバランスが取れている。React Email との統合によりテンプレートをコードで管理でき、Git 管理・レビュー・CI/CD への組み込みがそのまま機能する。Webhook の設計や API レスポンスの一貫性も高く、移行後の運用コストが下がりやすい。
比較表(料金/無料枠/移行コスト/対応言語)
| サービス | 無料枠 | 従量単価 | 移行コスト | 主要 SDK |
|---|---|---|---|---|
| Resend | あり(月間送信上限あり) | 公式の料金ページで要確認 | 低(シンプルな REST API) | Node/Python/Go/Ruby/PHP/Rust など |
| SendGrid (Twilio) | あり(日次上限あり) | 公式の料金ページで要確認 | 中(設定項目が多い) | Node/Python/PHP/Java/C#/Go/Ruby |
| Postmark | 開発用テストクレジットあり | 公式の料金ページで要確認 | 低〜中 | Node/Python/PHP/Ruby/.NET/Go |
| Mailgun | 試用期間あり(日次上限付き) | 公式の料金ページで要確認 | 中 | Node/Python/PHP/Java/Ruby/Go |
| Amazon SES | AWS 無料利用枠に準ずる | 公式の料金ページで要確認 | 高(IAM/DNS 設定が複雑) | AWS SDK 全言語対応 |
無料枠の上限や正確な従量単価は変更されやすいため、必ず各サービスの公式料金ページで最新情報を確認すること。
移行手順
1. 送信ドメインの SPF/DKIM 設定
Mailchimp Transactional から抜けた直後は DNS 設定を引き継げない。Resend の管理画面でドメインを追加し、表示された TXT レコードを DNS プロバイダに登録する。
# 設定後、dig で確認する例(Linux/macOS)
dig TXT yourdomain.com +short
# Windows の場合
Resolve-DnsName -Name yourdomain.com -Type TXT
伝播には最大 72 時間かかる。本番切り替え前に staging ドメインで検証を済ませること。
2. SDK のインストール
# Node.js
npm install resend
# Python
pip install resend
# Go
go get github.com/resendlabs/resend-go
3. 環境変数の設定
# .env
RESEND_API_KEY=re_xxxxxxxxxxxx
FROM_EMAIL=noreply@yourdomain.com
4. 送信コードの置き換え
Mailchimp Transactional(Mandrill)からの移行例:
// Before: Mailchimp Transactional (Mandrill)
const mailchimp = require("@mailchimp/mailchimp_transactional")(
process.env.MANDRILL_API_KEY
);
await mailchimp.messages.send({
message: {
from_email: process.env.FROM_EMAIL,
to: [{ email: "user@example.com", type: "to" }],
subject: "注文確認",
html: "<p>ご注文ありがとうございます</p>",
},
});
// After: Resend
import { Resend } from "resend";
const resend = new Resend(process.env.RESEND_API_KEY);
await resend.emails.send({
from: process.env.FROM_EMAIL,
to: ["user@example.com"],
subject: "注文確認",
html: "<p>ご注文ありがとうございます</p>",
});
5. Webhook の移行
Mailchimp Transactional のイベント Webhook(hard_bounce, soft_bounce, spam など)を Resend のイベント名に読み替えて再設定する。
// Express での Webhook 受信例
app.post("/webhook/email", express.json(), (req, res) => {
const { type, data } = req.body;
if (type === "email.bounced") {
// バウンスアドレスを DB から除外する処理
handleBounce(data.to);
}
res.status(200).send("ok");
});
6. テスト送信と監視
# curl でのスモークテスト
curl -X POST https://api.resend.com/emails \
-H "Authorization: Bearer $RESEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "test@yourdomain.com",
"to": ["yourtest@example.com"],
"subject": "migration smoke test",
"text": "ok"
}'
レスポンスの id フィールドをログに記録し、管理画面のイベントログと突合してから本番切り替えを行う。
向き不向き
Resend が向くケース
- TypeScript/Node.js をメインスタックとするチーム
- React Email でテンプレートをコード管理したい場合
- 月間送信量が無料枠に収まるスタートアップや個人開発者
- 既存の Mailchimp Transactional コードがシンプルで、依存が少ない場合
- CI/CD パイプラインにメールテンプレートのレビューを組み込みたいチーム
Resend を避けるべきケース
- 月間送信数が大規模(数百万通単位)でコスト試算が最優先の場合 → Amazon SES を検討
- .NET や Java がメインで SendGrid の既存インテグレーションが多い場合
- 高い配信速度保証(Postmark が得意とする即時配信)が SLA に含まれる場合
- 既存の Mailgun 依存(SMTP relay 設定など)が深く、REST API 移行のコストが許容できない場合
共通の注意点
- どのサービスへ移行する場合も、バウンス・スパム報告の Webhook 処理は必ず実装すること。未処理のまま同一アドレスへ送り続けるとドメインレピュテーションが下がり、最終的に全サービスで到達率が低下する。
- Mailchimp Transactional は Mailchimp アカウントに紐付いているため、解約前に API ログと送信履歴を手動でエクスポートしておくこと。
Top comments (0)