Парсинг писем о недоставленной почте. Вынуть email и коды ошибки?

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

Большинство серверов в заголовок письма вставляет поле X-Failed-Recipients: ххххх@yandex.ru, но php функциями imap_headerinfo и ей подобными получить это поле не получается.
Тело письма тоже имеет разный формат, поэтому вынуть EMail и код ошибки не всегда получается.

Может кто решал подобное на PHP? Все найденные решения либо на Perl, либо модули почтовиков на С.

PS Чаще всего возвращается письмо формата
This message was created automatically by mail delivery software.

A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:

  *****@balrt.ru
    SMTP error from remote mail server after RCPT TO:<******@balrt.ru>:
    host ns7.balrt.ru [88.147.158.86]: 550 5.1.1 User unknown

Но текст отличается и не получается написать регулярное выражение, чтобы вынуть нужную информацию.
  • Вопрос задан
  • 1414 просмотров
Решения вопроса 2
По тексту письма вы не всегда поймете с каким пользователем проблемы и универсального формата нет. Вместо этого шлите каждому пользователю письмо с уникальным обратным адресом в SMTP конверте типа iduser-idmailing@mailing.youdomain, обрабатывайте все письма пришедшие на *@mailing.youdomain и по адресу на который они пришли идентифицируйте проблемный ящик. Если за какое-то время пришло больше определенного количества отлупов - помечайте как неактивный. Автоответы от отлупов можно отличить по заголовку Auto-Submitted: auto-replied.
Ответ написан
Комментировать
zoonman
@zoonman
⋆⋆⋆⋆⋆
Берете исходный текст письма с ошибкой и разбираете его заголовки вручную.
Просто идете построчно и ищете строку X-Failed-Recipients:. preg_split & stripos вам помогут.
Начните разбор с самых часто встречающихся случаев, а потом доведёте остальные до ума.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
NikitaTratorov
@NikitaTratorov
CTO
Вам поможет применение https://github.com/php-mime-mail-parser/php-mime-m...
и поиск машиночитаемых заголовков.
В массиве частей (multipart message) 0й элемент - это общие заголовки, 1й - это человекочитаемый текст, который Вы привели в тексте, а 2й - будет машиночитаемый массив, который не надо парсить регекспами.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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