#php #dns #filter-var
#php #dns #фильтр-var
Вопрос:
Мой клиент жалуется, что с filter_var()
помощью опции и FILTER_VALIDATE_EMAIL
адреса электронной почты, например:
john.doe@example.c
принимается. Итак, теперь мой вопрос: как долго должен быть TLD, по крайней мере? Я имею в виду, что мы знаем .com
, .org
, .us
. Но TLD, как .g
или .a
не существуют, насколько я знаю.
Дальнейшие вопросы:
- Могут ли они вообще существовать?
- Они уже существуют в реальном мире (WWW)?
- Насколько вероятно, что TLD с одним символом однажды будут существовать в WWW?
Комментарии:
1.
foo@bar
также является допустимым адресом! Это может не разрешиться, если я отправлю на него оттуда, где я нахожусь, но вполне может разрешиться внутри какой-нибудь интрасети.
Ответ №1:
Чтобы избежать реализации алгоритма, который может не отражать все допустимые доменные имена, вы можете использовать функцию checkdnsrr для доменного имени.
Что-то вроде:
$parts = explode('@', $email);
$domain = $parts[1];
if (!checkdnsrr($domain)) {
echo 'Invalid domain';
}
Комментарии:
1. Спасибо за ваш ответ. Я создам метод
validateEmail($email, $checkDns = true) {}
, чтобы я мог отключить проверку DNS, если мне когда-нибудь придется это делать.2. Обратите внимание, что это зависит от доступности ваших DNS-преобразователей, т. Е. Это может внезапно временно отклонять электронные письма, если что-то не так с DNS-серверами или если внутренние сети слишком заняты. Тем не менее, это лучшее решение.
Ответ №2:
Я бы сделал что-то еще: проверьте, может ли домен быть разрешен и есть ли у него запись MX. Если нет, домен не может получать электронные письма, и вы можете отклонить этот адрес электронной почты.
Проверьте также getmxrr()
функцию и не забывайте, что umlautdomains, также известные как домены idn или punycode, используют для этого idn_to_ascii()
. Вот простой пример скрипта:
$parts = explode('@', $email);
if(!getmxrr(idn_to_ascii($parts[1]))) {
echo 'Reject email address';
}
Комментарии:
1. Это самое конкретное и самое чистое решение для всего этого. Спасибо за ваш ответ.
Ответ №3:
TLD на данный момент имеет как минимум 2 буквы.
Вы можете увидеть это в списке всех доступных TLD.
Источник: http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains
Решение, предоставленное mishu, является отличным решением, поэтому вы должны его использовать!