Resend APIでトランザクションメールを送る

初級 | 12分 で読める | 2026.04.24

公式ドキュメント

今回やること

ResendのNode.js SDKを使い、HTMLの動作確認メールをまず1通だけ送る最小構成を作ります。

この記事の到達点は次の4つです。

  1. API keyを環境変数へ保存する
  2. verified domainの送信元を指定する
  3. resend.emails.send()をserver側で呼ぶ
  4. 返された送信IDまたはerrorを確認する

API keyはbrowserへ渡さず、server側だけで読み込みます。

Resendとは

Resendは、applicationからtransactional emailを送るためのAPIです。Node.js SDKではfromtosubjectと、htmlまたはreactを渡して送信します。

本番の宛先へ送るには、自分が管理するdomainをResendでverifyし、そのdomainのaddressをfromに使います。API keyもResend dashboardで作成します。

前提条件

  • Node.js 20.6以上を利用できる
  • Resend accountを作成済み
  • 送信domainをverify済み
node --version
  • Resend API keyを作成済み
  • test送信に使える受信addressがある

domain verificationではDNS recordを設定します。反映待ちの間は先へ進めないため、dashboardでverifiedになったことを確認してください。

プロジェクトを準備する

空のfolderでpackageを初期化し、Resend SDKをinstallします。

npm init -y
npm install resend

package.jsonへES Modulesの指定とscriptを追加します。

{
  "type": "module",
  "scripts": {
    "send:test": "node send-email.mjs"
  }
}

npm install resendが追加したversionとlockfileをそのまま使います。

API keyを環境変数へ保存する

.envを作り、実際の値を保存します。

RESEND_API_KEY=re_xxxxxxxxx
EMAIL_FROM=Ada IT塾 
EMAIL_TO=your-test-address@example.com

.envをGitへ追加してはいけません。

.env
.env.local

この記事やerror reportへ実際のkeyを貼らないでください。漏えいした場合は、すぐにkeyを無効化して再発行します。

最小の送信コードを書く

project rootへsend-email.mjsを作ります。

import { Resend } from "resend";

const { RESEND_API_KEY, EMAIL_FROM, EMAIL_TO } = process.env;

if (!RESEND_API_KEY || !EMAIL_FROM || !EMAIL_TO) {
  throw new Error(
    "RESEND_API_KEY, EMAIL_FROM, EMAIL_TO are required",
  );
}

const resend = new Resend(RESEND_API_KEY);

const { data, error } = await resend.emails.send({
  from: EMAIL_FROM,
  to: [EMAIL_TO],
  subject: "Resend動作確認",
  html: `
    <h1>送信テスト</h1>
    <p>Resend APIから送信しました。</p>
  `,
});

if (error) {
  console.error("送信に失敗しました:", error.name, error.message);
  process.exitCode = 1;
} else {
  console.log("送信を受け付けました:", data.id);
}

resend.emails.send()は、現在のNode.js SDKで使われる送信methodです。

実行する

Node.js 20.6以上では--env-fileを使って環境変数を読み込めます。

node --env-file=.env send-email.mjs

またはscript経由で実行します。

NODE_OPTIONS=--env-file=.env npm run send:test

Windows PowerShellなどでは環境変数の渡し方が異なるため、まず直接のnode --env-fileを使うと確認しやすくなります。

成功を確認する

成功時は、terminalに送信IDが表示されます。

送信を受け付けました: 49a3999c-...

次の3点を確認します。

  • processがexit code 0で終了した
  • Resend dashboardに送信記録がある
  • test用受信boxでmessageを確認できた

APIが受け付けても、最終的な配信結果は別です。配信失敗やbounceはdashboardやwebhookで確認します。

verified domainを確認する

fromのdomainが未verifyの場合、送信は失敗します。

Ada IT塾 <notice@your-verified-domain.example>

表示名は自由に付けられますが、@より後ろはverify済みdomainと一致させます。実在しないexample domainをそのまま使わないでください。

HTMLが大きくなった後は、Resendが対応するreact本文やReact Emailを発展として検討できます。まずこの記事のHTML送信を成功させ、template化は別の変更として進めます。

errorを安全に扱う

利用者へSDK error全体を返してはいけません。server logには調査に必要な種類だけを残し、画面には一般的なmessageを返します。

if (error) {
  console.error("resend error", {
    name: error.name,
    message: error.message,
  });

  return { ok: false, message: "メールを送信できませんでした" };
}

送信先addressや本文に個人情報が含まれる場合、不要なlogを残さない設計も必要です。

よくあるつまずき

API keyをclient codeへ置く

NEXT_PUBLIC_など公開される環境変数へ入れません。送信処理はserver routeやserver actionで実行します。

fromがverify済みdomainではない

dashboardのdomain状態と、EMAIL_FROMのdomainを比較します。

test用addressへ届かない

API response、dashboard、迷惑mail folderの順に確認します。再送を繰り返す前にerror内容を読みます。

二重送信する

buttonの連打やretryで同じmailを送る可能性があります。必要に応じてResendのidempotency keyを設計します。

練習

subjectとHTML本文を「資料請求を受け付けました」へ変更してください。

確認基準は次のとおりです。

  • API keyをcodeへ直接書いていない
  • fromはverify済みdomain
  • toは自分が確認できるtest address
  • error時のexit codeが0にならない
  • logへAPI keyを出していない

まとめ

  • verified domainとAPI keyを準備する
  • API keyはserver側の環境変数で読む
  • resend.emails.send({ from, to, subject, html })で送る
  • responseのdataとerrorを分けて確認する

次のステップ

1通の送信を確認した後に、入力validation、送信履歴、retry、webhookを追加しましょう。

参考リソース

← 一覧に戻る
PR
PR
PR
PR