Обработка отскоченной почты в PHP - Какие-либо современные решения?

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

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

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

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

6 ответов

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

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

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

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

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

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

Редактировать: это не так много, просто некоторые ссылки:

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

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

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

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

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

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

Вот как я это сделал однажды. Он может захватывать как минимум более 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';

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

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

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

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

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

эти вещи легко достижимы, но требуют ресурсов.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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