仕事で作っているLPのお問い合わせフォームで、送信テストをするたびにメールが迷惑メールフォルダに入ってしまいました。
何度送り直しても結果は同じ…
そこで、メール送信サービスのResend(リセンド)を使うことにしました。
とはいっても、私は設定方法がまったくわからず、ひとつずつ調べながら進めることになりました。
途中で「そもそもこれは何のための設定なんだろう?」と手が止まったこともあったので、仕組みの話も含めて、私が設定した手順をまとめています。
フォームのメールが迷惑メールに入って困っている方に届いたらいいなと思います!
お問い合わせフォームのメールが迷惑メールに入る理由
最初に、なぜ迷惑メールに入ってしまうのかを調べました。
メールを受け取る側(Gmailなど)は、このメールは本当に名乗っている送り主から来たのかを確認していて、確認できないメールを迷惑メールに回すようです。
その確認に使われているのが、SPFとDKIMという仕組みです。
SPFは「このドメインのメールは、このサーバーから送ります」という届け出のようなものです。
DKIMは、メール1通ごとに押す電子的なハンコのようなものです。
普通のお問い合わせフォーム(PHPのmail()関数など)は、サーバーから「とりあえず送る」だけのことが多く、この届け出やハンコが揃っていない状態になりがちなようです。
また、送信元(From)にお客様が入力したメールアドレスをそのまま使っている場合、受け取る側からは「Gmailのアドレスを名乗っているのに、Gmailから来ていない」ように見えます。
これはなりすましメールと同じ形なので、迷惑メールと判定されやすくなるそうです。
メール設定で出てくるSPF・DKIM・DMARC・ARC・MXレコードについては別記事で詳しく説明しているので気になる方はご参照ください!

Resendってなんぞや
Resendは、メールの送信を代行してくれるサービスです。
フォームのプログラムがメールを自分で送るのではなく、「このメールを送っておいて」とResendにお願いする形に変わります。
そのお願いをするときの合言葉が、あとで作るAPIキーです。
さらに、自分のドメインのDNSに「このドメインのメールはResendが送ってよい」という届け出(SPF)と、ハンコの照合用データ(DKIM)を登録します。
こうすることで、Resendから送られるメールには正しいハンコが押され、受け取る側が正規に送られたメールだと確認できるようになります。
無料プランでできること
私が確認した範囲では、無料プランは月3,000通・1日100通まで、ドメインは3つです。
お問い合わせフォームの通知メールであれば、無料プランで十分だと思います。
【手順①】Resendにドメインを追加する
① Resendにサインアップします。
② 左のメニューの「Domains」→「Add Domain」をクリックします。
③ メールの送信に使うドメインを入力します。
リージョン(送信に使う地域)は東京も選べます。
Resendでは、ルートドメイン(sample.com)ではなく、サブドメイン(mail.sample.com など)の利用が推奨されています。
送信用のドメインをメインのドメインと分けておくことで、メールの評判(信頼度)を切り分けられるためです。
ちなみに私はルートドメインで登録しました。
【手順②】DNSレコードを追加する(さくらのレンタルサーバ)
ドメインを追加すると、Resendの画面のRecordsにDNSに追加すべきレコードが表示されます。
中身はこの3つです。
| 種類 | 名前(ホスト名) | 値 |
|---|---|---|
| MX | send | feedback-smtp.〜.amazonses.com(優先度10) |
| TXT(SPF) | send | v=spf1 include:amazonses.com ~all |
| TXT(DKIM) | resend._domainkey | Resendの画面に表示される長い文字列 |
サブドメインで登録した場合は、名前が「send.mail」「resend._domainkey.mail」のようになります。
値は、必ずResendの画面に表示されたものをそのままコピーして使います。
※ 既存のSPF・DKIM・DMARC・受信用MXを一括削除しないでください。
私はDNSをさくらのレンタルサーバで管理していたので、さくらのコントロールパネルのDNS設定画面から、この3つを追加しました。
追加したら、Resend側で上の方にある「Verify DNS Records」を押して認証します。
DNSの反映には、数分〜数時間かかることもあるようです。
つまずきやすいポイント
DNSをどこで管理しているかによって、入力する場所が変わります。
ドメインを取った会社と、DNSを管理している会社が違うこともあるので、ネームサーバーがどこを向いているかを先に確認しておかないと、違う場所に入力してしまう可能性があります。
また、名前欄に「send.sample.com」と全部入れると、ドメインが二重になってしまいます。
名前欄には「send」だけを入れます。
DMARCも追加しておくと安心
Resendのドメイン認証で設定されるのはSPFとDKIMで、DMARCは自動では作られないようです。
DMARCは、SPFやDKIMの確認に失敗したメールをどう扱うかを受け取る側に伝える設定です。
【手順③】APIキーを作成する
① 左のメニューの「API Keys」をクリックします。
② 「+ Create API Key」をクリックします。
③ 名前・許可・ドメインを入力して作成します。
私はここで、それぞれに何を入れればいいのか迷いました。
名前は自分がわかればOK
名前は何でも大丈夫です。
どこで使っているキーかわかる名前にしておくと、あとで複数作ったときに迷わずに済みます(例:sample-lp-production)。
許可はフルアクセスではなく「Sending access」
最初は「フルアクセスでいいのかな?」と思っていました。
ですが、フルアクセスはドメインの削除や設定変更までできてしまう権限なので、万一キーが漏れたときの被害が大きくなります。
お問い合わせフォームはメールを送るだけなので、送信のみの「Sending access」で十分です。
ドメインは認証したドメインを選ぶ
Sending accessを選ぶと、使えるドメインを指定する項目が出てきます。
「All domains」のままでも動きますが、手順②で認証したドメインに絞っておくほうが安全です。
【手順④】APIキーの保存場所を決める
次に迷ったのが、作ったAPIキーをどこに保存するかです。
「.gitignoreしてリポジトリで管理すればいいのかな?」と思っていたのですが、調べてみると、ローカルと本番サーバーで分けて考えるのがよさそうでした。
ローカル(Docker)では.envに書いて.gitignoreに入れる
ローカルの開発環境では、プロジェクトの.envファイルにキーを書きます。
RESEND_API_KEY=re_xxxxxxxxxxxx
.gitignoreに「.env」を追加して、GitHubなどにアップされないようにします。
docker-compose.ymlで.envを読み込むようにしておけば、PHPからgetenv('RESEND_API_KEY')で取り出せます。
リポジトリには、中身を空にした.env.exampleをコミットしておくと、どんな設定が必要だったか後からわかります。
RESEND_API_KEY=
本番サーバーでは公開ディレクトリの外に置く
本番サーバーでは、公開ディレクトリ(public_htmlなど)の外に設定ファイルを置く方法があります。
私が使っているさくらのレンタルサーバーの標準的な構成では
/home/アカウント名/www/ が公開フォルダなので、例えば次の場所です。
例:/home/アカウント名/private/sample.php
<?php
// 公開ディレクトリの外に置く設定ファイル
return ['api_key' => 're_xxxxxxxxxxxx'];
フォームの送信処理側で、このファイルを読み込みます。
$config = require '/home/アカウント名/private/sample.php';
$apiKey = $config['api_key'];
公開ディレクトリの外に置けば、ブラウザからURLでアクセスされることがないので、キーが外から見える心配がありません。
【手順⑤】PHPのフォーム送信処理をResendに切り替える
最後に、フォームのメール送信部分を、ResendのAPIを呼ぶ形に書き換えます。
追加のライブラリは入れずに、PHPのcURLだけで書けました。
<?php
$data = [
'from' => 'sample <noreply@mail.sample.com>', // 認証したドメインのアドレス
'to' => ['info@sample.com'], // 受け取る側のアドレス
'reply_to' => $customerEmail, // お客様のアドレスはここ
'subject' => '【お問い合わせ】' . $customerName . '様',
'text' => $body,
];$ch = curl_init('https://api.resend.com/emails');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer $apiKey", 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($data, JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$res = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// $code が 200 なら送信成功
fromには、必ず手順②で認証したドメインのアドレスを入れます。
お客様のメールアドレスをfromに入れてしまうと、認証が合わずにまた迷惑メールに入る可能性があります。
お客様のアドレスはreply_toに入れておけば、受け取ったメールに返信したときにお客様へ届きます。
私は開発環境でMailpitを使っていたので、ローカルでは今まで通りMailpitに送り、本番だけResendを使うように環境変数で切り替える形にしました。
テストのたびに本物のメールが飛ばないので、安心して試せます。
また、ドメインの認証が終わる前でも、fromを「onboarding@resend.dev」にすれば、Resendに登録した自分のアドレス宛てだけは送信できます。
コードの動作確認だけ先に進めたいときに使えます。
Resendで迷惑メール対策になるのか
言われるがままに設定を進めていたので、途中で「これで本当に迷惑メール対策になるの?」と疑問に思いました。
調べた範囲では、迷惑メールに入る原因が送信元を確認できないことであれば、Resendで認証を整えることで大きく改善が見込めるようです。
フォームのメールが迷惑メールに入る原因の多くはここなので、今回の私のケースにも合っていました。
ただし、100%迷惑メールに入らなくなるわけではないようです。
新しく作ったドメインは送信の実績がないので最初は様子見されることがあったり、本文の内容で判定されたりすることもあるそうです。
最初の数通は、受け取る側で「迷惑メールではない」を押しておくと落ち着きやすいようです。
また、Resendでなければ解決できないわけではなく、サーバーのメール機能でSPF・DKIMを正しく設定して、自分のドメインのアドレスから送る方法もあります。
Resendのいいところは、認証の設定がわかりやすく、送信ログで送れたかどうかを管理画面で確認できる点だと思います。
お問い合わせを取りこぼしたくないフォームだと、送信の状況を確認できるのは安心材料になりますね。
まとめ
お問い合わせフォームのメールが何度送っても迷惑メールに入ってしまい、Resendを導入することにしました。
最初は設定方法も、そもそも何のための設定なのかもわからないまま進めていましたが、受け取る側が送り主を確認する仕組みと、その確認に必要な届け出とハンコをResendが整えてくれる、ということがわかってからは、ひとつひとつの手順の意味がつながりました。
APIキーの権限を送信のみに絞ること、キーを公開される場所に置かないこと、fromには認証したドメインのアドレスを使うこと、このあたりが私が迷ったところでした。
無事に設定が完了して、フォームからのメールをResend経由で送れるようになりました!


