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

29

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

У меня есть 2 учетных записи электронной почты: [email protected] и [email protected]

Я хочу отправить всем своим пользователям электронное письмо с адресом [email protected], а затем & quot; ответить на & quot; [email protected] (пока здесь мой PHP-скрипт не справится).

Когда электронное письмо не может быть отправлено, оно отправлено на [email protected], сообщение об ошибке может быть 553 (несуществующее электронное письмо ...) и т. Д.

У меня такой вопрос: как я могу направить все эти сообщения об отказе (не отправленные письма) на [email protected] через скрипт обработки, чтобы проверить коды ошибок отказов?

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

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

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

What are the procedures I should follow to handle the bounce email ?

Ваш Ответ

14   ответов
0

точная ситуация. По умолчанию мой почтовый сервер отправляет все мои возвращенные письма на ту же учетную запись, с которой они были отправлены, с автоматическим отправлением сообщений."Mail delivery failed: returning message to sender".

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

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

Я рекомендую вам прочитать и скачать исправленную исправленную версиюHandling Bounced Email - USING PHPMAILER-BMH AND AUTHSMTP от KIDMOSES здесьhttp://www.kidmoses.com/blog-article.php?bid=40 если вы хотите настроить IMAP и отправить свои собственные заголовки, отправьте их на[email protected] а затем скрестите пальцы, чтобы увидеть, улавливает ли скрипт заголовки, которые вы отправили в отскоченном письме. Я попробовал, работает.

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

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

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

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

4 - Мы смотрим на это$body и искать все строковые переменные электронной почты и извлекать их, помещая их вtwo dimensional array называется$matches

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

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_\-\+][email protected][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 их, или обрабатывать все, что вы хотите сделать.

IMPORTANT Comment the echos in callback_echo.php in the samples directory otherwise you get all the junk before printed.

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
С другой стороны, если вы предпочитаете приобрести программное обеспечение, о котором упоминал @Jason, оно тоже работает довольно хорошо, просто проверив и предоставив вам все точные причины, по которым ваша почта отскочила. Спасибо Джейсон:maxprog.com/site/software/internet-marketing/…
0

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

4

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

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

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

0

http://php.net/mail

вы используете пятый параметр и добавляете & quot; -f & quot; к этому.

Итак, вы используете & quot; -f [email protected]" в качестве параметра

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

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

0

AP.

Я изменил заголовок Return-Path моего экземпляра Mail на выделенный [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

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

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

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

2

[email protected]Вы можете использовать клиентский скрипт POP3, написанный на PHP, для извлечения сообщений и проверки недоставленных сообщений.

SwitfMailer можно найтиfailures-by-reference но у него нет поддержки отказов.
Извините, это вне моего выбора .. я действительно не знаю, с чего начать ..
С другой стороны, если вы предпочитаете приобрести программное обеспечение, о котором упоминал @Jason, оно тоже работает довольно хорошо, просто проверив и предоставив вам все точные причины, по которым ваша почта отскочила. Спасибо Джейсон:maxprog.com/site/software/internet-marketing/…
Для чтения отказов с помощью php попробуйте PHPMailer-BMH (Bounce Mail Handler) -phpmailer.worxware.com/index.php?pg=bmh  Это немного устарело, но может помочь вам сделать основные вещи. Для расширенной обработки отказов я также рекомендую BounceStudio.
Swift Mailer может только получить статус отправки SMTP, но не может получить ответ от ответа сервера получателя.
29

мягкий, жесткий ...

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

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

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

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

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

Рад видеть, что вы достигли 500 :)
Кажется, у них больше нет бесплатной версии.
у них есть бесплатная пробная версия:boogietools.com/Products/Linux
7

читать эти письма и делать то, что вы хотите?

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

Я имею в виду, я создаю каталог, храню все электронные письма для [email protected] Затем напишите php-скрипт, периодически проверяйте эту папку и проверяйте код ошибки?
Вот почему мне нужны процедуры, я совершенно новый, чтобы справиться с этим отказов электронной почты. Я даже не знаю, с чего начать, как "предоставить детали электронной почты в php скрипт"? Мне нужна помощь ... помочь ... мне ...
Вы сказали, что не новичок в php. Вы когда-нибудь проверяли ссылку, которую я разместил? Проверьте код php в ссылке и задайте какие-либо конкретные сомнения в этом. Все, что вам нужно, это указать адрес электронной почты, номер порта и т. Д.
нет ... создать новый идентификатор [email protected] Укажите данные электронной почты для php-скрипта и периодически запускайте его, используя cron. PHP может быть использован для открытия поп-счетов 3 (проверьте код выше). Там нет необходимости хранить электронную почту. Ваш скрипт должен автоматически открывать почтовый ящик и обрабатывать новые письма.
5

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

Создайте скрипт php, который запускается каждые x минут (например, с помощью задания cron). Этот скрипт php должен сделать следующее. - Получить всю электронную почту из коробки (используйте, например,Zend Mail) - Check for the error in the message (e.g. by searching it with regular expressions) - Do what ever is necessary.

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

СсылкаZend Mail сломан, вот новая ссылкаframework.zend.com/manual/current/en/modules/…
-1

ет поддержку "отказов" электронные письма. http://swiftmailer.org/

Для чтения отказов с помощью php попробуйте PHPMailer-BMH (Bounce Mail Handler) -phpmailer.worxware.com/index.php?pg=bmh  Это немного устарело, но может помочь вам сделать основные вещи. Для расширенной обработки отказов я также рекомендую BounceStudio.
SwitfMailer можно найтиfailures-by-reference но у него нет поддержки отказов.
Swift Mailer может только получить статус отправки SMTP, но не может получить ответ от ответа сервера получателя.
0

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

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

0

и больше вариантов.

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

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

Удачи! :)

0

imap_open чтобы получить доступ к вашей почте из PHP.

Эта функция также работает для POP3, но не каждая функция может работать здесь. Однако, я думаю, в 2018 году большинство почтовых клиентов должны поддерживать IMAP.

This function can also be used to open streams to POP3 and NNTP servers, but some functions and features are only available on IMAP servers.

Вот небольшой пример, как перебирать ваши электронные письма:

  /* 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!
}

Вы сказали:

When, the email can't be sent, it's sent to [email protected], the error message could be 553 (non existent email ...) etc.

Поэтому, если ваши письма с отказами имеют тему & quot; Ошибка доставки почты: Ошибка 553 & quot; тогда вы можете идентифицировать их по теме:

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

Адрес электронной почты с ошибкой отсутствует в заголовке, поэтому вам необходимо проанализировать его из$message переменная с некоторым умным кодом.

Похожие вопросы