PHPのmb_send_mailでメールが届かない原因と特定のメールアドレスだけ届かない原因

 

PHPでお問合せフォームなどの運用をしていたところ、突然「フォームからメールが受信できなくなった!」なんてことはよくある話。原因は問題の数だけあると言っていい程、特定には根気が必要です。何故か突然動き始めた…なんてこともあります。

今回はよくあるPHPのmb_send_mailで起きる、何故かメールが届かない原因についてまとめてみました。

 

mb_send_mailの書き方を間違えている

そもそもmb_send_mailの書き方を間違えていればメールが届かないのは当たり前なので見直します。基本的にエラーが表示されるので気が付きますが、下記に載せているケースのようにエラーが表示されない、気がつかないなどのケースもあるので全力で自分を疑いましょう

mb_send_mail ( $to ,$subject ,$message , $headers, $pfrom );

基本的なところなので迷うことは少ないと思いますが簡単な説明を下記に載せておきます。$pfromは、Return-Pathというものですが別途解説します。

  • $to:送信先のアドレス
  • $subject:件名
  • $message:本文
  • $headers:ヘッダー(From:(testname)<test@exsample.com>)
  • $pfrom:Return-Path

設定方法の詳しい解説は色々なところに載っているので、そちらをご参照下さい!

ヘッダーにReturn-Pathがない

特定のメールアドレスにだけメールが届かない問題で一番最初に目にするのがReturn-Pathです。このReturn-Pathは、メールが届けられなかった場合の返信先のことを指します。一般的には送信元のアドレスを載せています。

この項目が無くても大概の場合は送信&受信できるのですが、一部受信を拒否する送り先があったりするので、もし設定してないなら試してみると良いかもしれません。

書き方は簡単で-fをつけて送信元のアドレスを追記してあげればOK。これをmb_send_mailの第5引数に載せるだけです。

$from = ”送信元のメールアドレス”
$pfrom   = "-f $from";

スパム判定をされている

これが一番厄介なんです。
mb_send_mailで問題が発生すると大概エラーが出力されて明確に問題があることに気が付きます。ですが、スパム判定をされているとmb_send_mailでは正常に送付されているけれど、受け取り手が拒否している状態になります

この場合、Return-Pathにエラーメールが送付されてきますが、ここで問題になるのが、WEBサーバーとは別にメールサーバーを持っている場合です。

自分のメールサーバーとはいえ、外部のメールサーバーにWEBサーバーからメールを送っていると、誤ってスパム判定されてしまう可能性があります。そうするとメールが届かない、拒否された状態になってしまいます。
「でも安心だよね!Return-Pathがあるじゃないか!」と希望を持ちますが、Return-Pathには自分のメールが記載されているのでエラーメールも拒否されているのです。

はい!詰んだ!

(Return-Pathを別のメールアドレスに書き換えてデバックするのもありですね)

The following addresses had permanent fatal errorsというエラーメール

運良くエラーメールを確認できた私のような恵まれた方は「The following addresses had permanent fatal errors」のエラーを目にしたと思います。さらに「reason: 550 5.7.606 Access denied, banned sending IP [●●.●●●.●●●.●●●.●●●].」と続いていると思います。

簡単に言えば「このIPは拒否されてるよ」です。

この問題は、WEBサーバーとOffice365などの外部メールサーバーを使っている場合に見受けられる問題で完璧に詰みます。運良くこの記事を読まれた方はスパム判定がされていないかを確認してみましょう。
特定のアドレスにメールが届かず、その他のメールアドレスには正常にメールが届いている」場合には特に注意して下さい。あなたはスパム判定されている!

もしoffice365を使用しているなら「リストから除外のポータルを使って、Office 365 の受信拒否リストから自分自身を削除する」を読んで受信拒否リストからIPアドレスを削除しましょう。

 

まとめ

テスト環境だと正常に受信するのに本番環境やクライアント側だけ受信できないケースは多いものです。大概は受信元に原因があるものですが、万が一システムに問題があったら肝が冷えます。一生懸命システムをチェックして、作り直して、テスト環境でバッチリ!でも、本番環境のクライアント側ではエラー。
そんなときは、本番環境を詳しく見直してWEBサーバー意外の問題に目を向けることも大切です。

エラーの解決は一瞬の閃きによることが多いので色々な可能性を考えてみると案外サッと解決したりします。私は1週間以上ハマりましたけどね。

投稿日: 2018/06/13
最終更新日: 2020/06/05
 
筆者のご紹介
角政典@moreiic
真性のお家大好きフリーランスです。プログラムよりご飯の方が断然好き!博多出身のデブデザイナー。インドアだけど遊んでくれる人募集中!
よく検索されてる記事