Статьи

Проверьте адрес электронной почты пользователя с помощью PHP

Мы все видели, как это произошло.

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

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

На mickey@mouse.com. И donald@duck.com. И электронная почтаthis@hahaha.com. Вы поняли — пользователи регистрируются с поддельными адресами электронной почты на доменах, которые даже не существуют. Вы будете не только отправлять почту на несуществующие адреса, но они загромождают вашу базу данных и вызывают проблемы с обслуживанием, потому что их необходимо очистить.

Удостоверьтесь, что они как минимум настоящие

Один из способов решения этой проблемы — убедиться, что адрес электронной почты пользователя действительно соответствует реальному домену электронной почты. Используя PHP, вы можете проверить записи регистрации домена, чтобы увидеть, является ли домен, который пользователь отправил на ваш сайт, реальным. Для этого мы будем использовать PHP-функцию checkdnsrr

Функция checkdnsrr У него есть этот формат:

 int checkdnsrr(string host [,string type]);

Эта функция PHP проверяет записи DNS для данного хоста, чтобы увидеть, есть ли какие-либо записи указанного типа. Обратите внимание, что параметр type является необязательным, и если вы его не предоставите, тогда типом по умолчанию будет «MX» (что означает «Почтовый обмен»). Если какие-либо записи найдены, функция возвращает TRUE В противном случае он возвращает FALSE

Чтобы использовать эту функцию, вы отправляете ей потенциальный адрес электронной почты и проверяете результат, как показано ниже:

 // take a given email address and split it into the  
username and domain.
list($userName, $mailDomain) = split("@", $email);
if (checkdnsrr($mailDomain, "MX")) {
 // this is a valid email domain!
}
else {
 // this email domain doesn't exist! bad dog! no biscuit!
}

Приведенный выше код принимает строку в форме «username@emaildomain.com» и проверяет, является ли домен реальным. Во-первых, код вызывает функцию split()

Как только у нас есть домен, код вызывает checkdnsrr Второй аргумент сообщает checkdnsrr Поскольку нас интересует только то, может ли данный домен обрабатывать электронную почту, мы используем аргумент «MX», что означает «искать запись Mail Exchange».

Если функция checkdnsrrTRUEне обязательно действительное имя пользователя). Если функция возвращает FALSE

Попался! checkdnsrr

Однако есть небольшая проблема, если вы используете PHP на сервере Windows. Функция checkdnsrr

Чтобы обойти эту проблему, нужно написать собственную версию checkdnsrr Мы назовем нашу версию myCheckDNSRR

 function myCheckDNSRR($hostName, $recType = '') 
{
 if(!empty($hostName)) {
   if( $recType == '' ) $recType = "MX";
   exec("nslookup -type=$recType $hostName", $result);
   // check each line to find the one that starts with the host
   // name. If it exists then the function succeeded.
   foreach ($result as $line) {
     if(eregi("^$hostName",$line)) {
       return true;
     }
   }
   // otherwise there was no mail handler for the domain
   return false;
 }
 return false;
}

Наша версия функции checkdnsrr Для вызова функции nslookupexec Возвращает результат команды в виде массива строк в параметре $result

Когда функция nslookup

 Server: o1-sjc-ns1.o1.com 
Address: 66.81.7.158
joemarini.com MX preference = 0, mail exchanger = smtp.joemarini.com

Чтобы определить, существует ли почтовый обработчик для домена, функция просматривает каждую строку выходных данных в поисках строки, начинающейся с заданного имени хоста. Если такая строка найдена, то функция возвращает TRUEFALSE

Вывод

Хотя нет надежного способа убедиться, что пользователь не дает вам полностью поддельный адрес электронной почты, вы, по крайней мере, можете помочь решить проблему, убедившись, что адреса электронной почты вашего сайта, по крайней мере, соответствуют реальному домену. Используя функцию PHP checkdnsrr

Загрузите код для этой статьи .