Отказаться от обработки электронной почты с помощью PHP?

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

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

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

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

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

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

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

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

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

14 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вы можете использовать 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 переменная с некоторым умным кодом.

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

Я действительно не хочу знать, почему он был возвращен, так много почтовых транзакций, что я просто хочу удалить плохие. У вас нет времени, чтобы проверить определенные правила, такие как 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

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

Вот консервированное решение для обработки отказов с использованием 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)); 
} 

Вы всегда можете использовать что-то вроде http://cloudmailin.com/ для пересылки переадресованных писем на ваш php-сервер через http, но вам может быть лучше, если вы воспользуетесь сервисом, предназначенным для отправки писем и использования их API для получения сведений о сбое.

Я искал ответ на тот же вопрос. Есть больше частей вопроса, и больше вариантов.

Для обработки отклоненной электронной почты я обнаружил класс PHP, написанный исключительно на PHP, не требующий компиляции или установки дополнительного программного обеспечения, если у вас есть сайт с поддержкой PHP. Он очень прост в использовании.

Если вы используете cPanel или InterWorx/SiteWorx, вы можете настроить некоторые адреса для обработки полученных сообщений электронной почты с помощью сценария, например сценария PHP, чтобы вы могли написать свою собственную обработку с помощью упомянутого класса. Или, конечно же, вы можете создавать обычные учетные записи электронной почты и получать почту через POP3 или IMAP, а затем интерпретировать их. Я думаю, что первый лучше, потому что он прямой, вам не нужно использовать дополнительные каналы, такие как IMAP. Конечно, если вы не можете настроить свой почтовый сервер или не знаете, как это сделать, тогда первый вариант лучше для вас.

Удачи!:)

Мне очень не повезло, я искал для этого PHP-решение, но наткнулся на этот продукт, который делает именно то, что мне нужно.

он работает как родное приложение mac / win, но выполняет свою работу.

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

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

Для деталей, проверьте эту запись в блоге.

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

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

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

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

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

Вы должны посмотреть на SwiftMailer. Он полностью написан на PHP и имеет поддержку отказов электронной почты. http://swiftmailer.org/

Другие вопросы по тегам