2025-06-03
【Tips - Resend】実例でわかるシリーズ
みなさんどうも、こんばんみ~。某ぎょうざです。
はい、今更ながら、問い合わせフォームなどでメール送信機能を実装する際に便利なツール
Resend(リセンド)を利用する際に、ぎょうざが躓いたところを備忘録として記録しておきます。
同じようなケースあるいは現象で困っている方の参考になれば幸いです。
【目次】
<Useful> ▶ 無料枠の利用限度(2025/06/03時点) ▶ React Emailと組み合わせ ▶ メール送信APIの例 ▶ 独自カスタムドメインを設定して、そのドメインからメール送信も可能 <Error> ▶ Edge Runtime vs Node.js API: Resendメール送信のつまづきと最適解 <Warn> ▶ 〆のひと言
<Useful>
▶ 無料枠の利用限度(2025/06/03時点)
- 送信可能数:100通/日、最大3000通/月
▶ React Emailと組み合わせ
React Emailと呼ばれるパッケージと組み合わせれば、送信する際のテンプレートも利用できます
▶ メール送信APIの例
- 有用性:問い合わせフォームをコンポーネントとして用意してメール送信機能を追加する
- 根拠:ResendのAPI経由で送信
- 具体例:以下Next.js (v15.3.2)、Resend (v^4.5.1)で実装したときのソースコード
try {
const data = await resend.emails.send({
from: process.env.CONTACT_FORM_SEND_FROM_EMAIL || '', // 送信元
to: [email, process.env.CONTACT_FORM_SEND_TO_EMAIL || ''], // 送信先
subject: `【${SITE_NAME}】より【お問い合わせ内容の確認】`,
react: ContactFormEmailTemplate({ name, email, message }), // メールテンプレートコンポーネント
replyTo: email, // ユーザーのメールアドレスに返信できるようにする
text: `名前: ${name}\nメールアドレス: <span class="math-inline">\{email\}\\nメッセージ\:\\n</span>{message}`, // プレーンテキスト版のメール
});
▶ 独自カスタムドメインを設定して、そのドメインからメール送信も可能
<Error>
▶ Edge Runtime vs Node.js API: Resendメール送信のつまづきと最適解
- 現象:
Cloudflare PagesにデプロイしたNext.jsアプリで、Resend SDKを使ったメール送信機能が「Error: A Node.js API is used (MessageChannel) which is not supported in the Edge Runtime.」というエラーで動作しない。Cloudflare Pagesのビルドシステムは、全ての非静的ルート(APIルート含む)にexport const runtime = 'edge';
を要求する。 - 原因:
Resend SDK(またはその依存関係、特にメールテンプレートをReactコンポーネントでレンダリングする部分)が、Edge Runtimeでは利用できないNode.js固有のAPI(例:MessageChannel
)に依存している。一方、Cloudflare PagesのビルドはAPIルートにもEdge Runtimeを強制する。 - 解決策:
Node.jsのフル機能が必要なメール送信処理を、Next.jsアプリケーションとは独立したCloudflare Workerに切り出し、Next.jsアプリからはそのWorkerをREST APIとして呼び出す。
- Cloudflare Workerプロジェクト作成: Wrangler CLIで新規Workerプロジェクトを作成。
-
wrangler.toml
設定:compatibility_flags = [ "nodejs_compat" ]
を設定し、Node.js互換モードを有効化。 - Workerスクリプト実装: HonoとResend SDKを使い、メール送信APIエンドポイントを作成。APIキーはWorkerのシークレットで管理。Next.jsアプリからのアクセスを許可するため、CORS設定を適切に行う。
- Workerデプロイ:
npx wrangler deploy
でデプロイ。 - Next.jsアプリからの呼び出し: 問い合わせフォームコンポーネント (例:
ContactForm.tsx
) のfetch
先を、デプロイしたWorkerのURLに変更。WorkerのURLは環境変数 (NEXT_PUBLIC_CONTACT_WORKER_URL
) で管理。 - Next.jsの該当ページ (
/contact
) のランタイム:export const runtime = 'edge';
を設定したままにできる(メール送信ロジックは外部Workerにあるため)。- 工夫点: これにより、Next.jsアプリ本体はEdgeの恩恵を受けつつ、Node.js依存の処理は専用のWorkerに任せることで、ランタイムの競合を回避できた。
<Warn>
▶
- 現象:???
- 原因:???
- 解決策:???
〆のひと言
Resendは、メール送信機能を組み込むのに便利なツールです。
自身のWebサービスに問い合わせフォームを実装したい方におすすめです。
ここまで読んでいただき、ありがとうございました。
以上、某ぎょうざでした。