Отказаться от обработки электронной почты с помощью PHP? - PullRequest
29 голосов
/ 18 июня 2009

Вот мой сценарий:

У меня есть 2 учетные записи электронной почты: admin@domain.com и bounce@domain.com.

Я хочу отправить всем своим пользователям электронное письмо с адресом admin@domain.com, а затем "ответить" на bounce@domain.com (пока мой сценарий PHP не сможет это обработать).

Когда письмо не может быть отправлено, оно отправляется на bounce@domain.com, сообщение об ошибке может быть 553 (несуществующее письмо ...) и т. Д.

У меня такой вопрос: как я могу направить все эти сообщения о пересылке (сообщения о невозможности отправки) на bounce@domain.com через скрипт обработки, чтобы проверить коды ошибок отказов?

Какой язык программирования я должен использовать для «сценария обработки»?

Как будет выглядеть "сценарий обработки"? Можете ли вы дать образец?

другими словами:

Каким процедурам я должен следовать для обработки отказов электронной почты?

Ответы [ 14 ]

29 голосов
/ 18 июня 2009

Лучший сценарий сможет классифицировать тип отказов: мягкий, жесткий ...

мы используем BounceStudio . Вам нужно скомпилировать его и добавить библиотеки php ... совсем не сложно. У вас есть бесплатная и платная версия этого продукта

как только мы обнаружим отскок , мы используем PEAR :: MAIL :: MIME для поиска пользовательских заголовков, которые мы добавили ранее в электронное письмо, скажем:

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

таким образом мы можем узнать реального получателя, которому мы отправили электронное письмо.

надеюсь, это поможет вам! так что вы можете помочь мне добраться до 500 очков: P

7 голосов
/ 18 июня 2009

Почему бы не создать bounce@domain.com и использовать php для чтения этих писем и делать то, что вы хотите?

Редактировать После вашего комментария: Пожалуйста, проверьте мою ссылку, которая имеет php-скрипт, который научит вас открывать и отправлять по электронной почте ящик с помощью php и читать электронные письма. Вы можете использовать этот скрипт для проверки сообщений об ошибках.

5 голосов
/ 18 июня 2009

Пусть письма переадресовываются на адрес, который действительно является адресом электронной почты (с данными для входа и т. Д.).

Создайте php-скрипт, который запускается каждые x минут (например, с заданием cron) Этот скрипт php должен сделать следующее. - Получить всю электронную почту из коробки (используйте, например, Zend Mail ) - Проверьте наличие ошибки в сообщении (например, с помощью поиска по регулярным выражениям). - Делай, что нужно.

Если вы хотите точно знать, кто отскочил назад, вы можете использовать определенные отказов адреса. (См. Например этот сайт )

4 голосов
/ 16 ноября 2010

Возможно, уже немного поздно для ответа, но вы всегда можете попробовать что-то новое. На прошлой неделе у меня было такое задание, и я использовал класс BOUNCE HANDLER Криса Фортуна, который делит отскок в ассоциативные массивы - http://www.phpclasses.org/browse/file/11665.html

Это будет использоваться после того, как вы подключитесь к POP3 с каким-либо почтовым средством, чтобы получить отскоки от него, затем разберете его на части с этим, и, если у вас есть статус, который вы искали, выполните необходимые действия.

Приветствие.

2 голосов
/ 18 июня 2009

Если у вас настроен почтовый ящик POP3 для bounce@domain.com, вы можете использовать клиентский скрипт POP3, написанный на PHP, для извлечения сообщений и проверки недоставленных сообщений.

0 голосов
/ 17 сентября 2018

Вы можете использовать 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
        // ...
        //  ...
      }
  }

В моем случае я знаю, что я всегда получаю свою доставку почты с Mailer-Daemon@myserver.com. Так что я мог бы определить такие отскоки:

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 голосов
/ 24 ноября 2015

У меня была такая же проблема, точная ситуация. По умолчанию мой почтовый сервер отправляет все мои возвращенные письма на ту же учетную запись, с которой он был первоначально отправлен, с автоматическим сообщением msg «Ошибка доставки почты: возвращение сообщения отправителю» .

Я действительно не хочу знать, почему он был возвращен, так много почтовых транзакций, что я просто хочу удалить плохие. У вас нет времени, чтобы проверить определенные правила, такие как Doestn Exist, Unavailable и т. Д., Просто хотите пометить удаление и продолжить.

Отсканированные письма настолько тривиальны, что вам нужно иметь дело со множеством разных серверов и типов ответов. Каждое антиспамовое программное обеспечение или сценарий операционной системы может отправлять свой код ошибки в ответном письме.

Я рекомендую вам прочитать и скачать эту исправленную отладочную версию Обработка отклоненной электронной почты - ИСПОЛЬЗОВАНИЕ PHPMAILER-BMH И AUTHSMTP из KIDMOSES здесь http://www.kidmoses.com/blog-article.php?bid=40, если вы хотите настроить IMAP и отправить свое собственные пользовательские заголовки, отправьте их на свой bounce@domain.com и затем скрестите пальцы, чтобы увидеть, будет ли скрипт перехватывать отправленные вами заголовки, написанные в отскоченном письме. Я попробовал, работает.

Но если вы хотите следовать моему быстрому и простому решению, которое решило мою проблему, вот секрет.

1 - Загрузите лучшую версию с сайта KIDMOSES или с моего сайта, на случай, если KIDMOSES захотят переехать куда-нибудь еще http://chasqui.market/downloads/KIDMOSES-phpmailer-bmh.zip

2 - Переменная, содержащая текст вашего возвращенного письма, равна $ body и сама содержит неверно возвращенное электронное письмо (ТАК ЕГО МНОГОМЕРНАЯ Массив). (Также содержит почту вашего сервера и прочую почту DNS, но мы ищем ПЛОХУЮ ПОЧТУ.

3 - Поскольку ваша СОБСТВЕННАЯ СЛУЖБА отправляет вам обратно отклоненную электронную почту, маловероятно, что она изменит свой формат и собственные заголовки, отправив обратно отклоненные электронные письма, поэтому вы можете выбрать порядок возврата возвращенного массива отклоненной электронной почты. В моем случае всегда был одинаковый формат шаблона. (Если вы не меняете системы или провайдеров)

4 - Мы смотрим в это $ body , ищем все строковые переменные электронной почты и извлекаем их, помещая их в двумерный массив , называемый $ match

5 - Мы выбираем позицию массива, печатая массив, используя print_r (array_values ​​($ match));

6 - это код, который вам нужно изменить. Вокруг строки 500 из class.phpmailer-bmh.php file

  // 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;

Итак, мы забываем о возвращенных заголовках и концентрируемся на плохих письмах. Вы можете превзойти их, вы можете 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 (bounce@chasqui.market)
Total: 271 messages 
Running in disable_delete mode, not deleting messages from mailbox

kty2001us@starmedia.com

...

entv@nuevoface.com

Closing mailbox, and purging messages
Read: 271 messages
0 action taken
271 no action taken
0 messages deleted
0 messages moved
0 голосов
/ 16 декабря 2013

Мы используем Procmail для фильтрации подобных писем. После изучения некоторых решений, уже упомянутых здесь, мы получили простой рецепт Procmail для обнаружения отказов. В зависимости от необходимой точности это может быть применимо к вашей ситуации.

Подробности смотрите в этой записи блога .

0 голосов
/ 31 октября 2012

Вот стандартное решение для обработки отказов с использованием IMAP.

Я изменил заголовок Return-Path моего экземпляра Mail на выделенный bounce@xxxxxx.us

Единственный способ, который мне достаточно легко считать жизнеспособным, заключается в следующем: он проверяет через POP3 выделенный почтовый ящик и может обрабатывать каждое письмо на основе полученного сообщения.

$inst=pop3_login('mail.xxxxxx.us','110','bounce@xxxxxx.us','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 голосов
/ 08 февраля 2012

В команде php mail http://php.net/mail

вы используете пятый параметр и добавляете к нему «-f».

Итак, вы используете «-f mybouncebox@mydomain.com» в качестве параметра

менеджер рассылки phpList использует это для управления отказами.

Как только отскок заполняется в почтовом ящике, вы можете POP их и обработать. Это самый простой способ справиться с ними, а не обращаться с ними по прибытии.

...