Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как отслеживать дохлые мыла?


Автор: maxipub 21.8.2013, 14:36
Добрый день!

Ребята, есть определенный сервис, растет база юзеров. По ясными причинам, часть мыл при реге вводится с ошибками (есть валидация регуляркой, просто опечатываются либо преднамеренно чушь пишут). Другая часть - вполне реальных изначально, просто отмирает со временем. В итоге получаю кучу возвратов вида "550 Message was not accepted -- invalid mailbox." - как с этим можно бороться на автомате? Т.е. письмо отправилось, получили такую ошибку, и понимаем что мыло не существует.

Шлю через PHP, стоит все под Debian, разсылает Exim.

Автор: Sanchezzz 21.8.2013, 14:44
пингануть сервак почтовый по домену который указал пользователь  после @

Автор: maxipub 21.8.2013, 15:54
Sanchezzz, домен mail.ru - ?

Добавлено через 33 секунды
Дохнут же не только приватные домены, но и учетные записи на почтовых сервисах. smile

Автор: Sanchezzz 21.8.2013, 17:58
эээ  smile  как-то я об этом не подумал

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

Парсим лог по крону вроде таблица в mysql sended_list.
Возможно можно создать правило в exim, как это делать правильно я не знаю.

PHP сторона, я как понял отправляет уведомления ? 

Автор: maxipub 22.8.2013, 09:51
Цитата(Sanchezzz @  21.8.2013,  17:58 Найти цитируемый пост)
PHP сторона, я как понял отправляет уведомления ?

Да.

Помечать тех, кто не заходит - это один из вариантов.

Но хотелось бы как-то отлавливать именно эти ошибки, и действовать по факту. Тут действительно, exim может больше чем PHP, но х3, логов он никаких не ведет, 550 - это ответы, которые приходят на email отправителя (указанный в заголовках письма). Вот и думал, может на PHP можно как-то это отлавливать? Т.к. exim тут вероятно даже не видет эти ошибки - они же приходят на почту в виде ответных писем. А почта еще к слову, привязана к Яндекс.Почте. smile 

Автор: Sanchezzz 22.8.2013, 10:09
Пыха только вставляет в очередь на отправку письмо в exim.
Если что то не так логи у exim ведутся, если их нету то значит все нормально или не достаточно выставлены приоритеты для лорнирования.
Может яндекс вставляет эту гадость?


Автор: maxipub 22.8.2013, 11:58
Цитата(Sanchezzz @  22.8.2013,  10:09 Найти цитируемый пост)
Если что то не так логи у exim ведутся, если их нету то значит все нормально или не достаточно выставлены приоритеты для лорнирования.

Ну насколько я понимаю, exim отдает письмо smtp Яндекса, если с ним что-то явно не так, тот сразу возвращает ответ с ошибкой, если все ок (формально), принимает на отправку. После этого exim помечает его как Completed и на этом все. И видимо уже после реальной отправки с smtp Яндекса, получив ответ (по факту) от принимающей стороны, Яндекс генерит этот ответ.

Я все-таки пересмотрел внимательно эти ответы. Они приходят именно от Яндекса. Т.е. на стороне exim его вряд-ли можно отследить, т.к. сам Яндекс видит ошибку и просто информирует меня о ней, вставляя текст ошибки, полученный от реципиента, типа:

Код
<[email protected]>: host imx1.rambler.ru[81.19.66.235] said: 550 5.1.1
    <[email protected]>: Recipient address rejected: user not found (in
    reply to RCPT TO command)

...

Action: failed
Status: 5.1.1

...

Diagnostic-Code: smtp; 550 5.1.1 <[email protected]>: Recipient address
    rejected: user not found


В итоге, лично я вижу три варианта решения задачи, в такой последовательности и начну их долбить:

1. Поинтересоваться у службы поддержки Яндекса, как тут быть. Может быть, у них какой-нибудь колл-бэк есть?

2. Поднять свой небольшой smtp, но не для отправки, а для теста RCPT TO (не очень хорошо, конечно).

3. На PHP сделать проверяльщик почты, который будет брать новые письма с заголовком "Undelivered Mail Returned to Sender", и выдергивать из них мыла реципиентов при наличии сообщения "Action: failed\nStatus: 5.0.0" и "Action: failed\nStatus: 5.1.1".

Пока буду так рыть. Если у кого будут идеи или кто уже решал такую задачу - велкам! smile

Автор: EugenyPavlenko 25.8.2013, 11:36
Весчь, которая возможно вас заинтересует называется "Bounce Mail Handler". То есть обработчик "отскакнувших" мейлов, тех которые конечный почтовый сервер отверг и выслал вам на return-path (bounce mail).

Либа на ПХП:
http://phpmailer.worxware.com/index.php?pg=bmh

Встречал еще и пару других реализаций.

Сложность заключается в том, что ответы маил-серверов могут быть разные, в вашем случае "rejected: user not found", но бывает и "user banned", "user rejected", "пользователей удален", "disk quota exceed" и т.д. Отличается сообщение, формат и даже язык... Например МС маил-сервера как-то вообще по другому ответят))

Обычно различают 2 типа отказа, soft и hard.
[*] Hard это когда юзеру вообще трындец (удален, забанен) — таких можно в своей БД помечать сразу как-то, чтобы не слать туда письма...
[*] А вот soft другой случай — это например закончилось место в почтовом ящике... то есть юзер как бы есть и нормален, но места в его ящике нет...

А в целом технология реализации того что вам нужно извесная мне, основывается на сканировании вашего bounce-mail ПХП-скриптом (по крону раз в сутки напрмиер), и этот скрипт анализирует тело писем и делает правильные выводы относительно имейла на который пытались слать мейл)))

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

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id5214a6d76ccc19fe4d00000a#findElement_E7045_5219c2106ccc19f77f000447_0

Автор: maxipub 28.8.2013, 11:50
EugenyPavlenko, благодарю, весьма интересное решение... Но как по мне, слшком навороченное. smile Если по моей проблеме, немного подумав, все же решил пойти сразу 3-м путем. Все оказалось совсем не сложно, даже примитивно. smile Посмотрим, как это будет работать на практике.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)