web-dev-qa-db-ja.com

PHPでのメール処理をバウンスしますか?

これが私のシナリオです:

2つのメールアカウントがあります。admin@ domain.comと[email protected]です。

[email protected]を使用してすべてのユーザーにメールを送信したいのですが、bounce @ domain.comに「返信」します(ここまで、my PHPスクリプトで処理できます)。

メールを送信できない場合は、bounce @ domain.comに送信されます。エラーメッセージは553(存在しないメール...)などになります。

私の質問は次のとおりです。バウンスエラーコードをチェックする処理スクリプトを介して、それらすべてのバウンスメール(送信できなかったメール)を[email protected]に転送するにはどうすればよいですか?

「処理スクリプト」にはどのプログラミング言語を使用すればよいですか?

「処理スクリプト」はどのようになりますか?サンプルを頂けますか?

言い換えると:

バウンスメールを処理するために私が従うべき手順は何ですか?

29
mcfadder_09

最良のシナリオは、バウンスのタイプを分類できることです:ソフト、ハード...

使用するのは BounceStudio です。それをコンパイルしてphpライブラリを追加する必要があります...難しいことではありません。その製品の無料版と有料版があります

kind of bounce を検出したら、PEAR :: MAIL :: MIMEを使用して、以前にメールに追加したカスタムヘッダーを検索します。

X-user-id: XXXXX
X-campaign-id: YYYYYY 
X-recipient-id: SSSSSSSSS

このようにして、電子メールを送信した実際の受信者を知ることができます。

これがお役に立てば幸いです!だからあなたは私が500ポイントに到達するのを助けることができます:P

29
Gabriel Sosa

[email protected]を作成し、phpを使用して これらの電子メールを読む にして、必要なことを行ってみませんか?

編集後のコメント:phpを使用してボックスを開いてメールを送信し、メールを読む方法を教えるphpスクリプトがあるリンクをチェックしてください。このスクリプトを使用して、エラーメッセージを確認できます。

7
Shoban

メールが実際にメールアドレス(ログイン詳細など)であるアドレスにバウンスするようにします。

X分ごとに実行されるphpスクリプトを作成します(たとえば、cronジョブを使用)。このphpスクリプトは以下を実行する必要があります。 -ボックスからすべてのメールを取得します(例: Zend Mail を使用)-メッセージのエラーを確認します(たとえば、正規表現で検索して)-必要なことをすべて実行します。

誰が戻ってきたのかを具体的に知りたい場合は、ユーザー固有の返送アドレスを使用できます。 (例を参照 このサイト

5
Peter Smit

答えが少し遅いかもしれませんが、いつでも新しいことに挑戦できます。先週私はこのようなタスクを持っていて、バウンスを連想配列に分割するChris FortuneによるBOUNCE HANDLERクラスを使用しました http://www.phpclasses.org/browse/file/11665.html

これは、メーラーを使用してPOP3に接続し、そこからバウンスを取得した後、これを使用して断片に解析し、検索したステータスがある場合は、必要なアクションを実行した後に使用されます。

乾杯。

4
balazscsaba2006

[email protected]用にPOP3メールボックスを設定している場合は、PHP=)で記述されたPOP3クライアントスクリプトを使用して、メッセージを取得し、配信できないメッセージを確認できます。

2
Kev

私は同じ問題、正確な状況を抱えていました。デフォルトでは、メールサーバーは自動返信メッセージ「メール配信に失敗しました:送信者にメッセージを返します」を使用して、返されたすべてのメールを最初に送信したのと同じアカウントに送信しています。

なぜそれが返されたのか本当に知りたくなくて、メールトランザクションが多すぎて、悪いトランザクションを取り除きたいだけだった。 Doestn Exist、Unavailableなどの特定のルールを確認する時間はありません。削除のフラグを立てて続行します。

バウンスメールは、さまざまなサーバーや応答タイプに対応する必要があるため、非常に簡単です。スパム対策ソフトウェアまたはオペレーティングシステムのシナリオごとに、返送された電子メールで異なるエラーコードを送信できます。

この修正済みデバッグバージョンのバウンスされた電子メールの処理-PHPMAILER-BMHとAUTHSMTPの使用をここからKIDMOSESから読んでダウンロードすることをお勧めします http://www.kidmoses.com/blog-article.php ?bid = 4 IMAPを設定して独自のカスタムヘッダーを送信する場合は、それらを[email protected]に送信し、指をクロスしてスクリプトがヘッダーをキャッチするかどうかを確認します返送されたメールに書かれて送信されます。私はそれを試しました、動作します。

しかし、私の問題を解決した私の迅速かつ簡単な修正を実行したい場合は、ここに秘密があります。

1-KIDMOSESサイトまたは私のサイトからより良いバージョンをダウンロードします。KIDMOSESが別の場所に移動したい場合に備えて http://chasqui.market/downloads/KIDMOSES-phpmailer-bmh.Zip

2-返されたメールのテキストを含む変数は$ bodyであり、それ自体が不正な返送されたメールを含んでいます(そのため、多次元配列です)。 (サーバーのメールやその他のDNSメールも含まれていますが、BAD MAIL BOUNCEDを探しています。

3-自分のOWN SERVICEが返送されたメールを返送しているため、その形式とヘッダーを変更して返送メールを返送することはほとんどないため、返送された返送メール配列の順序を選択しても安全です。私の場合、常に同じフォーマットテンプレートでした。 (システムまたはプロバイダーを変更しない限り)

4-その$ bodyを調べて、すべての電子メール文字列変数を検索し、それらを抽出して2次元配列に配置します$ matchesと呼ばれます

5-print_r(array_values($ matches));を使用して配列を出力することにより、配列の位置を選択します。

6-これは、変更する必要があるコードです。class.phpmailer-bmh.phpファイルからの約500行

  // process bounces by rules
  $result = bmhDSNRules($dsn_msg,$dsn_report,$this->debug_dsn_rule);
} elseif ($type == 'BODY') {
  $structure = imap_fetchstructure($this->_mailbox_link,$pos);
  switch ($structure->type) {
    case 0: // Content-type = text
      $body = imap_fetchbody($this->_mailbox_link,$pos,"1");
      $result = bmhBodyRules($body,$structure,$this->debug_body_rule);

      //MY RULE IT WORKS at least on my return mail system..
      $pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i';
      preg_match_all($pattern, $body, $matches);
        //print_r( array_values( $matches ));     //To select array number of bad returned mail desired, usually is 1st array $matches[0][0]          
        echo "<font color = red>".$matches[0][0]."</font><br>";
      break;

したがって、返されたヘッダーを忘れて、不正なメールに集中します。それらをExcelにしたり、MySQLにしたり、やりたいことを処理したりできます。

[〜#〜]重要[〜#〜]サンプルディレクトリのcallback_echo.phpでエコーにコメントを付けます。そうしないと、印刷前にすべてのジャンクが取得されます。

function callbackAction ($msgnum, $bounce_type, $email, $subject,      $xheader, $cheader, $remove, $rule_no=false, $rule_cat=false, $rule_msg='', $totalFetched=0) {
  $displayData = prepData($email, $bounce_type, $remove);
  $bounce_type = $displayData['bounce_type'];
  $emailName   = $displayData['emailName'];
  $emailAddy   = $displayData['emailAddy'];
  $remove      = $displayData['remove'];
  //echo "<br>".$msgnum . ': '  . $rule_no . ' | '  . $rule_cat . ' | '  . $bounce_type . ' | '  . $remove . ' | ' . $email . ' | '  . $subject . ' | ';
  //echo 'Custom Header: '  . $cheader . " | ";
  //echo 'Bounce Message: '  . $rule_msg . " | ";
  return true;
}

私の出力

Connected to: mail.chasqui.market ([email protected])
Total: 271 messages 
Running in disable_delete mode, not deleting messages from mailbox

[email protected]

...

[email protected]

Closing mailbox, and purging messages
Read: 271 messages
0 action taken
271 no action taken
0 messages deleted
0 messages moved
0
Luis H Cabrejo

これは、IMAPを使用してバウンスを処理するための既定のソリューションです。

MailインスタンスのReturn-Pathヘッダーを専用の[email protected]に変更しました

私が実行可能と考えるのに十分簡単な唯一の方法は次のとおりです。POP3を介して専用の受信トレイを確認し、受信したメッセージに基づいて各メールを処理できます。

$inst=pop3_login('mail.xxxxxx.us','110','[email protected]','pass');
$stat=pop3_stat($inst);
//print_r($stat);
if($stat['Unread']>0){
    echo "begin process<br><br>";
    $list=pop3_list($inst);
    //print_r($list);
    foreach($list as $row){
        if(strpos($row['from'],'MAILER-DAEMON')!==FALSE){
            $msg=imap_fetchbody($inst,$row['msgno'],'1');
            if(strpos($msg,'550')!==FALSE){
                echo "handle hard bounce".$msg."<br><br>";
                //WHATEVER HERE TO PROCESS BOUNCE
            }   
        }
        else{
            $msg=imap_fetchbody($inst,$row['msgno'],'1');
            echo "not from my server. could be spam, etc.".$msg."<br><br>";
            //PROBABLY NO ACTION IS NEEDED
        }   
        //AFTER PROCESSING
        //imap_delete ( resource $imap_stream , int $msg_number [, int $options = 0 ] )
        //commented out because I havent implemented yet. see IMAP documentation
    }   
}   
else{
    echo "no unread messages";  
}


//imap_close ( resource $imap_stream [, int $flag = 0 ] )
//commented out because I havent implemented yet. see IMAP documentation.
//flag: If set to CL_EXPUNGE, the function will silently expunge the mailbox before closing, removing all messages marked for deletion. You can achieve the same thing by using imap_expunge()




function pop3_login($Host,$port,$user,$pass,$folder="INBOX",$ssl=false) 
{ 
    $ssl=($ssl==false)?"/novalidate-cert":""; 
    return (imap_open("{"."$Host:$port/pop3$ssl"."}$folder",$user,$pass)); 
} 
function pop3_stat($connection)        
{ 
    $check = imap_mailboxmsginfo($connection); 
    return ((array)$check); 
} 
function pop3_list($connection,$message="") 
{ 
    if ($message) 
    { 
        $range=$message; 
    } else { 
        $MC = imap_check($connection); 
        $range = "1:".$MC->Nmsgs; 
    } 
    $response = imap_fetch_overview($connection,$range); 
    foreach ($response as $msg) $result[$msg->msgno]=(array)$msg; 
        return $result; 
} 
function pop3_retr($connection,$message) 
{ 
    return(imap_fetchheader($connection,$message,FT_PREFETCHTEXT)); 
} 
function pop3_dele($connection,$message) 
{ 
    return(imap_delete($connection,$message)); 
} 
0
Dustin Flick

imap_open を使用して、PHPからメールにアクセスできます。

この機能はPOP3でも機能しますが、すべての機能がここで機能するとは限りません。ただし、2018年にはほとんどのメールクライアントがIMAPをサポートするはずです。

この機能は、POP3およびNNTPサーバーへのストリームを開くためにも使用できますが、一部の機能はIMAPサーバーでのみ使用できます。

これは、メールを反復処理する小さな例です。

  /* connect to server */
  $hostname = "{$your-server:$your-port}INBOX";
  $username = 'my-username';
  $password = '123';

  /* try to connect */
  $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to mailbox: ' . imap_last_error());

  /* grab emails */
  $emails = imap_search($inbox,'ALL');

  /* if emails are returned, cycle through each... */
  if($emails) {
    /* for every email... */
    foreach($emails as $email_number) {

        $message = imap_body($inbox,$email_number,2);
        $head    = imap_headerinfo($inbox, $email_number,2);
        // Here you can handle your emails
        // ...
        //  ...
      }
  }

私の場合、私は常に[email protected]からのメール配信が失敗することを知っています。だから私はそのようなバウンスを識別することができました:

if($head->from[0]->mailbox == 'Mailer-Daemon')
{
  // We have a bounce mail here!
}

あなたが言った:

メールを送信できない場合は、bounce @ domain.comに送信されます。エラーメッセージは553(存在しないメール...)などになります。

したがって、バウンスメールに「メール配信に失敗しました:エラー553」という件名がある場合、次のように件名でそれらを識別できます。

if($head->subject == 'Mail delivery failed: Error 553')
{
  // We have a bounce mail here!
}

失敗したメールアドレスはヘッダーにないため、$message変数からスマートコードを使用して解析する必要があります。

0
Adam

同じ質問の答えを探していました。質問のより多くの部分とより多くのオプションがあります。

返送された電子メールを処理するために、私は PHPクラス を見つけました。純粋にPHPであり、PHPパワードサイトがある場合、コンパイルや追加のソフトウェアのインストールは必要ありません。とても使いやすいです。

CPanel、またはInterWorx/SiteWorxを使用している場合は、受信したメールをスクリプトで処理するようにいくつかのアドレスを構成できます。たとえば、PHPスクリプト、言及されたクラスの助けを借りて処理します。またはもちろん、通常の電子メールアカウントを作成し、POP3またはIMAPを介してメールを取得して、それらを解釈することもできます。 IMAPなどの追加のチャネルを使用する必要があります。もちろん、メールサーバーを構成できない場合、またはその方法がわからない場合は、前者の方が適しています。

幸運を! :)

0
Tamás Barta

これらの種類のメールをフィルタリングするために、Procmailを使用しています。ここですでに述べたソリューションのいくつかを調べた後、バウンスメッセージを検出するための簡単なProcmailレシピを作成しました。必要な精度によっては、これが状況に適用できる場合があります。

詳しくはこちら ブログエントリー をご覧ください。

0
claasz

Php mailコマンド http://php.net/mail

5番目のパラメーターを使用し、それに「-f」を追加します。

したがって、パラメーターとして「-f [email protected]」を使用します

phpListニュースレターマネージャー はこれを使用してバウンスを管理します。

メールボックスにバウンスがいっぱいになったら、POPして処理することができます。それらが到着したときにそれらを処理するのではなく、それらを処理する最も簡単な方法です。

0
michiel

私はPHPこの解決策を探してかなり不運でしたが、私は必要なものだけを実行するこの製品に遭遇しました。

それはネイティブアプリmac/winとして実行されますが、仕事をします。

http://www.maxprog.com/site/software/internet-marketing/email-bounce-handler_sheet_us.php

0
Jazzy

いつでも http://cloudmailin.com のようなものを使用して、バウンスされた電子メールをhttp経由でphpサーバーに転送できますが、電子メールの送信とそのapiを使用した取得専用のサービスの方が良い場合がありますバウンスの詳細。

0
Steve Smith