記事一覧 フォームのメールは mail() と SMTP のどちらで送るか Google Workspace を使っている時の注意
コーディング

フォームのメールは mail() と SMTP のどちらで送るか Google Workspace を使っている時の注意

フォームのメールは mail() と SMTP のどちらで送るか Google Workspace を使っている時の注意
お問い合わせフォームのメールを、PHP の mail() で送るか SMTP で送るかで、メールを送り出すサーバーが変わります(Linux の場合)。
Google Workspace でメールを運用している場合に mail() で送ると、通知が迷惑メールに入ったり、自社のアドレスに届かなかったりすることがあります。

フォームのメールの2つの送り方

フォーム
PHP のプログラム
入力した内容をメールにする
mail() か SMTP で送る
送り出すサーバー
mail() の場合
ホームページのサーバー
SMTP の場合
ホームページ以外のサーバーも選べる
相手の受信サーバーに届ける(SMTP)
受信側
受信サーバー
SPF/DKIM/DMARC で、差出人のドメインから届いたかを確かめる
図:フォームのメールの送り方と、送り出すサーバー

mail() とは

mail() は、PHP でメールを送る関数です。
送ったメールは、ホームページのサーバーの中の、メールを送り出すソフト(sendmail など)に渡り、そのサーバーが送信します(Linux の場合)。
mb_send_mail() も同じ送り方で、WordPress の wp_mail() も、初期設定ではこの送り方です。

SMTP で送るとは

SMTP で送る場合は、PHPMailer などのライブラリや、WordPress の SMTP のプラグインを使い、Google Workspace やサーバー会社のメールサーバーにログインして送ります。
メールソフトから送る時と同じ送り方です(会社のメールの仕組みの記事)。
メールは、ログインしたメールサーバーが送信します。

どちらで送るか

送り方は、普段のメールをどこで運用しているかで選びます。
普段のメールと同じサーバーから送信すると、同じ SPF/DKIM で通ります。
mail() で送る
メールも、ホームページと同じサーバーで運用している場合に向いています。
-f を付けて送ります。
SMTP で送る
メールを Google Workspace などで運用している場合に向いています。

mail() で送る時に注意すること

Google Workspace でメールを運用している場合、普段のメールは Google のサーバーが送信します。
mail() で送ると、ホームページのサーバーが送信するので、次の2つのことが起きる場合があります。

SPF/DKIM/DMARC が通らないことがある

mail() で送ったメールは Google のサーバーを経由しないので、Google Workspace に合わせた SPF/DKIM(会社のメールの仕組みの記事)が通らず、DMARC も通りません。
そのため、迷惑メールに入ることがあります。
通るようにするには、ドメインとサーバーの設定で、次の2つを確かめます。
  1. SPF に、ホームページのサーバーが入っているか
  2. ホームページのサーバーで DKIM の署名を有効にし、公開鍵を DNS に登録してあるか(DKIM に対応しているサーバーの場合)
合わせて、フォームから送るメールのエンベロープの送信元と From を、どちらも自社のドメインのアドレスにします。
エンベロープの送信元(Envelope From)は、直訳すると「封筒の差出人」、意訳すると「サーバー同士の受け渡しに使う差出人」です。
この差出人のアドレスは、届いたメールのヘッダーの Return-Path に書いてあります。
受信サーバーは、このアドレスのドメインで SPF を確かめます。
mail() の初期設定では、user@sv123.example.net のようなサーバーのアドレスになることがあるので、-f で自社のドメインのアドレスにします。
WordPress の wp_mail() の場合は、phpmailer_init で $phpmailer->Sender を指定すると、-f と同じになります。

次の例では、-f の後ろの info@example.co.jp が、エンベロープの送信元になります。
PHP の例
mail($to, $subject, $body, $headers, '-f info@example.co.jp');

社内向けの通知が届かないことがある

MX レコードを Google Workspace など別のサーバーに向けていても、その通りに届かないことがあります。
条件は、次の2つが重なることです。
  • ホームページのサーバーでも、自社のドメインのメールが使える状態になっている(ドメインを追加すると、自動でこの状態になるサーバーもあります)
  • お問い合わせの通知を、ホームページのサーバーから送っている(mail() で送る時など)
この時、社内向けの通知メールは、MX を見ずにホームページのサーバーの中の受信箱に入り、Google Workspace に届きません(受信箱が無い時は、エラーで戻ります)。
フォームの画面にはエラーが出ず、自社のドメイン以外のアドレスへの自動返信は届くので、原因に気付きにくいです。

直す時は、ホームページのサーバーの管理画面で、自社のドメイン宛てのメールを、MX の通りに外へ送る設定にします(設定方法はサーバーによります)。

送ったメールを確かめる

mail() と SMTP のどちらで送る時も、次の手順で確かめます。
  1. フォームから送り、Gmail で受け取る
    メールアドレスの欄に自分の Gmail のアドレスを入れてフォームを送信し、自動返信を Gmail で受け取ります。
  2. 自動返信メールのソースを見る
    Gmail で「メッセージのソースを表示」を開き、SPF/DKIM/DMARC が「PASS」になっているかを見ます。
    DMARC の行は、ドメインに DMARC を設定している時だけ出ます。
  3. Return-Path のアドレスを見る(mail() の場合)
    Return-Path が自社のドメインのアドレス(info@example.co.jp など)かを見ます。
    サーバーのアドレス(user@sv123.example.net など)なら、-f が効いていません。
  4. 社内向けの通知が届くかを見る
    自社のアドレス(info@example.co.jp など)の受信箱に、通知が届いているかを見ます。
    Gmail には届くのに、自社のアドレスにだけ届かない時は、ホームページのサーバーが、そのメールを中で受け取っている場合があります(社内向けの通知が届かないことがある)。

よくある質問

SMTP で送る時に、注意することはありますか?
SMTP の場合は、メールサーバーにログインして送るので、ログインに使うパスワードを変えた時は、フォームの設定も書き換えます。
フォームのメールの From は、どうすれば良いですか?
From(差出人)は、自社のドメインのアドレス(info@example.co.jp など)にします。
mail() の場合は、存在しないアドレスも From に出来ますが、返信やエラーのメールが届かないので、受け取れるアドレスにします。
SMTP で送る場合は、メールサーバーにログインする時のメールアドレスを、そのまま From にします。

まとめ

フォームを公開する前に、次の3つを確かめておくと安心です。
  • フォームのメールを mail() と SMTP のどちらで送っているか
  • 送ったメールで、SPF/DKIM/DMARC が PASS になっているか
  • 社内向けの通知メールが届いているか
IMG-flowで働くという選択
この記事を書いているIMG-flowは、大阪のWeb制作会社です。
どんな人と、どんな進め方で仕事をしているのかは、採用ページにまとめています。
クリエイター採用を見る
この記事は参考になりましたか?
ご回答ありがとうございました