Когда вы долго собираете базу клиентов (легальным способом), а потом пытаетесь отправлять по ней письма, оказывается, что многие адреса не существуют. Для того, чтобы не тратить ресурсы на отправку писем мертвым душам и проводится проверка существования email.
Как осуществляется проверка существования email?
Достаточно просто, есть 2 этапа:
Этап 1: валидация email на наличие ошибок
На этом этапе мы проверяем все имейлы на наличие ошибки при помощи regex. Но об этом в отдельной статье, потому, что это все знают и давно умеют.
Этап 2: диалог с сервером получателя, для проверки есть такой пользователь или нет.
Приступим сразу ко второму этапу. Что нужно сделать для проверка существования email?
1) определить к какому домену привязана почта
2) определить MX сервера почты
3) соединится с MX сервером
4) попытаться отправить письмо по указанному адресу (если пользователя нет, сервер ответит с ошикой, если есть — скажет, что готов отправлять).
Первый пункт – самый простой, выделяем домен почты, при помощи регулярного выражения:
$re='/.*@(.*)/'; preg_match($re, $email, $match); $domain=$match[1];
Итак, домен для почты мы нашли. Дальше нужно определить MX сервер для этого почтового адреса/домена.
Определить MX сервер домена можно при помощи встроенной в PHP функции dns_get_record. Ей и воспользуемся:
$mx_records=dns_get_record($domain, DNS_MX);
В результате мы получим массив с ассоциативными массивами, каждый из которых — MX запись домена (их может быть несколько). Выберем любую, и приступим к следующему пункту.
Теперь при помощи socket подключится к MX серверу и провести с ним диалог.
$port = 25; //Порт работы сервера if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { //AF_INET - семейство протоколов //SOCK_STREAM - тип сокета //SOL_TCP - протокол echo "\nSocket creating error\n"; } $result = socket_connect($socket, $domain, $port); if ($result === false) { echo "\nError connecting to socket\n"; } else { echo "\nSocket connected\n"; }
Итак, к серверу подключились, и он ждет от нас информации. Для этого проведем диалог с сервером.
В идеале диалог с сервером должно происходить так:
> HELO domain.com < 250 OK > MAIL FROM:< 250 OK > RCPT TO: < Ответ с резульатом проверки
И вот на этом месте как раз и происходит самое интересное для нашей задачи "проверка существования email". Может быть несколько вариантов ответа сервера, но чаще всего выдаёт 3:
250 или 251: почтовый адрес существует и сервер готов отправлять на него письмо
451 или 450: сервер занят или не хочет отвечать на ваш запрос (чаще всего это значит, что IP адрес, с которого вы обращаетесь к серверу скомпроментирован)
5хх: любой ответ из 500-х означает, что такого пользователя нет
Именно этого мы и ждем: если получили 25Х — почта существует, 5ХХ — почты не существует, 45Х — ещё под вопросом, нужно попробовать через несколько минут.
Собственно, отправка сообщения сервису для проведения диалога делается через функцию:
$msg="HELO domain.com"; socket_write($socket, $msg, strlen($msg));
Ну а получение, через функцию:
$out = socket_read($socket, 1024); echo $out;
То есть вам для того, чтобы провелась проверка существования email нужно в цикле провести диалог с сервером для каждого из почтовых адресов.
Ожидайте в ближайшее время сервис "проверка существования email".
Не смотря на все эти интересные штуки с электронной почтой выше, важно не забывать о жизни вне интернета. Рекомендуют покупать Новостройки Фрунзенского района в Санкт-Петербурге. Новостройки — это качественные и долговечные строения, которые в некоторых случаях более выгодны, чем вторичка. Купив недвижимость-новострой вы получаете полную свободу выбора в материалах отделки, планировки, да и вообще в новом жить приятнее.