Мы все видели, как это произошло.
Вы открываете страницу регистрации на своем сайте, надеясь, что посетители оставят вам свои адреса электронной почты, чтобы вы могли оставаться на связи с ними, когда вы получите новый продукт для продажи. Или новый учебник, который может заинтересовать их. Или вы хотите отправить им некоторую «информацию от тщательно проверенных третьих сторон, с которыми мы поддерживаем стратегические отношения». Или, может быть, вы хотите что-то взамен, прежде чем дать им тот ценный документ, который вы потратили два месяца.
Независимо от причины, вы с радостью создадите свою страницу регистрации, создадите таблицу базы данных для отслеживания входящих адресов электронной почты и опубликуете ее в режиме реального времени. И, конечно же, регистрации начинают поступать.
На [email protected]. И [email protected]. И электронная почта[email protected]. Вы поняли — пользователи регистрируются с поддельными адресами электронной почты на доменах, которые даже не существуют. Вы будете не только отправлять почту на несуществующие адреса, но они загромождают вашу базу данных и вызывают проблемы с обслуживанием, потому что их необходимо очистить.
Удостоверьтесь, что они как минимум настоящие
Один из способов решения этой проблемы — убедиться, что адрес электронной почты пользователя действительно соответствует реальному домену электронной почты. Используя 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!
}
Приведенный выше код принимает строку в форме «[email protected]» и проверяет, является ли домен реальным. Во-первых, код вызывает функцию split()
Как только у нас есть домен, код вызывает checkdnsrr
Второй аргумент сообщает checkdnsrr
Поскольку нас интересует только то, может ли данный домен обрабатывать электронную почту, мы используем аргумент «MX», что означает «искать запись Mail Exchange».
Если функция checkdnsrr
TRUE
не обязательно действительное имя пользователя). Если функция возвращает 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
Для вызова функции nslookup
exec
Возвращает результат команды в виде массива строк в параметре $result
Когда функция nslookup
Server: o1-sjc-ns1.o1.com
Address: 66.81.7.158
joemarini.com MX preference = 0, mail exchanger = smtp.joemarini.com
Чтобы определить, существует ли почтовый обработчик для домена, функция просматривает каждую строку выходных данных в поисках строки, начинающейся с заданного имени хоста. Если такая строка найдена, то функция возвращает TRUE
FALSE
Вывод
Хотя нет надежного способа убедиться, что пользователь не дает вам полностью поддельный адрес электронной почты, вы, по крайней мере, можете помочь решить проблему, убедившись, что адреса электронной почты вашего сайта, по крайней мере, соответствуют реальному домену. Используя функцию PHP checkdnsrr