IT系おじさんのチラシの裏
2018年10月~
当サイトの記事にはアフィリエイト広告のリンクが含まれる場合があります

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

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

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

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

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

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

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

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

//送信処理
$to = "[email protected]";
$header = "Content-Type:text/html;charset=UTF-8\r\n";
 
$ret = mail($to, "テストっす", "本文っす", $header);

レンタルサーバーの場合

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

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

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

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

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

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

From:だけ付ける場合

//送信処理
$to = "[email protected]";
$header = "Content-Type:text/html;charset=UTF-8\r\n";
$header .= "From: [email protected]\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"

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

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

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

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

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

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

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

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

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

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

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

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

まとめ

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

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

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

関連記事

Windows環境にphpmyadminをインストールする

最近のレンタルサーバーなら管理ページでポチっとボタンひとつでphpmyadminのインストールくらい完了しますし、手動でやるとしても公式サイトからZIPをダウンロードして解凍してアップロードする程度で

Windows版PHPでSFTP接続するにはphp_ssh2.dllが必要

Web運営のメンテナンス作業(ローカルへのバックアップ作業とか)を自動化する方法について4回にわけて記事にしてきました。 WSHでブラウザを自動操作する PHPでファイルとDB(Postgre

Windows+nginx+PHPの環境でVirtualHostの設定をする

最近またプログラミング熱が出てきたので、趣味用のWebサーバーを構築しているのですが、どうせ作るなら最近爆発的にシェアを伸ばしているというnginxにしよう、と思いVirtualHostの設定もしたの

コメント

新しいコメントを投稿する

[新規投稿]
 
TOP