PHPでメール送信する際に迷惑メールと判断されないために気をつけること

前回の記事「HTMLメールで一部だけ表示がくずれるときはここが怪しい」に引き続き、PHPでメールを送信するお話です。

PHPスクリプトをデバッグ中に、おかしいなぁここでメールが飛んでくるハズなのになぁ、と悩んでいたら迷惑メールフォルダに溜まりまくっていた、なんて経験はありませんか。

どこをどのように迷惑メールとして判定されているのか、逆にどのへんはOKなのか、最低限知っておくと良いことを自分の備忘録を兼ねて書いておきます。

From:ヘッダを付けない場合

メールの差出人欄(From:ヘッダー)って言い方は悪いですが、オレオレ詐欺みたいなもので、どんなメールアドレスだって書くだけなら自由です。

なので、基本的にメールを送信するドメインとヘッダーのFrom:に書かれているドメインが一致しない場合は迷惑メールと判定されることが多くなります。

ではFrom:ヘッダーを書かなかった場合はどうなるでしょうか。例えば、下記のようにFrom:ヘッダを付けないケース。

//送信処理
$to = "hoge@example.com";
$header = "Content-Type:text/html;charset=UTF-8\r\n";
 
$ret = mail($to, "テストっす", "本文っす", $header);

レンタルサーバーの場合

そのサーバーのデフォルトのドメイン名で送られます。

VALUE SERVERの例で言うなら、e1.valueserver.jpを借りて、独自ドメインexample.comを設定していたケースですね。

その場合、anonymous@e1.valueserver.jpが送信元になります。使っているのはexample.comなのに送信元はvalueserver.jpなので迷惑メールになりそうに見えますが、これは大丈夫です。
(本文がURLだらけとかSPAMっぽくなければ)

From:ヘッダーとReturn-Path:ヘッダーが同じvalueserver.jpになりますし、SPFレコード※1もレンタルサーバーが登録しているから、送信元と送信先のドメインの一致が確認されるためです。

ローカル環境でfake sendmailを使っている場合

fake sendmailの場合はFrom:ヘッダーがないとすぐにエラーを返すので、mail関数の実行時点でエラーになり、メールが送信できません。

From:だけ付ける場合

//送信処理
$to = "hoge@example.com";
$header = "Content-Type:text/html;charset=UTF-8\r\n";
$header .= "From: webmaster@example.com\r\n";
 
$ret = mail($to, "テストっす", "本文っす", $header);

SPFレコードが設定されていない場合

この場合はSPFレコードをチェックするメールサーバーなら迷惑メールに振り分けられるハズです。

SPFレコードはDNSレコードのRecord Type=”TXT”で設定する仕組みで、さっき挙げたvalueserver.jpの例で言うとexample.comのDNSレコードに↓こんなふうに設定するとSPFのチェックが正常に通るハズです。

example.com. IN TXT “v=spf1 a:e1.valueserver.jp”

webmaster@example.comからのメールはe1.valueserver.jpから送信されても大丈夫だよ~と、DNSサーバーが教えてくれるわけです。

SPFレコードが設定されていた場合

さて、じゃあSPFレコードが設定されているから大丈夫!かというと実はそうでもありません。

Gmailで受信するとこんなふうに表示されます。
php_mail_spam

「経由」というのがミソですね。

送信元はexample.comだけど、メールサーバーはvalueserver.jpだよ、大丈夫?という確認です。

Gmailのメニューから[メッセージのソースを表示]をすればわかりますが、SPFの検査にはしっかりPASSしているので、このくらい許してくれても良いような気もするのですが、きっとぼくにはわからない深い理由があるのでしょう。

迷惑メール判定されたくなければReturn-Path:ヘッダを追加する

//送信処理
$to = "hoge@example.com";
$header = "Content-Type:text/html;charset=UTF-8\r\n";
$header .= "From: webmaster@example.com\r\n";
$header .= "Return-Path: webmaster@example.com\r\n";
 
$ret = mail($to, "テストっす", "本文っす", $header);

ヘッダーにReturn-Path:として差出人と同じメールアドレスを設定するだけですが、これで迷惑メール判定はなくなったはずです。もちろん「経由」というのも表示されません。

サーバーによってはReturn-Path:を勝手に書き換えてしまうものもあるので、そのときは追加オプションのほうで -f を指定してあげます。

//送信処理
$to = "hoge@example.com";
$header = "Content-Type:text/html;charset=UTF-8\r\n";
$header .= "From: webmaster@example.com\r\n";
$param = "-f webmaster@example.com";
 
$ret = mail($to, "テストっす", "本文っす", $header, $param);

まとめ

PHPでメール送信する際はおおまかにこのくらい守っていれば迷惑メールの判定は受けづらいと思います。

  • From:ヘッダで差出人メールアドレスを設定する
  • メールアドレスのドメインのSPFレコードが適切に設定されているか確認する
  • Return-Path:ヘッダに差出人のメールアドレスを設定する
  • 本文中に無駄にURLを多く入れたり、リンク先とテキストのURLが違うフィッシングのような書き方をしないようにする

………単に問い合わせフォームの控えをメール送信しただけで迷惑メール判定を受けたり、ネットショップ系のアプリを開発した際に注文控えが届かないんだけどォォー?というクレームを受けたりした経験談です(;´∀`)