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();
}
こんな感じで、あかんメールアドレスを探し当てて、処理していけば良いかと思います。
メールボックスが大量になる場合は、ファイル名を管理して、処理する対象を限定するなど、
工夫していけば良いですよ。
#おわり
エックスサーバーでバウンスメールを処理したいです。できませんか?
→これなら、できますよね!
あくまで、参考の実装方法ですので、サーバに負荷をかけすぎて、迷惑がかからないように、用途に応じて、設計をしっかり考えて、ちゃんと実装しましょうね。
それでは、ゴキゲンヨー。