Не редко при разработке различных web-приложений разработчикам приходится реализовывать функции по проверке правильности введённого пользователем адреса электронной почты. Как правило, такие проверки ограничиваются простой проверкой на соответствие регулярным выражениям, а то и просто на наличие в строке символа ‘@’. Я же предлагаю использовать более объективный вариант.
- Проверка на правильность написания адреса
- Проверка домена на наличие MX-записей
- Общение с почтовым сервером, проверка существования почтового ящика
Проверка на правильность написания адреса
Итак, для начала нам необходимо проверить, представляет ли собой строка правильно сформированный адрес электронной почты. Для подобной проверки уже существует множество вариантов регулярных выражений, некоторые из них довольно длинные, я же пользуюсь следующим кодом для проверки:
$name = '[^@\s]+';
$sub_domain = '[-a-z0-9]+\.';
// country codes
$cc = '[a-z]{2}';
// top level domains
$tlds = "$cc|com|net|edu|org|gov|mil|int|biz|pro|info|arpa|aero|coop|name|museum";
$email_pattern = "/^$name@($sub_domain)+($tlds)$/ix";
preg_match($email_pattern, $email);
Проверка домена на наличие MX-записей
Следующим шагом мы пытаемся проверить, есть ли у домена MX-записи, в этих записях содержатся назания серверов, отвечающих за обмен почтой:
if(checkdnsrr($host, "MX")) {
if (!getmxrr($host, $mxhost, $mxweight)) {
echo "Can't found mail servers records!";
}
}
Общение с почтовым сервером, проверка существования почтового ящика
После того, как записи найдены, мы обращаемся к почтовым серверам с запросом, существует ли на них, интересующий нас почтовый ящик:
$fp = fsockopen($host, 25);
fputs($fp, "HELO {$_SERVER['SERVER_NAME']}\r\n");
fgets($fp, 1024);
fputs($fp, "MAIL FROM: <httpd@{$_SERVER['SERVER_NAME']}>\r\n");
fgets($fp, 1024);
fputs($fp, "RCPT TO: <$email>\r\n");
$line = fgets($fp, 1024);
fputs($fp, "QUIT\r\n");
fclose($fp);
Анализируя ответ от сервера мы можем узнать, существует ящик, или нет:
if (substr($line, 0, 3) != "250") {
// не существует
} else {
// существует
}
Комментарии