今回やること
ResendのNode.js SDKを使い、HTMLの動作確認メールをまず1通だけ送る最小構成を作ります。
この記事の到達点は次の4つです。
- API keyを環境変数へ保存する
- verified domainの送信元を指定する
resend.emails.send()をserver側で呼ぶ- 返された送信IDまたはerrorを確認する
API keyはbrowserへ渡さず、server側だけで読み込みます。
Resendとは
Resendは、applicationからtransactional emailを送るためのAPIです。Node.js SDKではfrom、to、subjectと、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済みdomaintoは自分が確認できる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を追加しましょう。