最近話題のResendってどうなの?SendGrid・Mailgun・SES等とGo/TypeScriptで実測比較してみた
「メール送信サービス、とりあえずSendGridかSESでいいか」と思っていませんか?
最近、開発者界隈で「Resend」というモダンなメール送信APIが話題になっています。私自身も最近使ってみて「これは開発体験(DX)が段違いに良いぞ…!」と感動したのですが、いかんせん日本語の詳しい説明資料や、他サービスとの具体的な比較記事が少ないのが現状です。
そこで今回は、Resendの公式サイトからの引用を交えつつ、SendGrid・Mailgun・AWS SES・Postmarkといった主要な競合サービスとの比較をまとめました。さらに、実際のUbuntu 22.04環境でGoとTypeScript(Node.js)の各SDKをセットアップし、パッケージサイズ・インポート速度・コード量のベンチマークも計測しています。
もちろん、良いところばかりではなく、Resendのデメリットや弱点についても正直に書いています。
1. Resendとは?何がそんなに良いのか
Resend は、「開発者のためのメールAPI(Email for developers)」を掲げるモダンなメール送信サービスです。2022年に登場した比較的新しいサービスですが、その洗練された開発者体験から急速に普及しています。
公式サイトのトップページには、以下のように書かれています。
The best way to reach humans instead of spam folders. Deliver transactional and marketing emails at scale.
最大の特徴は、圧倒的な開発者体験(DX)の良さです。React Email(Reactでメールテンプレートを構築できるフレームワーク)の開発チームが作っていることもあり、モダンなフロントエンド・バックエンド開発との親和性が非常に高くなっています。
主な特徴
- API設計がシンプルで美しい — 後述のコード比較でも分かりますが、SDKの使い方が非常に直感的です。
- React Emailとのネイティブ統合 — ReactコンポーネントをそのままメールのHTMLとして送信できます。
- Webhookやログの可視性が高い — ダッシュボードが洗練されており、メールが届かなかった理由(バウンス理由など)が一目で分かります。
- マルチリージョン対応 — 北米・南米・ヨーロッパ・アジアなど、ユーザーに最も近いリージョンから送信でき、遅延を減らせます。
- Broadcasts(一斉送信)機能 — トランザクションメールだけでなく、マーケティングメールの一斉配信にも対応しています(最近追加された機能)。
2. 主要サービスとの料金・機能比較
まずは、各サービスの料金プランと無料枠を比較してみましょう。
| サービス | 無料枠 | 有料プラン開始額 | 10万通/月の目安料金 | 特徴・強み |
|---|---|---|---|---|
| Resend | 3,000通/月(1日100通まで) | $20(5万通) | $90(Scaleプラン) | 開発者体験が最高、React Email統合 |
| SendGrid | 60日間無料トライアル(100通/日) | $19.95(5万通) | $89.95(Proプラン) | 業界標準、実績と信頼性、マーケティング機能 |
| Mailgun | 無料トライアルのみ | $15(1万通) | $90前後 | 強力なルーティング機能、受信処理に強い |
| AWS SES | EC2からなら月6.2万通無料 | 従量課金のみ | 約$10 | 圧倒的な低価格、AWSエコシステムとの統合 |
| Postmark | 100通/月(永久無料) | $15(1万通) | $125前後 | トランザクションメール特化、到達速度が最速 |
※料金は2026年4月時点の各公式サイトの情報に基づきます。
各サービスのポジショニング
用途に合わせて選ぶなら、以下のような基準が参考になります。
-
とにかく安く済ませたい、AWSを使っている →
AWS SES -
マーケティング担当者も使い、実績を重視する →
SendGrid -
複雑な受信ルーティングが必要 →
Mailgun -
トランザクションメールの到達速度を最優先する →
Postmark -
モダンな開発体験とReact連携を重視する →
Resend
3. Ubuntu上での実測ベンチマーク(Go / TypeScript)
「APIの使いやすさ」は主観になりがちなので、実際のUbuntu 22.04環境でGo(1.22.3)とTypeScript(Node.js 22.13.0)の各SDKをインストールし、客観的な数値を計測してみました。
3.1 TypeScript (Node.js) SDKの比較
サーバーレス環境(AWS LambdaやVercel Edge Functionsなど)では、node_modules のサイズや初回ロード時間がコールドスタートに直結します。
実測結果(Ubuntu 22.04 / Node.js 22.13.0)
| サービス | パッケージ名 | インストールサイズ | 依存パッケージ数 | 初回ロード時間 (5回平均) |
|---|---|---|---|---|
| Resend | resend |
212 KB | 7個 | 96.7 ms |
| SendGrid | @sendgrid/mail |
836 KB | 42個 | 113.3 ms |
| AWS SES | @aws-sdk/client-sesv2 |
11 MB | 多数 | 145.1 ms |
ResendのSDKは非常に軽量(わずか212KB)で、依存関係も少ないため、Edge環境やLambdaでの利用に最適です。一方、AWS SDK v3はモジュール化されているとはいえ、依然としてサイズが大きくロード時間も長めです。
3.2 Go SDKの比較
Go言語でも同様に、モジュールキャッシュのサイズと依存関係の数を計測しました。
実測結果(Ubuntu 22.04 / Go 1.22.3)
| サービス | パッケージ名 | モジュールキャッシュサイズ |
go.mod 依存数 |
|---|---|---|---|
| Resend | github.com/resendlabs/resend-go |
204 KB | 1個 |
| SendGrid | github.com/sendgrid/sendgrid-go |
1.6 MB | 2個 |
| AWS SES | github.com/aws/aws-sdk-go-v2/service/sesv2 |
8.6 MB | 6個 |
Goにおいても、ResendのSDKは非常にコンパクトです。また、1000回のクライアント生成やパラメータ構築のベンチマークを実行したところ、ResendもSendGridも1ミリ秒未満(マイクロ秒オーダー)で完了し、実行時のオーバーヘッドはどちらも無視できるレベルでした。
3.3 コードの複雑さ比較(TypeScript)
実際にメールを送信する最小限のコードを比較しました。
Resend(10行 / 250文字)
import { Resend } from 'resend';
const resend = new Resend('re_xxxxxxxxx');
await resend.emails.send({
from: 'Acme <onboarding@resend.dev>',
to: ['user@example.com'],
subject: 'Hello World',
html: '<strong>It works!</strong>',
});
シンプルなオブジェクト形式でパラメータを渡し、1行で送信できます。型定義も完璧に効きます。
SendGrid(12行 / 280文字)
import sgMail from '@sendgrid/mail';
sgMail.setApiKey('SG.xxxxxxxxx');
const msg = {
to: 'user@example.com',
from: 'onboarding@example.com',
subject: 'Hello World',
html: '<strong>It works!</strong>',
};
await sgMail.send(msg);
SendGridも比較的シンプルですが、グローバルな状態(setApiKey)を持つ設計になっています。
AWS SES v2(22行 / 580文字)
import { SESv2Client, SendEmailCommand } from "@aws-sdk/client-sesv2";
const client = new SESv2Client({ region: "us-east-1" });
const command = new SendEmailCommand({
FromEmailAddress: "sender@example.com",
Destination: {
ToAddresses: ["recipient@example.com"],
},
Content: {
Simple: {
Subject: { Data: "Hello World", Charset: "UTF-8" },
Body: {
Html: { Data: "<strong>It works!</strong>", Charset: "UTF-8" },
},
},
},
});
await client.send(command);
AWS特有の深くネストされたオブジェクト構造が必要で、コードが冗長になりがちです。
3.4 実際のAPIレスポンスタイム(Knock.appの実測データ)
自分でAPIを叩いてレスポンスタイムを計測するには実際のAPIキーが必要なため、Knock.app が公開しているリアルワールドのベンチマークデータを参照します。
このデータは、Knock.appが実際に送信した1000万〜2500万通のメッセージ(2026年1月8日〜4月8日)に基づいています。
Browse Resend's observed email API response time, error rates, and incident history over the last 90 days.
| 指標 | 値 |
|---|---|
| 中央値 (p50) | 78ms |
| p90 | 125ms |
| p95 | 151ms |
| p99 | 357ms |
| 平均エラー率 | 0.08% |
| 最高エラー率(単日) | 2.45%(2/15) |
| ゼロエラー日数 | 78/90日 |
| Knock内での採用シェア | 1位(10プロバイダー中) |
p50が78msというのは非常に高速です。また、エラー率0.08%は「10プロバイダー中でも最も低いエラー率の一つ」と評価されています。
4. Resendのデメリット・弱点
ここまでResendを褒めてきましたが、もちろん完璧ではありません。Knock.appのレビューや実際の使用感から、以下のデメリットが挙げられます。
Cons:
- Newer and less battle-tested compared to incumbents like Mailgun or SendGrid
- Fewer enterprise features than established providers
- Limited marketing email capabilities
具体的には以下の点に注意が必要です。
1. 実績(Battle-tested)の少なさ
比較的新しいサービスであるため、「10年以上、毎月数十億通を安定して送っている」といったSendGridレベルの枯れた実績はまだありません。実際、Knock.appのデータでは90日間で33件のステータスページ更新(インシデント)が発生しており、SendGridやPostmarkと比べると若干多い傾向があります。
2. エンタープライズ機能の不足
SendGridやMailgunのような老舗サービスに比べると、高度な権限管理、複雑なマーケティングオートメーション、IPプールの詳細な制御などのエンタープライズ向け機能がまだ弱いです。
3. マーケティングメール機能が発展途上
最近「Broadcasts」機能が追加されましたが、MailchimpやActiveCampaignのような本格的なステップメールやA/Bテスト機能は備わっていません。
4. 無料枠の1日制限
月間3,000通まで無料ですが、「1日100通まで」という制限があるため、バッチ処理で一気に送るようなテストには向きません。
5. 日本語サポートの不足
現時点では公式ドキュメントが英語のみで、日本語のサポートチャンネルも存在しません。
5. Resendのコマンド・設定項目まとめ
最後に、Resendを使い始めるための具体的な設定方法をまとめます。
5.1 CLIのインストールと基本操作
Resendは優秀なCLIツール(v1.8.0)を提供しており、ターミナルから直接メール送信やドメイン管理が可能です。
# インストール(Ubuntu / macOS)
curl -fsSL https://resend.com/install.sh | bash
# または npm でインストール
npm install -g resend-cli
# または Homebrew でインストール(macOS)
brew install resend/tap/resend
認証・ログイン
# APIキーを対話形式で設定
resend login
# CI/CD環境では環境変数を使用(loginコマンド不要)
export RESEND_API_KEY=re_xxxxxxxxxxxxx
# ログアウト
resend logout
# 現在の認証状態を確認
resend whoami
# 複数プロファイルの切り替え
resend auth switch
resend domains list --profile production
メール送信
# テキストメールを送信
resend emails send \
--from "Acme <onboarding@resend.dev>" \
--to delivered@resend.dev \
--subject "Hello World" \
--text "It works!"
# HTMLファイルから送信
resend emails send \
--from "Acme <onboarding@resend.dev>" \
--to delivered@resend.dev \
--subject "Hello World" \
--html-file ./welcome.html
# CC・BCC・Reply-Toを指定して送信
resend emails send \
--from "Acme <onboarding@resend.dev>" \
--to delivered@resend.dev \
--subject "Hello World" \
--text "It works!" \
--cc manager@example.com \
--bcc archive@example.com \
--reply-to noreply@example.com
# React Emailテンプレートから送信
resend emails send \
--from "Acme <onboarding@resend.dev>" \
--to delivered@resend.dev \
--subject "Hello World" \
--react-email ./emails/welcome.tsx
# バッチ送信(最大100件)
resend emails batch --file ./emails.json
# 送信済みメール一覧
resend emails list
# 特定メールの詳細取得
resend emails get <id>
# スケジュール済みメールのキャンセル
resend emails cancel <id>
ドメイン管理
# ドメインの追加(リージョン指定可能)
resend domains create --name example.com --region us-east-1
# ドメイン一覧
resend domains list
# DNS検証のトリガー
resend domains verify <id>
# ドメインの削除
resend domains delete <id>
Webhook管理
# Webhookエンドポイントの登録
resend webhooks create \
--endpoint https://example.com/webhook \
--events email.sent email.delivered
# ローカル開発時のWebhookリッスン
resend webhooks listen \
--url https://hostname.tailnet-name.ts.net \
--events email.received
# Webhook一覧
resend webhooks list
診断・その他
# 環境診断(APIキー・ドメイン状態の確認)
resend doctor
resend doctor --json # JSON形式で出力
# CLIのアップデート確認
resend update
# ダッシュボードをブラウザで開く
resend open
# シェル補完スクリプトの生成
resend completion bash >> ~/.bashrc
resend completion zsh >> ~/.zshrc
CI/CDでの使用例(GitHub Actions)
env:
RESEND_API_KEY: ${{ secrets.RESEND_API_KEY }}
steps:
- run: |
resend emails send \
--from "Acme <onboarding@resend.dev>" \
--to delivered@resend.dev \
--subject "Deploy complete" \
--text "Version ${{ github.sha }} deployed."
5.2 Go SDKの使い方
package main
import (
"fmt"
"github.com/resendlabs/resend-go"
)
func main() {
client := resend.NewClient("re_xxxxxxxxx")
// 基本的なメール送信
params := &resend.SendEmailRequest{
From: "Acme <onboarding@resend.dev>",
To: []string{"user@example.com"},
Subject: "Hello World",
Html: "<strong>It works!</strong>",
}
sent, err := client.Emails.Send(params)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(sent.Id)
// 添付ファイル付きメール
paramsWithAttachment := &resend.SendEmailRequest{
From: "Acme <onboarding@resend.dev>",
To: []string{"user@example.com"},
Subject: "Hello with attachment",
Html: "<p>Please see the attached file.</p>",
Attachments: []*resend.Attachment{
{
Filename: "invoice.pdf",
Path: "/path/to/invoice.pdf",
},
},
}
_, _ = client.Emails.Send(paramsWithAttachment)
// バッチ送信(最大100件)
var batchParams []*resend.SendEmailRequest
for i := 0; i < 5; i++ {
batchParams = append(batchParams, &resend.SendEmailRequest{
From: "Acme <onboarding@resend.dev>",
To: []string{fmt.Sprintf("user%d@example.com", i)},
Subject: fmt.Sprintf("Hello User %d", i),
Html: fmt.Sprintf("<p>Welcome, User %d!</p>", i),
})
}
_, _ = client.Emails.SendBatch(batchParams)
}
5.3 SMTPとしての利用
既存のシステム(WordPressやレガシーシステム)から移行する場合、SMTPインターフェースも用意されています。
| 設定項目 | 値 |
|---|---|
| Host | smtp.resend.com |
| Port |
25, 465, 587, 2465, 2587
|
| Username | resend |
| Password | あなたのAPIキー |
| 暗号化 | TLS(推奨: 465または587) |
5.4 ドメイン認証の設定項目
本番環境で利用するには、独自ドメインの認証が必須です。ダッシュボードからドメインを追加し、以下のDNSレコードを設定します。
| レコード種別 | 目的 | 必須/任意 |
|---|---|---|
| SPF (TXT) | 送信元サーバーを証明 | 必須 |
| DKIM (TXT) | メールの改ざん防止 | 必須 |
| DMARC (TXT) | なりすまし防止ポリシー | 推奨 |
| BIMI (TXT) | 受信トレイにブランドロゴを表示 | 任意 |
| MX (MX) | 受信メール処理(Inbound機能使用時) | Inbound使用時のみ |
5.5 Webhookイベント一覧
Resendが送信するWebhookイベントの主な種類です。
| イベント | 説明 |
|---|---|
email.sent |
メールが送信キューに追加された |
email.delivered |
受信サーバーに配信された |
email.delivery_delayed |
配信が遅延している |
email.complained |
スパム報告された |
email.bounced |
バウンス(配信失敗)した |
email.opened |
メールが開封された |
email.clicked |
リンクがクリックされた |
contact.created |
コンタクトが作成された |
contact.deleted |
コンタクトが削除された |
まとめ
Resendは、「開発者が気持ちよく使えること」に全振りした素晴らしいサービスです。特に新規プロジェクトや、React/Next.js、Goなどを活用しているモダンなWebアプリケーションには第一の選択肢になるでしょう。
実測ベンチマークでも、TypeScript SDKのインストールサイズ(212KB)はSendGrid(836KB)やAWS SES(11MB)と比べて圧倒的に軽量で、APIのレスポンスタイム(p50: 78ms)やエラー率(0.08%)も業界トップクラスです。
一方で、月間数百万通を超えるような超大規模配信や、マーケティング部門がゴリゴリに使うような用途であれば、SendGridやAWS SES、Postmarkといった既存のサービスの方が適している場面もまだまだあります。
| 観点 | Resend | SendGrid | AWS SES | Mailgun | Postmark |
|---|---|---|---|---|---|
| 開発者体験 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 料金(大量送信) | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| 実績・安定性 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| マーケティング機能 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| SDKの軽量さ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 到達速度 | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
用途に合わせて、ぜひ最適なメール配信サービスを選んでみてください!
Discussion