開発・個人開発

Resendでメール送信を実装する 個人開発に使えるAPIの基本

Resendでメール送信を実装する 個人開発に使えるAPIの基本

この記事の要点

Resendは開発者向けのメール送信APIで、無料プランで月3,000件まで送信できる。APIキーの取得・ドメイン設定・JavaScriptでのメール送信実装まで、個人開発に必要な手順を解説する。

結論

Resendのセットアップは、アカウント作成→APIキー取得→ドメイン設定(オプション)→コード実装の4ステップで30分以内に完了する。JavaScriptからfetchでPOSTするだけでメールが送れるため、バックエンドに組み込みやすい。

アカウント作成とAPIキーの取得

1. アカウント作成

resend.comにアクセスし、GitHubアカウントでサインインする。メールアドレスでも登録できる。

2. APIキーの生成

ダッシュボード → API Keys → 「Create API Key」を選択する。

Name: my-project-key
Permission: Full access(または Sending access)
Domain: All domains(または特定のドメインに限定)

生成されたAPIキー(re_から始まる)をコピーして安全な場所に保存する。このキーは作成直後しか表示されない。

3. 環境変数に設定する

.envに追加する:

RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

コードに直接書かず、必ず環境変数として管理する。

最もシンプルな実装(fetchを使う)

Node.js・Deno・Edge Functionsなど、fetchが使える環境ならどこでも動く。

async function sendEmail({ to, subject, text }) {
  const res = await fetch('https://api.resend.com/emails', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.RESEND_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      from: 'Meliorra <noreply@your-domain.com>',
      to: [to],
      subject,
      text,
    }),
  });

  if (!res.ok) {
    const error = await res.json();
    throw new Error(`Email send failed: ${JSON.stringify(error)}`);
  }

  return res.json();
}

// 使い方
await sendEmail({
  to: 'user@example.com',
  subject: 'お問い合わせを受け付けました',
  text: 'お問い合わせありがとうございます。内容を確認次第ご連絡します。',
});

公式SDKを使う方法(Node.js)

Resendの公式SDKを使うとより型安全に実装できる。

npm install resend
import { Resend } from 'resend';

const resend = new Resend(process.env.RESEND_API_KEY);

const { data, error } = await resend.emails.send({
  from: 'お問い合わせ <noreply@your-domain.com>',
  to: ['your-email@example.com'],
  subject: 'テストメール',
  text: 'これはテストメールです。',
});

if (error) {
  console.error('送信エラー:', error);
}

HTMLメールを送る

テキスト形式のほかにHTMLメールも送れる。htmlパラメータにHTMLを渡すだけだ。

await resend.emails.send({
  from: 'noreply@your-domain.com',
  to: ['user@example.com'],
  subject: 'お問い合わせを受け付けました',
  html: `
    <h2>お問い合わせありがとうございます</h2>
    <p>以下の内容でお問い合わせを受け付けました。</p>
    <table>
      <tr><th>お名前</th><td>${name}</td></tr>
      <tr><th>メール</th><td>${email}</td></tr>
    </table>
    <p>3営業日以内にご連絡いたします。</p>
  `,
  text: `お問い合わせありがとうございます。${name}様のお問い合わせを受け付けました。`,
});

htmltextの両方を設定すると、HTMLに対応していないメールクライアントにはプレーンテキストが表示される。

カスタムドメインの設定

noreply@your-domain.comのような自分のドメインから送信するには、DNSの設定が必要だ。

1. ドメインの追加

Resendダッシュボード → Domains → 「Add Domain」でドメインを追加する。

2. DNSレコードの設定

Resendが表示するDNSレコードをドメインレジストラに追加する。

# SPFレコード(送信元の正当性を証明)
TXT @ "v=spf1 include:amazonses.com ~all"

# DKIMレコード(メールの改ざん検知)
CNAME resend._domainkey.your-domain.com → [Resendが指定する値]

DNSの反映を待つ(通常1〜24時間)。Resendダッシュボードで「Verified」になったら設定完了だ。

3. 送信元メールアドレスの設定

ドメインが認証されると、任意の名前@your-domain.comから送信できるようになる。

Supabase Edge Functionsからの使い方

// supabase/functions/send-notification/index.ts
import { serve } from 'https://deno.land/std@0.177.0/http/server.ts';

serve(async (req) => {
  const { to, subject, message } = await req.json();
  
  const resendApiKey = Deno.env.get('RESEND_API_KEY');
  
  const res = await fetch('https://api.resend.com/emails', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${resendApiKey}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      from: 'notifications@your-domain.com',
      to: [to],
      subject,
      text: message,
    }),
  });

  const data = await res.json();
  return new Response(JSON.stringify(data), {
    headers: { 'Content-Type': 'application/json' },
  });
});

Supabase secretsにAPIキーを設定する:

supabase secrets set RESEND_API_KEY=re_xxxxxxxxxx

問い合わせフォームとの組み合わせ実装は問い合わせフォームをSupabase+Resend+Slackで作るで、Slack通知の実装はSlack Incoming Webhookで通知を作るで解説している。

エラーハンドリングとデバッグ

よくあるエラー

エラーメッセージ原因対処
401 UnauthorizedAPIキーが間違い・未設定環境変数を確認
422 Unprocessable Entityfromアドレスのドメインが未認証ドメイン認証を完了させる
429 Too Many Requests送信レート制限に達したしばらく待ってから再送信

テスト用のメールアドレス

ドメインを設定していない場合でも、Resendが提供するテスト用の送信元アドレス(onboarding@resend.dev)を使えばすぐに送信テストができる。

from: 'onboarding@resend.dev',  // テスト用

本番環境では必ず自分のドメインに切り替える。

まとめ

Resendのメール送信実装は、APIキーを取得してfetchでPOSTするだけだ。公式SDKを使えばより型安全に実装できる。カスタムドメインの設定はDNSレコードの追加が必要だが、一度設定すれば自分のドメインから専門的なメールが送れる。Supabase Edge Functionsからも同じfetchを使って実装できるため、サーバーレスのバックエンドとも組み合わせやすい。

よくある質問

Resendは無料で使えますか

無料プランでは月3,000件のメール送信・1つのカスタムドメインが使えます。個人開発の問い合わせフォームや通知メールであれば無料枠で十分です。有料プランは月20ドルから(月5万件)です。

Resendと他のメール送信サービスの違いは何ですか

ResendはAPIとSDKの設計が開発者向けで、セットアップが速く、React Emailとの組み合わせでHTMLメールを作りやすい点が特徴です。SendGridやMailgunと比べてシンプルで、スパム対策の設定が自動化されています。

自分のドメインからメールを送るにはどうすればいいですか

Resendのダッシュボードでドメインを追加し、指定されたDNSレコード(SPF・DKIM)をドメインレジストラに設定します。設定が完了したら「自分のドメイン@your-domain.com」から送信できます。

Supabase Edge FunctionsからResendを使えますか

使えます。Supabase Edge FunctionsはTypeScript/JavaScriptで書けるため、ResendのAPIをfetchで呼び出すか、公式SDKをESM importして使えます。APIキーはSupabase secretsに設定します。