Когда вы долго собираете базу клиентов (легальным способом), а потом пытаетесь отправлять по ней письма, оказывается, что многие адреса не существуют. Для того, чтобы не тратить ресурсы на отправку писем мертвым душам и проводится проверка существования 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".


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