メインコンテンツへスキップ
kt-tech.blog

【設定・環境構築】Resend × Cloudflare で独自ドメインメール送信を最速セットアップ

設定・環境構築6分で読めます

この記事でわかること

  • Resend でドメインを認証して、自分以外宛にメールを送れるようにするまでの手順
  • 必要な DNS レコード(DKIM / SPF)と、実際に届けるために入れるべき DMARC
  • Cloudflare で Proxy を切らないとメールが動かないという落とし穴
  • 無料プランの制限と、403 validation_error が出たときの原因

Resend アカウント(無料プランで可)と Cloudflare アカウント。ドメインを自分で管理できること。

メモ
Cloudflare でドメインを取得し、Resend で認証して独自ドメインからメール送信できるようにするまでの手順。所要時間は約10分。

はじめに

個人開発でメール認証機能を実装する際、メール送信サービスの選定とドメイン設定が必要になります。Resend は開発者フレンドリーな API を提供しており、Cloudflare と組み合わせることで驚くほどスムーズにセットアップできます。

Resend はドメイン未認証の状態ではアカウントのメールアドレスにしか送信できません。誰にでもメールを送るには独自ドメインの認証が必須です。


Step 1: Resend の無料プランについて

Resend の無料プランの制限:

  • 月 3,000 通まで送信可能
  • 1日 100 通まで
  • カスタムドメイン 1 つ
注意
ドメイン未認証では [email protected] からアカウントに登録した自分のメールアドレス宛にしか送れません。誰にでも送るにはドメイン認証が必須です。

Step 2: Cloudflare でドメインを取得

  1. Cloudflare ダッシュボード → 「ドメインの登録」
  2. 希望のドメイン名を検索して購入
  3. 購入完了 → DNS 管理が自動で Cloudflare に設定される
Tips
Cloudflare で直接取得すると DNS 管理が自動設定されるため、ネームサーバー移行が不要でシームレスです。既存ドメインを他社から持ってくる場合の手順は ドメイン移管の記事 に書いています。

Step 3: Resend でドメインを追加

  1. Resend ダッシュボード → Domains → 「Add Domain」
  2. ドメイン名を入力
  3. Region を選択(日本なら Tokyo / ap-northeast-1)
  4. DNS Records に設定すべきレコードが表示される

Step 4: Cloudflare で DNS レコードを設定

Resend が表示する 3 つの DNS レコードを Cloudflare に追加します:

Resend側でcloudflareへの遷移ボタンが出てくるのでそれを押すと下記の項目も追加する画面に直接遷移します。なので深く考える必要はないはずです。

DKIM(TXT レコード)

  • Type: TXT / Name: resend._domainkey / Content: Resend が表示する値をコピー

SPF(MX + TXT レコード)

注意
Cloudflare の Proxy(オレンジ雲)ではなく DNS Only(グレー雲)にすること。メール関連はプロキシ経由だと動作しません。

DMARC(TXT レコード)

Resend の認証だけなら DKIM と SPF で通りますが、実際に届けるなら DMARC も入れておきます

重要
DMARC がないと、届かない先があります。Gmail や Yahoo! は 2024 年から送信者要件を厳しくしており、SPF / DKIM に加えて DMARC レコードを見ます。まずは p=none(監視のみ、拒否しない)で入れて、レポートを見ながら p=quarantinep=reject と厳しくしていくのが定石です。いきなり p=reject にすると、設定ミスで自分のメールが全部弾かれます。

Step 5: 認証を確認

Resend の Domains ページで Verify をクリック。全てのレコードが Verified になれば完了です。

Cloudflare の場合、DNS 反映がほぼリアルタイムで完了するため、追加後すぐに認証が通りました。他のレジストラでは数時間かかることもあるので、この速さは大きなメリットです。

僕の時は五分くらいで完了しました。

Step 6: コードでメール送信

Bash
npm install resend
Bash
RESEND_API_KEY=re_xxxxxxxxxxxx
TypeScript
import { Resend } from "resend";

const resend = new Resend(process.env.RESEND_API_KEY);
const FROM_EMAIL = "[email protected]";

export async function sendEmail(to: string, subject: string, html: string) {
  const { error } = await resend.emails.send({
    from: FROM_EMAIL,
    to,
    subject,
    html,
  });

  if (error) {
    console.error("Failed to send email:", error);
    throw new Error("メールの送信に失敗しました");
  }
}

Tips

Tips
Cloudflare + Resend は DNS 反映が速く、セットアップが非常にスムーズ。10 分程度で完了します。
Tips
Region は Tokyo (ap-northeast-1) を選ぶと日本向け配信レイテンシが最小に。
Tips
Terraform での Resend 管理は、コミュニティプロバイダが 2023 年以降更新停止。手動設定が推奨。
Tips
from に使うアドレスは noreply@ でも構いませんが、reply-to には届くアドレスを入れておくと親切です。認証メールに返信してくるユーザーは実際にいます。

トラブルシューティング

403 validation_error

「You can only send testing emails to your own email address」→ ドメイン未認証です。認証を完了させてください。

DNS が Verified にならない

  • Cloudflare Proxy が DNS Only になっているか確認
  • Name / Content が正確にコピーされているか確認

参考リンク

まとめ

  • Resend 無料プランでも月 3,000 通送信可能(ドメイン認証必須)
  • Cloudflare × Resend は DNS 反映が速くシームレスにセットアップできる
  • 認証に必要な DNS レコードは DKIM(TXT)と SPF(MX + TXT)の 3 つ。実際に届けるなら DMARC も入れる
  • ドメイン取得から認証完了・メール送信まで約 10 分で完了

更新履歴

  1. DMARC レコードの節を追加(Gmail / Yahoo! の送信者要件で実際の到達率に影響するため。p=none から始める手順も併記)。reply-to についての Tips を追加。DNS レコードの値をインラインコードにし、エスケープが見えていた箇所を修正。callout の色指定を他記事と揃えた。参考リンクと関連記事へのリンクを追加。「この記事でわかること」「対象読者」「前提条件」を概要プロパティへ移動。