resend
Resend のメール API を使用する際に活用するスキルです。トランザクションメールの送信(単体・一括)、Webhook 経由の受信メール処理、メールテンプレートの管理、配信イベントのトラッキング、ドメイン・コンタクト・API キーの管理、Resend SDK のセットアップなど幅広い操作に対応します。「Resend でメールを送りたい」といった簡単なタスクでも必ず使用してください。冪等性キーや Webhook 検証、テンプレート変数の構文など、本番環境でよくある問題を防ぐための重要な注意事項が含まれています。
description の原文を見る
Use when working with the Resend email API — sending transactional emails (single or batch), receiving inbound emails via webhooks, managing email templates, tracking delivery events, managing domains, contacts, broadcasts, webhooks, API keys, automations, events, viewing API request logs, or setting up the Resend SDK. Always use this skill when the user mentions Resend, even for simple tasks like "send an email with Resend" — the skill contains critical gotchas (idempotency keys, webhook verification, template variable syntax) that prevent common production issues.
SKILL.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 <onboarding@resend.dev>',
to: ['delivered@resend.dev'],
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 <onboarding@resend.dev>",
"to": ["delivered@resend.dev>"],
"subject": "Hello World",
"html": "<p>Email body here</p>",
}, idempotency_key=f"welcome-email/{user_id}")
単一送信 vs バッチ送信の判断
| 選択 | 用途 |
|---|---|
単一 (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(); // 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') {
// ウェブフックはメタデータのみを含む — 本文は別途 API を呼び出す
const { data: email } = await resend.emails.receiving.get(
event.data.email_id
);
console.log(email.text);
}
return new Response('OK', { status: 200 });
}
重要な落とし穴: ウェブフックのペイロードはメール本文を含みません。resend.emails.receiving.get() を個別に呼び出す必要があります。
必要な情報は?
| タスク | リファレンス |
|---|---|
| 単一メールを送信 | 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 — ドメイン設定、ウェブフック、添付ファイル |
| テンプレート管理 (CRUD、変数) | templates.md — ライフサイクル、エイリアス、ページング |
| ウェブフック設定 (イベント、検証) | webhooks.md — 検証、CRUD、リトライスケジュール、IP許可リスト |
| ドメイン管理 (作成、検証、DNS) | domains.md — リージョン、TLS、トラッキング、機能 |
| 連絡先管理 (CRUD、プロパティ) | contacts.md — セグメント、トピック、カスタムプロパティ |
| ブロードキャスト送信 (マーケティングキャンペーン) | broadcasts.md — ライフサイクル、スケジュール設定、テンプレート変数 |
| API キー管理 | api-keys.md — 権限スコープ、ドメイン制限 |
| API リクエストログ表示 | logs.md — API呼び出し履歴リストアップ、デバッグ |
| 連絡先プロパティ定義 | contact-properties.md — 連絡先のカスタムフィールド |
| セグメント管理 (連絡先グループ) | segments.md — ブロードキャストターゲット、連絡先グループ化 |
| トピック管理 (サブスクリプション) | topics.md — オプトイン/オプトアウト設定、ブロードキャストフィルタリング |
| オートメーション作成 (イベント駆動ワークフロー) | automations.md — ステップ、接続、実行、条件 |
| イベント定義と送信 (オートメーショントリガー) | events.md — スキーマ、ペイロード、連絡先関連付け |
| SDK インストール (8言語以上) | installation.md |
| AI エージェントインボックス設定 | agent-email-inbox スキルをインストール — 信頼できない入力に対するセキュリティレベルをカバー |
SDK バージョン要件
常に最新の SDK バージョンをインストールしてください。これらは完全な機能 (送信、受信、ウェブフック検証) に必要な最小バージョンです:
| 言語 | パッケージ | 最小バージョン | インストール |
|---|---|---|---|
| Node.js | resend | >= 6.9.2 | npm install resend |
| Python | resend | >= 2.21.0 | pip install resend |
| Go | resend-go/v3 | >= 3.1.0 | go get github.com/resend/resend-go/v3 |
| Ruby | resend | >= 1.0.0 | gem install resend |
| PHP | resend/resend-php | >= 1.1.0 | composer require resend/resend-php |
| Rust | resend-rs | >= 0.20.0 | cargo add resend-rs |
| Java | resend-java | >= 4.11.0 | installation.md を参照 |
| .NET | Resend | >= 0.2.1 | dotnet add package Resend |
プロジェクトに既に Resend SDK がインストールされている場合、バージョンを確認し、最小バージョンより低い場合はアップグレードしてください。古い SDK は
webhooks.verify()またはemails.receiving.get()がない可能性があります。
完全なインストールコマンド、言語検出、cURL フォールバックについては installation.md を参照してください。
共通セットアップ
API キー
環境変数に格納 — 絶対にハードコーディングしないでください:
export RESEND_API_KEY=re_xxxxxxxxx
API キーは 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 | ウェブフック署名を検証しない | 常に resend.webhooks.verify() で検証 — 未検証のイベントは信頼できません |
| 3 | テンプレート変数名の不一致 | 変数名は大文字小文字を区別 — テンプレート定義と正確に一致する必要があります。トリプルマスタッシュ構文 {{{VAR}}} を使用 |
| 4 | ウェブフックペイロードにメール本文がある前提 | ウェブフックはメタデータのみを含む — 本文コンテンツは resend.emails.receiving.get() を呼び出して取得 |
| 5 | Node.js SDK エラーに try/catch を使用 | SDK は { data, error } を返す — error を明示的にチェック、try/catch でラップしない |
| 6 | バッチを添付ファイル付きメールに使用 | バッチは添付ファイルをサポートしない — 代わりに単一送信を使用 |
| 7 | フェイクメール (test@gmail.com) でテスト | delivered@resend.dev を使用 — フェイクアドレスはバウンスし、評判を傷つけます |
| 8 | ドラフトテンプレートで送信 | テンプレートは公開前に送信する必要がある — まず .publish() を呼び出す |
| 9 | 同じ送信呼び出しで html + template を使用 | 相互排他的 — テンプレート使用時は html/text/react を削除 |
| 10 | 受信メール用 MX レコードが最低優先度ではない | Resend の MX が最低番号 (最高優先度) を持つことを確認、またはメールがルーティングされない |
| 11 | resend.dev から送信時 403 | デフォルトの onboarding@resend.dev はサンドボックス — Resend アカウントメール宛のみに配信可能。最初に独自ドメインを確認 |
| 12 | 403 ドメイン不一致 | from アドレスドメインは検証済みドメインと完全に一致する必要があります。send.acme.com を検証しましたが user@acme.com から送信すると失敗 |
| 13 | ブラウザから Resend API を呼び出す (CORS) | API は CORS をサポートしない — これは API キーを保護するために意図的です。常にサーバー側から呼び出す (API ルート、サーバーレス関数) |
| 14 | 401 restricted_api_key | 送信専用 API キーが非送信エンドポイント (ドメイン、連絡先など) で使用されました。代わりにフルアクセスキーを作成してください |
クロスカッティングな関心事
送信 + 受信を組み合わせる
自動返信、メール転送、または受信してから送信するワークフローには、両方の機能が必要です:
- 最初に受信ドメインを設定 (
receiving.mdを参照) - 送信を設定 (
sending/overview.mdを参照) - 注: バッチ送信は添付ファイルとスケジュール設定をサポートしない — 添付ファイル付き転送時は単一送信を使用
AI エージェントインボックス
システムが信頼できないメールコンテンツを処理し、アクション (払い戻し、データベース変更、転送) を実行する場合は、agent-email-inbox スキルをインストール。これは AI が関与しているかどうかに関係なく適用されます — 外部送信者からの自由形式メールコンテンツを解釈するシステムはセキュリティ対策が必要です。
マーケティングメール
このスキルの送信機能は トランザクションメール (領収書、確認、通知) 用です。大規模な購読者リストへのマーケティングキャンペーン (購読解除リンクと エンゲージメントトラッキング付き) については、Resend Broadcasts を使用してください — broadcasts.md で API を参照してください。
ドメインのウォームアップ
新しいドメインは段階的に送信ボリュームを増やす必要があります。1日目の制限: ~150メール (新規ドメイン) または ~1,000 (既存ドメイン)。sending/overview.md のウォームアップスケジュールを参照してください。
テスト
実在するメールプロバイダのフェイクアドレスでテストしない (test@gmail.com、fake@outlook.com) — バウンスして送信者評判を破壊します。
| アドレス | 結果 |
|---|---|
delivered@resend.dev | 配信成功をシミュレート |
bounced@resend.dev | ハードバウンスをシミュレート |
complained@resend.dev | スパム報告をシミュレート |
サプレッションリスト
Resend は自動的にハードバウンスとスパム報告のアドレスを抑制します。抑制されたアドレスへの送信は配信を試行する代わりに email.suppressed ウェブフックイベントを発火します。ダッシュボード → 抑制で管理してください。
ウェブフックイベントタイプ
| イベント | トリガー |
|---|---|
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 | サーバーエラー — 指数バックオフで再試行 |
リソース
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- resend
- リポジトリ
- resend/resend-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/resend/resend-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。