Есть ли php библиотека для проверки адреса электронной почты?

Мне нужно подтвердить адрес электронной почты моих пользователей. К сожалению, сделать валидатор, соответствующий стандартам, сложно

Вот пример выражения регулярного выражения, которое пытается соответствовать стандарту

Есть ли какая-либо библиотека PHP (желательно с открытым исходным кодом), которая проверяет адрес электронной почты?

7 ответов

Решение

Я нашел библиотеку в коде Google: http://code.google.com/p/php-email-address-validation/

Есть ли другие?

Вы смотрели на PHP filter_ функции? Они не идеальны, но, по моему опыту, они делают довольно приличную работу.

Пример использования (возвращает логическое значение):

filter_var($someEmail, FILTER_VALIDATE_EMAIL);

AFAIK, единственный хороший способ проверить электронную почту - это отправить электронное письмо и посмотреть, вернется ли пользователь на сайт, используя ссылку в этом электронном письме. Это то, что делают многие сайты.

Как вы указываете со ссылкой на хорошо известного мамонта регулярных выражений, проверка всех форм электронной почты трудно, почти невозможно. Это так легко сделать неправильно, даже для электронных писем тривиального стиля (я обнаружил, что слишком много сайтов отклоняют заглавные буквы в адресах электронной почты! И большинство старых регулярных выражений отклоняют TLD более чем из 4 писем!).

AFAIK, "Jean-Luc B. O'Grady" @ example.com и e=mc^2@[82.128.45.117] являются действительными адресами... Пока я сделал это @Absurd-Domain-Name. информация может быть недействительной.

Так или иначе, я бы просто проверил, что у нас есть что-то, уникальный @, что-то еще, и пошел бы с этим: он перехватил бы большинство ошибок пользователя (таких как пустое поле или имя пользователя вместо адреса электронной почты).
Если пользователь хочет указать фальшивый адрес, он просто даст что-то случайное, выглядящее корректно (see@on.tv или bill.gates@microsoft.com). И никакой валидатор не будет ловить опечатки (jhon.b@example.com вместо john.b@example.com).

Если кто-то действительно хочет проверить электронную почту по полному RFC, я бы посоветовал использовать регулярные выражения для разделения @, а затем отдельно проверять локальное имя и доменное имя. Отдельный регистр локального имени, начинающийся с "из других случаев и т. Д. Отдельный регистр доменного имени, начинающийся с [из других случаев и т. Д." Разделите задачу на более мелкие конкретные домены и используйте регулярные выражения только в четко определенных, более простых случаях.
Этот совет может быть применен ко многим применениям регулярных выражений, конечно...

[ОБНОВЛЕНО] Я собрал все, что я знаю о проверке адреса электронной почты, здесь: http://isemail.info/, который теперь не только проверяет, но и диагностирует проблемы с адресами электронной почты. Я согласен со многими комментариями здесь, что проверка является только частью ответа; см. мое эссе на http://isemail.info/.

Сейчас я сопоставил контрольные примеры Кэла Хендерсона, Дейва Чайлда, Фила Хаака, Дуга Ловелла и RFC 3696. Всего 158 тестовых адресов.

Я провел все эти тесты со всеми валидаторами, которые смог найти. Сравнение здесь: http://www.dominicsayers.com/isemail

Я постараюсь обновлять эту страницу по мере того, как люди улучшат свои валидаторы. Спасибо Кэлу, Дейву и Филу за помощь и сотрудничество в составлении этих тестов и конструктивную критику моего собственного валидатора.

Люди должны знать об ошибках в RFC 3696 в частности. Три из канонических примеров на самом деле являются недействительными адресами. И максимальная длина адреса составляет 254 или 256 символов, а не 320.

Кэл Хендерсон (из Flickr) написал RFC822-совместимое устройство для сопоставления адресов электронной почты с объяснением RFC и кода, использующего RFC для сопоставления адресов электронной почты. Я использую его уже довольно давно, без нареканий.

RFC822 (опубликован в 1982 г.) определяет, среди прочего, формат адресов текстовых сообщений (электронной почты) в Интернете. Вы можете найти RFC, погуглив - в Интернете их много. Они немного кратки и странно отформатированы, но, приложив немного усилий, мы сможем понять, к чему они стремятся.

... Обновить...

Как указывал в комментариях porges, библиотека по ссылке устарела, но на этой странице есть ссылка на обновленную версию.

Zend_Validate включает в себя валидатор электронной почты.

Для проверки существует множество регулярных выражений - от самых простых до самых продвинутых. Вы действительно должны выбрать что-то, что соответствует важности действительного адреса электронной почты в вашем приложении.

Я бы порекомендовал взглянуть на исходный код Zend_Validate_EmailAddress [ source].

как только вы исправите свои зависимости, вы можете просто сделать следующее:

$mail_validator = new Zend_Validate_EmailAddress();
$mail_validator->isValid($address);   // returns true or false

Лучше всего получить полную библиотеку Zend в свой проект через svn external и указать путь к ней…

но вы можете просто скачать необходимые файлы ( 1, 2, 3, 4, 5, 6) и включить их все (удалить вызовы require_once)

Другие вопросы по тегам