Обработка возвращенных писем в PHP - какие-нибудь современные решения?

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

Я обнаружил, что есть 3 PHP-решения, которые предназначены для обработки возвращенной почты, но, насколько я могу судить, все они устарели и больше не обслуживаются. (PHPList, PHPMailer-BMH, обработчик отказов @ PHPClasses.org)

Кто-нибудь знает актуальный набор правил для обработки возвращенных писем? Мне не обязательно нужна какая-либо логика обработки, даже свежий набор правил был бы удовлетворительным.

Спасибо за любую помощь.


person DrSpock    schedule 06.04.2011    source источник
comment
Если вы установите для return-envelope значение VERPy, вам даже не понадобится сообщение, а только адрес, на который оно было отправлено.   -  person Wrikken    schedule 06.04.2011
comment
@Wrikken У нас есть отказы, отправляемые на их собственный адрес. Однако существуют разные типы отскоков - наиболее важные жесткие и мягкие отскоки.   -  person DrSpock    schedule 07.04.2011
comment
Возможно, это не совсем то, что вы ищете, но я столкнулся с этим вопросом, который может помочь. stackoverflow.com/questions/1011714/   -  person Shattuck    schedule 17.11.2011


Ответы (6)


Обработка отказов нетривиальна, так как вам нужно иметь дело с множеством разных серверов и ответов. Это включает те серверы, которые неправильно настроены и отказывает, потому что ваш адрес электронной почты / хост / IP был внесен в черный список / был оценен как спам. И есть масса отказов из-за автоответов "нет на рабочем месте".

Я знаю простое решение - добавить в сообщение собственные заголовки, которые идентифицируют адрес получателя и конкретную отправку (токен). Когда он отскакивает, отскок можно проверить на основе этого.

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

Здесь есть отличный ответ по SO (но я не нашел его для этого ответа), который подробно описывает эту тему. Если найду, добавлю.

Общий смысл в том, что я не знаю о многих инструментах на основе PHP для обработки отказов, я знаю, что PHPList (компоненты PHP для обработки списков рассылки) имеет что-то в своем репозитории:

Изменить: связанный вопрос с очень информативным ответом:

Изменить: Это немного, просто несколько ссылок:

Мне интересно, почему нет стандарта возврата электронной почты, который позволяет легко идентифицировать отказы и причину отказов - или есть? (как RFC)

Существует RFC3834 - Рекомендации по автоматическим ответам на электронную почту, которые обновляются RFC5436 Механизм ситового уведомления: mailto.

Возврат также частично обсуждается в протоколе простой передачи почты RFC5321, что ясно указывает на причину, по которой MTA должен сообщить, если сообщение не может быть доставлено.

Основная проблема заключается в том, что адрес возврата (отправителя) не может быть проверен в SMTP, поэтому при отправке сообщения возврата возникает проблема, заключающаяся в том, что оно, вероятно, отправляется не тому человеку (Backscatter Spam).

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

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

person hakre    schedule 21.11.2011
comment
Большое спасибо за эти ссылки. В итоге я использовал phpmailer-bmh (измененный), чтобы разрешить настраиваемые заголовки, в которых я передал свои уникальные идентификаторы - person Sir Lojik; 24.11.2011
comment
@SirLojik - не могли бы вы опубликовать эти модификации? Спасибо - person danielb; 03.04.2014

Вот как я однажды это делал. Он может постоянно перехватывать не менее 70% писем о недоставках.

В отправляемых электронных письмах вставьте настраиваемый заголовок (например, «x-email-check-id»), чтобы иметь уникальный идентификатор для каждого отправляемого электронного письма (возможно, создать GUID и сохранить его в базе данных для каждого электронного письма).

На стороне сервера напишите задание cron для периодической загрузки писем с адреса возврата и ищите этот заголовок в ответном сообщении. Таким образом, вы можете сопоставить сообщение о недоставке с отправленным электронным письмом. Таким образом, вы можете убедиться, что это электронное письмо отклонено от вашего отправленного письма и не является спамом.

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

$Email__Full[] = 'databytes limit';
$Email__Full[] = 'exceeded dropfile size';
$Email__Full[] = 'exceeded email quota';
$Email__Full[] = 'exceeded storage';
$Email__Full[] = 'exceeding receiving limits';
$Email__Full[] = 'exceeds the maximum size';
$Email__Full[] = 'folder is full';
$Email__Full[] = 'mail system full';
$Email__Full[] = 'mailbox exceeds allowed size';
$Email__Full[] = 'mailbox full';
$Email__Full[] = 'mailbox has exceeded the limit';
$Email__Full[] = 'mailbox is full';
$Email__Full[] = 'mail box full';
$Email__Full[] = 'out of disk space';
$Email__Full[] = 'out of diskspace';
$Email__Full[] = 'over disk quota';
$Email__Full[] = 'over quota';
$Email__Full[] = 'over the allowed quota';
$Email__Full[] = 'problem with the recipient\'s mailbox';
$Email__Full[] = 'quota exceeded';
$Email__Full[] = 'quota violation';
$Email__Full[] = 'space has been used up';
$Email__Full[] = 'space not enough';
$Email__Full[] = 'status: 5.2.1';
$Email__Full[] = 'status: 5.2.2';
$Email__Full[] = 'status: 5.2.3';
$Email__Full[] = 'status: 5.3.3';

$Email__NotExist[] = '/var/mail/nobody';
$Email__NotExist[] = '550 5.1.1';
$Email__NotExist[] = 'account expired';
$Email__NotExist[] = 'account inactive';
$Email__NotExist[] = 'account suspended';
$Email__NotExist[] = 'address is administratively disabled';
$Email__NotExist[] = 'address is not recognized';
$Email__NotExist[] = 'address is rejected';
$Email__NotExist[] = 'address not recognized';
$Email__NotExist[] = 'address rejected';
$Email__NotExist[] = 'bad destination email address';
$Email__NotExist[] = 'cname lookup failed';
$Email__NotExist[] = 'connection refused';
$Email__NotExist[] = 'couldn\'t find any host';
$Email__NotExist[] = 'could not be found';
$Email__NotExist[] = 'deactivated mailbox';
$Email__NotExist[] = 'delivery time expired';
$Email__NotExist[] = 'destination server not responding';
$Email__NotExist[] = 'disabled or discontinued';
$Email__NotExist[] = 'does not exist';
$Email__NotExist[] = 'does not like recipient';
$Email__NotExist[] = 'doesn\'t have a yahoo.com account';
$Email__NotExist[] = 'doesn\'t have a yahoo.com.sg account';
$Email__NotExist[] = 'domain is for sale';
$Email__NotExist[] = 'find a mail exchanger';
$Email__NotExist[] = 'find any host named';
$Email__NotExist[] = 'following address(es) failed';
$Email__NotExist[] = 'host unknown';
$Email__NotExist[] = 'i couldn\'t find any host by that name';
$Email__NotExist[] = 'illegal user';
$Email__NotExist[] = 'in the queue too long';
$Email__NotExist[] = 'inactive recipient';
$Email__NotExist[] = 'inactive user';
$Email__NotExist[] = 'incorrectly addressed';
$Email__NotExist[] = 'invalid recipient';
$Email__NotExist[] = 'invalid user';
$Email__NotExist[] = 'isn\'t in my control/locals file';
$Email__NotExist[] = 'mailbox not available';
$Email__NotExist[] = 'mailbox not found';
$Email__NotExist[] = 'mailbox unavailable';
$Email__NotExist[] = 'mail is looping';
$Email__NotExist[] = 'message is looping';
$Email__NotExist[] = 'name is not recognized';
$Email__NotExist[] = 'name not found';
$Email__NotExist[] = 'name not recognized';
$Email__NotExist[] = 'no local mailbox';
$Email__NotExist[] = 'no longer accepts mail';
$Email__NotExist[] = 'no longer an employee';
$Email__NotExist[] = 'no longer on server';
$Email__NotExist[] = 'no longer valid';
$Email__NotExist[] = 'no mailbox';
$Email__NotExist[] = 'no route found to domain';
$Email__NotExist[] = 'no such user';
$Email__NotExist[] = 'none of the mail servers for the destination domain has so far responded';
$Email__NotExist[] = 'no valid host';
$Email__NotExist[] = 'no valid recipients';
$Email__NotExist[] = 'not a valid mailbox';
$Email__NotExist[] = 'not listed';
$Email__NotExist[] = 'not listed in domino';
$Email__NotExist[] = 'possible mail loop';
$Email__NotExist[] = 'recipient cannot be verified';
$Email__NotExist[] = 'recipient unknown';
$Email__NotExist[] = 'recipients are invalid';
$Email__NotExist[] = 'recipnotfound';
$Email__NotExist[] = 'relaying denied';
$Email__NotExist[] = 'several matches found in domino';
$Email__NotExist[] = 'status: 5.1.1';
$Email__NotExist[] = 'status: 5.1.3';
$Email__NotExist[] = 'status: 5.1.4';
$Email__NotExist[] = 'status: 5.1.6';
$Email__NotExist[] = 'status: 5.1.7';
$Email__NotExist[] = 'this user doesn\'t have a yahoo';
$Email__NotExist[] = 'too many hops';
$Email__NotExist[] = 'unable to deliver';
$Email__NotExist[] = 'unable to relay';
$Email__NotExist[] = 'unknown address';
$Email__NotExist[] = 'unknown recipient';
$Email__NotExist[] = 'unknown user';
$Email__NotExist[] = 'unrouteable address';
$Email__NotExist[] = 'user doesn\'t have';
$Email__NotExist[] = 'user unknown';
$Email__NotExist[] = 'x-notes; 550 5.1.1';
$Email__NotExist[] = 'x-notes; recipient\'s domino directory';
$Email__NotExist[] = '$B%G%#%l%/%H%j$K$O8+$D$+$j$^$;$s!#'; //* Returned from japanese domino . Somehow means directory is not found.

$Email__Banned[] = '_spam_';
$Email__Banned[] = '550 5.7.1';
$Email__Banned[] = '550 access denied';
$Email__Banned[] = '550 no thanks';
$Email__Banned[] = '550 spam';
$Email__Banned[] = '554 5.7.0';
$Email__Banned[] = '554 5.7.1';
$Email__Banned[] = '554 denied';
$Email__Banned[] = '554 message does not conform to standards';
$Email__Banned[] = '554 message refused';
$Email__Banned[] = '571 message Refused';
$Email__Banned[] = 'activated my anti-spam features';
$Email__Banned[] = 'administrative prohibition';
$Email__Banned[] = 'appears to contain uce/spam';
$Email__Banned[] = 'appears to be spam';
$Email__Banned[] = 'appears to be unsolicited';
$Email__Banned[] = 'banned for spamming';
$Email__Banned[] = 'blackholed by uribl.com';
$Email__Banned[] = 'blacklisted by surbl';
$Email__Banned[] = 'blocked by filter';
$Email__Banned[] = 'blocked by kbas system';
$Email__Banned[] = 'blocked by our content filter';
$Email__Banned[] = 'blocked by spamsssassin';
$Email__Banned[] = 'blocked by the recipient';
$Email__Banned[] = 'blocked by user\'s personal blacklist';
$Email__Banned[] = 'blocked due to spam like qualities';
$Email__Banned[] = 'blocked using spam pattern';
$Email__Banned[] = 'blocked using uceprotect';
$Email__Banned[] = 'body part contains disallowed string';
$Email__Banned[] = 'classified as **spam**';
$Email__Banned[] = 'content blacklist';
$Email__Banned[] = 'content filter rejected the message';
$Email__Banned[] = 'consider the message to be spam';
$Email__Banned[] = 'considered spam';
$Email__Banned[] = 'contains spam';
$Email__Banned[] = 'content filter rejection';
$Email__Banned[] = 'content rejected';
$Email__Banned[] = 'denied by policy';
$Email__Banned[] = 'detected your message as spam';
$Email__Banned[] = 'does not accept UCE';
$Email__Banned[] = 'domain is banned';
$Email__Banned[] = 'email abuse detected';
$Email__Banned[] = 'error 553';
$Email__Banned[] = 'help_spam_16.htm';
$Email__Banned[] = 'high on spam scale';
$Email__Banned[] = 'http://www.google.com/mail/help/bulk_mail.html';
$Email__Banned[] = 'http://www.surbl.org/lists.html';
$Email__Banned[] = 'identified as spam';
$Email__Banned[] = 'identified your message as spam';
$Email__Banned[] = 'listed in multi.surbl.org';
$Email__Banned[] = 'looks like spam';
$Email__Banned[] = 'mail rejected by windows live hotmail for policy reasons';
$Email__Banned[] = 'message bounced by administrator';
$Email__Banned[] = 'message content rejected, ube';
$Email__Banned[] = 'message contains a virus or other harmful content';
$Email__Banned[] = 'message has too high spam probability';
$Email__Banned[] = 'message is blacklisted';
$Email__Banned[] = 'message refused';
$Email__Banned[] = 'no spam here';
$Email__Banned[] = 'not accepted here';
$Email__Banned[] = 'not in the whitelist';
$Email__Banned[] = 'not rfc compliant';
$Email__Banned[] = 'permanently rejected message';
$Email__Banned[] = 'policy violation';
$Email__Banned[] = 'refused mail service';
$Email__Banned[] = 'reject spam mail';
$Email__Banned[] = 'reject the mail';
$Email__Banned[] = 'rejected by filter';
$Email__Banned[] = 'rejected as spam';
$Email__Banned[] = 'rejected by 35 antiSpam system';
$Email__Banned[] = 'rejected by antispam system';
$Email__Banned[] = 'rejected by cloudmark anti-spam';
$Email__Banned[] = 'rejected by our Spam Filter';
$Email__Banned[] = 'rejected by spam filtering';
$Email__Banned[] = 'rejected by surbl';
$Email__Banned[] = 'rejected by the anti-spam system';
$Email__Banned[] = 'rejected due to security policies';
$Email__Banned[] = 'rejected for policy reasons';
$Email__Banned[] = 'rejected for spam';
$Email__Banned[] = 'requires that you verify';
$Email__Banned[] = 'scored as spam';
$Email__Banned[] = 'sender address verification';
$Email__Banned[] = 'sender was rejected';
$Email__Banned[] = 'spam detected by spamassassin';
$Email__Banned[] = 'spam filter pattern';
$Email__Banned[] = 'spam-like characteristics';
$Email__Banned[] = 'spam mail detected';
$Email__Banned[] = 'spam mail refused';
$Email__Banned[] = 'spam message was blocked';
$Email__Banned[] = 'spam rejected';
$Email__Banned[] = 'spam score too high';
$Email__Banned[] = 'status: 5.7.1';
$Email__Banned[] = 'support.proofpoint.com';
$Email__Banned[] = 'suspected spam';
$Email__Banned[] = 'suspicious url in message body';
$Email__Banned[] = 'temporarily deferred';
$Email__Banned[] = 'transaction failed';
$Email__Banned[] = 'unacceptable content';
$Email__Banned[] = 'unacceptable mail content';
$Email__Banned[] = 'unsolicited bulk e-mail';
$Email__Banned[] = 'unsolicited bulk email';
$Email__Banned[] = 'unsolicited email is refused';
$Email__Banned[] = 'validate recipient email';
$Email__Banned[] = 'will be deleted from queue';

$Email__OutOffice[] = 'away for a vacation';
$Email__OutOffice[] = 'away from the office';
$Email__OutOffice[] = 'not in office';
$Email__OutOffice[] = 'on leave';
$Email__OutOffice[] = 'on vacation';
$Email__OutOffice[] = 'out of office';
$Email__OutOffice[] = 'out of the office';
person iWantSimpleLife    schedule 21.11.2011

написать это самому проще, чем вы думаете.

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

Раньше я использовал PHPList и считаю, что это нормально, есть службы получше, чтобы делать то, что вам нужно, но, очевидно, за них приходится платить.

Возврат происходит, когда адрес не существует или почтовый сервер отправляет его обратно. Некоторые почтовые серверы не отвечают (в целях безопасности), поэтому точность не будет наилучшей.

Многие автономные библиотеки / библиотеки предлагают дополнительные функции, определяющие, по каким ссылкам нажимали и кто выяснял, кто читал электронное письмо. и т.д

этого легко достичь, но требуются ресурсы.

Дайте мне знать, если вам еще нужна помощь

person encodes    schedule 19.11.2011

Не найдя простых ответов на этот вопрос, я нашел это отличное решение на github:

https://github.com/cfortune/PHP-Bounce-Handler

person neokio    schedule 22.04.2014

Я большой поклонник библиотеки ezComponents, в которую входит компонент Mail, который может обрабатывать как отправку, так и анализ почты (а также подключение к вашему MTA для ее получения. http://ezcomponents.org//docs/tutorials/Mail#mail-parsers

Читая документы, кажется, что это должно соответствовать вашей задаче.

person preinheimer    schedule 07.04.2011
comment
Спасибо за ответ, но проблема не в разборе электронной почты. PHP уже включает некоторые функции для обработки электронной почты. Мне нужно иметь актуальный набор правил для кодов / типов отказов. - person DrSpock; 08.04.2011
comment
Я также заинтересован в хорошо документированном и актуальном + учебнике по обработке возвращенных писем. Любая помощь, пожалуйста? - person Sir Lojik; 17.11.2011

Будучи ветераном онлайн-сообществ 15 лет, я знаю, что отвечать на вопрос с помощью коммерческого коммерческого решения, к которому отвечает тот, кто отвечает, - это тонкая грань. Итак, я иду, иду по этой линии. Я постараюсь ответить на этот вопрос конкретно. Начнем со стандартного отказа от ответственности ...

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я придерживаюсь принципа службы, описанной ниже.

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

Да, написание собственных библиотек не для большинства (но мы, бедные, извращенные души, которым нечего делать), учитывая, что библиотека, которую вы пишете или включаете, может считаться устаревшей в течение нескольких дней после ваших изменений.

Кто-нибудь знает актуальный набор правил для обработки возвращенных писем? Мне не обязательно нужна какая-либо логика обработки, даже свежий набор правил был бы удовлетворительным.

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

Я большой поклонник Open Source, и нет никаких сомнений в том, что я лично извлек из этого большую пользу за эти годы. Для подавляющего большинства из вас, читающих это, вышеперечисленных вариантов вполне достаточно, поскольку многие из вас способны самостоятельно разработать необходимые решения или модифицировать доступные инструменты в соответствии с вашими потребностями, и у них есть время для этого.

Тем не менее, для тех из вас, кто не хочет создавать свои собственные приложения, отлаживать их, устранять неполадки, постоянно и часто обновлять определения обработки электронной почты, InboxResponse.com предлагает обработка отказов электронной почты в качестве решения SAAS. Это:

  • Обновляется часто и постоянно
  • Идеально подходит для тех из вас, кто просто хочет что-то работающее
  • Может быть интегрирован в любую существующую почтовую систему, которую вы используете в настоящее время, за считанные минуты.
  • Поддерживает отслеживание доставки, обработку отказов, несколько уровней обработки мягких отказов (электронные письма, которые невозможно доставить), неограниченные списки рассылки, статистику, графики и многое другое.

Бесплатная пробная версия доступна по следующему URL-адресу: https://inboxresponse.com/free-trial/

Возможно, это было не совсем то, что вы искали (библиотека с открытым исходным кодом всегда обновлялась), но я не думаю, что в настоящее время доступно именно то, что вы ищете.

Надеюсь, это кому-то поможет!

person siteinteractive    schedule 08.07.2012