LoginSignup
3
1

More than 3 years have passed since last update.

エックスサーバーで運用するLaravelからメール送信の後、バウンスメールを確認する

Last updated at Posted at 2019-10-30

PHPでバウンスチェックなんて出来る訳ない??

困るんです。受信ボックスで1件1件確認して、不着のメールを確認して、除外するなんてやってられない。

PHPであれ、Laravelであれ、メール送信した後に、リターンメールでエラーでメールが戻ってきたら、確認する方法はありますか??

→無い!

そんな事が沢山のQ&Aで書かれてますが、エックスサーバーに限っては、メールのディレクトリを知っていればできるでしょう。

Laravelをエックスサーバーで使っている方、いるんじゃないですしょうか。

エックスサーバーのメールはどうなっている?

/home/あなたのエックスサーバーID/ドメイン
フォルダをFTPなりで見てみてください。
/mailというフォルダあります。

サーバパネルで、メールアドレスを作成すると、mailフォルダの中に作成したメールアドレスのフォルダが構成されます。
/mail/ドメイン名/メールアドレス/

何かそのアドレスにメールを送ってみてください。
/mail/ドメイン名/メールアドレス/cur にメールのファイルが入ります。
中身はテキストデータです。

どうやって、リターンメールをハックする?

こうです。
ユーザーテーブルに、以下があるとします。
id | email | name | password | error

そして、チェックする機能を作っておき、使う時に呼び出せば良いです。
このコードの場合は、リターンメールを見つけたら、errorフラグをerrorカラムにいれていきます。
errorコードは、db内を初期化してから、入れています。

コードの流れは、指定のメールのディレクトリにあるメールから、エラーメールを見つけて、アドレスを探し、dbに有るメールアドレスと一致したら、エラーフラグを入れるというものです。バウンスメールを受信するアドレスを専用に作っておけば、処理は重くならないでしょう。

public function checkErrorMail(){
    //メール確認
    $Users = User::all();
    if(count($Users)>0){
        foreach ($Users as $User){
            $User->error = '';
            $User->save();
        }
    }
    $mailPath = '/home/xxxx/ドメイン名/mail/ドメイン名/example@yourdomain.jp/cur/*';
    foreach(glob($mailPath) as $filePath){
        if(is_file($filePath)){
            $Undelivered = false;
            $fp = fopen($filePath, "r");
            if($fp){
                while (!feof($fp)){
                    $string = fgets($fp);
                    if(strpos($string,'Undelivered') !== false){
                        //'Undelivered'が含まれている場合
                        $Undelivered = true;
                    }
                    if($Undelivered){
                        if(strpos($string,'Original-Recipient') !== false){
                            //'Original-Recipient'が含まれている場合、メールアドレスを取得
                            if(preg_match_all("/(\w+[-+\w.]+@[-\w.]+\.\w{2,5})/",$string,$addr)){
                                $addr=array_unique($addr[0],SORT_STRING);
                                $Users = User::where('email', $addr[0])->get();
                                if(count($Users)>0){
                                    foreach ($Users as $User){
                                        $User->error = 'Error';
                                        $User->save();
                                    }
                                }
                            }
                        }
                    }
                }
            }
            /* ファイルポインタをクローズ */
            fclose($fp);
        }
    }
    return back();
}

こんな感じで、あかんメールアドレスを探し当てて、処理していけば良いかと思います。
メールボックスが大量になる場合は、ファイル名を管理して、処理する対象を限定するなど、
工夫していけば良いですよ。

おわり

エックスサーバーでバウンスメールを処理したいです。できませんか?
→これなら、できますよね!

あくまで、参考の実装方法ですので、サーバに負荷をかけすぎて、迷惑がかからないように、用途に応じて、設計をしっかり考えて、ちゃんと実装しましょうね。
それでは、ゴキゲンヨー。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1