resend について
resend スキルは、SDK を使って Resend のメール機能を組み込む開発者向けのガイドです。送受信、アカウントリソース、Webhook に加え、冪等性やエラー処理の実践も扱います。
主な機能
- 01単一・一括メール送信
- 02受信メールと Webhook の処理
- 03メール、ドメイン、連絡先の管理
- 04テンプレート、ブロードキャスト、自動化
- 05冪等性とエラー処理のガイド
活用シーン
- 01アプリへのトランザクションメール追加
- 02受信メールと添付ファイルの処理
- 03連絡先とマーケティング配信の管理
- 04リトライ時の重複送信の防止
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ resend/ resend-skills --skill resendインストール後、Claude Code で/resendを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api-keys.mdautomations.mdbroadcasts.mdcontact-properties.mdcontacts.mddomains.mdevents.mdfetch-all-templates.mjsinboxes.mdinstallation.mdlogs.mdreceiving.mdsegments.mdtemplates.mdtopics.mdusage.mdwebhooks.mdreferences/sending/batch-email-examples.mdbest-practices.mdemail-management.mdoverview.mdsingle-email-examples.md詳細
Resend
クイック送信 — Node.js
import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);
const { data, error } = await resend.emails.send(
{
from: 'Acme <[email protected]>',
to: ['[email protected]'],
subject: 'Hello World',
html: '<p>Email body here</p>',
},
{ idempotencyKey: `welcome-email/${userId}` }
);
if (error) {
console.error('Failed:', error.message);
return;
}
console.log('Sent:', data.id);
重要な注意点: Resend Node.js SDK は例外をスローせず、{ data, error } を返します。API エラーには try/catch を使わず、必ず error を明示的に確認してください。
クイック送信 — Python
import resend
import os
resend.api_key = os.environ["RESEND_API_KEY"]
email = resend.Emails.send({
"from": "Acme <[email protected]>",
"to": ["[email protected]"],
"subject": "Hello World",
"html": "<p>Email body here</p>",
}, idempotency_key=f"welcome-email/{user_id}")
単一送信と一括送信の選び方
| 選択肢 | 条件 |
|---|---|
単一(POST /emails) | メールが 1 通、添付ファイルが必要、または送信予約が必要 |
一括(POST /emails/batch) | 異なるメールが 2~100 通、添付ファイルなし、送信予約なし |
一括送信はアトミックです。1 通でも検証に失敗すると、バッチ全体が失敗します。送信前に必ず検証してください。一括送信は添付ファイルと scheduled_at をサポートしていません。
冪等性キー(再試行時に重要)
失敗したリクエストを再試行したときに、メールが重複して送信されるのを防ぎます。
| キーの情報 | |
|---|---|
| 形式(単一) | <event-type>/<entity-id>(例:welcome-email/user-123) |
| 形式(一括) | batch-<event-type>/<batch-id>(例:batch-orders/batch-456) |
| 有効期限 | 24 時間 |
| 最大長 | 256 文字 |
| 同じキー + 同じペイロード | 再送せずに元のレスポンスを返します |
| 同じキー + 異なるペイロード | 409 エラーを返します |
クイック受信(Node.js)
import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);
export async function POST(req: Request) {
const payload = await req.text(); // Must use raw text, not req.json()
const event = resend.webhooks.verify({
payload,
headers: {
'svix-id': req.headers.get('svix-id'),
'svix-timestamp': req.headers.get('svix-timestamp'),
'svix-signature': req.headers.get('svix-signature'),
},
secret: process.env.RESEND_WEBHOOK_SECRET,
});
if (event.type === 'email.received') {
// Webhook has metadata only — call API for body
const { data: email } = await resend.emails.receiving.get(
event.data.email_id
);
console.log(email.text);
}
return new Response('OK', { status: 200 });
}
重要な注意点: Webhook ペイロードにはメール本文が含まれません。別途 resend.emails.receiving.get() を呼び出す必要があります。
必要な情報を探す
| タスク | リファレンス |
|---|---|
| メールを1通送信する | sending/overview.md — パラメーター、到達性、テスト |
| メールを一括送信する | sending/overview.md → sending/batch-email-examples.md |
| SDKの完全なサンプル(Node.js、Python、Go、cURL) | sending/single-email-examples.md |
| 冪等性、リトライ、エラー処理 | sending/best-practices.md |
| メールの取得、一覧表示、再スケジュール、キャンセル、メトリクスの取得 | sending/email-management.md |
| 受信メールを受け取る | receiving.md — ドメイン設定、Webhook、添付ファイル |
| テンプレートを管理する(CRUD、変数) | templates.md — ライフサイクル、エイリアス、ページネーション |
| Webhookを設定する(イベント、検証) | webhooks.md — 検証、CRUD、リトライスケジュール、IP許可リスト |
| ドメインを管理する(作成、検証、登録、DNS) | domains.md — リージョン、TLS、トラッキング、登録、機能 |
| 連絡先を管理する(CRUD、プロパティ) | contacts.md — セグメント、トピック、カスタムプロパティ、一括CSVインポート |
| ブロードキャストを送信する(マーケティングキャンペーン) | broadcasts.md — ライフサイクル、スケジュール設定、テンプレート変数 |
| APIキーを管理する | api-keys.md — 権限の範囲設定、ドメイン制限 |
| APIリクエストログを表示する | logs.md — API呼び出し履歴の一覧表示と取得、デバッグ |
| 連絡先プロパティを定義する | contact-properties.md — 連絡先用のカスタムフィールド |
| セグメントを管理する(連絡先グループ) | segments.md — ブロードキャストのターゲティング、連絡先のグループ化 |
| トピックを管理する(購読) | topics.md — オプトイン/オプトアウトの設定、ブロードキャストのフィルタリング |
| オートメーションを作成する(イベント駆動型ワークフロー) | automations.md — ステップ、接続、実行、条件 |
| イベントを定義して送信する(オートメーションのトリガー) | events.md — スキーマ、ペイロード、連絡先との関連付け |
| アカウントの使用状況とクォータを確認する | usage.md — メール、連絡先、セグメント、ブロードキャスト、AIクレジット、オートメーションの実行、ドメイン、レート制限 |
| 受信トレイを管理する(スレッド、返信、下書き) | inboxes.md — ラベル、フォルダー、検索、エージェント設定、受信トレイのWebhookイベント |
| SDKをインストールする(8言語以上) | installation.md |
| AIエージェントの受信トレイを設定する | agent-email-inbox スキルをインストールしてください — 信頼できない入力に対するセキュリティレベルについて説明しています |
SDKのバージョン要件
常に最新バージョンのSDKをインストールしてください。古いSDKでは、webhooks.verify()、emails.receiving.get()、domains.claims.* が利用できない場合があります。
プロジェクトにResend SDKがすでにインストールされている場合は、installation.md に記載された最低バージョンと照合し、下回っていればアップグレードしてください。
言語ごとの最低バージョン、インストールコマンド全体、言語の検出方法、cURLによる代替手段については、installation.md を参照してください。
共通の設定
APIキー
環境変数に保存し、ハードコードしないでください:
export RESEND_API_KEY=re_xxxxxxxxx
キーは resend.com/api-keys で取得できます。
プロジェクトの言語を検出する
次のファイルを確認してください:package.json(Node.js)、requirements.txt/pyproject.toml(Python)、go.mod(Go)、Gemfile(Ruby)、composer.json(PHP)、Cargo.toml(Rust)、pom.xml/build.gradle(Java)、*.csproj(.NET)。
よくある間違い
| # | 間違い | 修正方法 |
|---|---|---|
| 1 | 冪等性キーを指定せずに再試行する | 必ず冪等性キーを含めてください。再試行時の重複送信を防げます。形式:<event-type>/<entity-id> |
| 2 | Webhook の署名を検証しない | 必ず resend.webhooks.verify() で検証してください。未検証のイベントは信頼できません |
| 3 | テンプレート変数名の不一致 | 変数名は大文字と小文字が区別されるため、テンプレート定義と完全に一致させる必要があります。トリプルマスタッシュの {{{VAR}}} 構文を使用してください |
| 4 | Webhook ペイロードにメール本文が含まれていると思い込む | Webhook に含まれるのはメタデータのみです。本文の内容を取得するには resend.emails.receiving.get() を呼び出してください |
| 5 | Node.js SDK のエラー処理に try/catch を使う | SDK は { data, error } を返します。error を明示的に確認し、try/catch で囲まないでください |
| 6 | 添付ファイル付きメールに一括送信を使う | 一括送信は添付ファイルに対応していません。代わりに個別に送信してください |
| 7 | 偽のメールアドレス([email protected])でテストする | [email protected] を使用してください。偽のアドレスはバウンスし、送信者の評価を損ないます |
| 8 | 下書きのテンプレートで送信する | 送信する前にテンプレートを公開する必要があります。先に .publish() を呼び出してください |
| 9 | 同じ送信呼び出しで html と template を使用する | これらは併用できません。テンプレートを使用する場合は html/text/react を削除してください |
| 10 | 受信メール用の MX レコードの優先度が最も低くない | Resend の MX レコードの数値を最も小さく(優先度を最も高く)してください。そうしないとメールがルーティングされません |
| 11 | resend.dev から送信すると 403 になる | デフォルトの [email protected] はサンドボックスであり、Resend アカウントのメールアドレスにしか配信できません。先に自分のドメインを検証してください |
| 12 | ドメイン不一致による 403 | from アドレスのドメインは、検証済みドメインと完全に一致している必要があります。send.acme.com を検証済みでも、[email protected] から送信すると失敗します |
| 13 | ブラウザーから Resend API を呼び出す(CORS) | API は CORS に対応していません。これは API キーを保護するための意図的な仕様です。必ずサーバー側(API ルート、サーバーレス関数)から呼び出してください |
| 14 | 401 restricted_api_key | 送信専用の API キーを、送信以外のエンドポイント(domains、contacts など)で使用しています。代わりにフルアクセスキーを作成してください |
分野横断的な考慮事項
送信と受信を併用する
自動返信、メール転送、その他の受信後に送信するワークフローには、両方の機能が必要です。
- 先に受信用ドメインを設定します(receiving.md を参照)
- 送信を設定します(sending/overview.md を参照)
- 注意:一括送信は添付ファイルやスケジュール送信に対応していません。添付ファイル付きで転送する場合は、個別に送信してください
AI エージェントの受信トレイ
システムが信頼できないメールの内容を処理してアクション(返金、データベースの変更、転送など)を実行する場合は、agent-email-inbox スキルをインストールしてください。これは AI を使うかどうかにかかわらず当てはまります。外部送信者からの自由形式のメール内容を解釈するシステムには、セキュリティ対策が必要です。
マーケティングメール
このスキルの送信機能は、トランザクションメール(領収書、確認、通知)向けです。大規模な購読者リストへの配信解除リンクやエンゲージメント追跡を伴うマーケティングキャンペーンには、Resend Broadcasts を使用してください。API については broadcasts.md を参照してください。
ドメインのウォームアップ
新しいドメインでは、送信量を段階的に増やす必要があります。1 日目の上限:約150通(新しいドメイン)または約1,000通(既存のドメイン)。ウォームアップのスケジュールは sending/overview.md を参照してください。
テスト
実在するメールプロバイダーの偽アドレス([email protected]、[email protected])でテストしないでください。 バウンスして送信者の評価を損ないます。
| アドレス | 結果 |
|---|---|
[email protected] | 配信成功をシミュレートします |
[email protected] | ハードバウンスをシミュレートします |
[email protected] | スパム報告をシミュレートします |
抑制リスト
Resend は、ハードバウンスしたアドレスやスパム報告があったアドレスを自動的に抑制します。抑制対象のアドレスに送信すると、配信を試みる代わりに email.suppressed Webhook イベントが発生します。Dashboard → Suppressions で管理できます。
Webhook イベントの種類
| イベント | トリガー |
|---|---|
email.sent | API リクエストが成功しました |
email.delivered | 受信者のメールサーバーに到達しました |
email.bounced | 恒久的に拒否されました(ハードバウンス) |
email.complained | 受信者がスパムとして報告しました |
email.opened / email.clicked | 受信者がメールを開封、またはクリックしました |
email.delivery_delayed | ソフトバウンスが発生し、Resend が再試行します |
email.received | 受信メールが到着しました |
domain.* / contact.* | ドメインまたは連絡先に変更がありました |
詳細、署名の検証、再試行スケジュールについては、webhooks.md をご覧ください。
エラー処理のクイックリファレンス
| コード | 対応 |
|---|---|
| 400, 422 | リクエストパラメーターを修正し、再試行しないでください |
| 401 | API キーを確認してください。restricted_api_key は、送信専用キーが送信以外のエンドポイントで使用されたことを示します |
| 403 | ドメインの所有権を確認してください。よくある原因は、resend.dev のサンドボックス、from ドメインの不一致、未検証のドメインです |
| 409 | 冪等性の競合です。新しいキーを使用するか、ペイロードを修正してください |
| 429 | レート制限に達しました。指数バックオフで再試行してください(デフォルトのレート制限:2 req/s) |
| 500 | サーバーエラーです。指数バックオフで再試行してください |