Сервис проверки существования email
Сфера использования
- проверка адреса пользователя, когда он регистрируется в системе;
- проверка в веб-приложениях перед отправкой письма (вдруг у пользователя e-mail недоступен, а он будет письма ждать);
- проверка при вводе во внутренние формы, адресные книги (например, при диктовке адреса по телефону, чтобы сразу проверить его верность).
Какие возможны проверки
- допустимое написание адреса (согласно шаблону - регулярному выражению)
- существование домена (указанного после '@')
- существование адреса по e-mail (обращение к серверу, который обслуживает)
- проверка, всегда ли сервер отвечает, что адрес существует (наводит на подозрение, что это может быть заведомо несуществующий e-mail)
- правильное указание зоны (MX) в домене
Основные положения
- выполняется в виде web-сервиса (GET запрос: http://cemail.net.ru?email=mymail@spb.ru). Скорее всего cgi-скриптом.
- в качестве ответа формирует стандартные HTTP ответы: 200 - ОК. Команда выполнена успешно 404 - Не обнаружен (не корректный email). 202 - Запрос был принят для обработки, однако обработка не завершена.
- Если требуется подробный отчёт, то например задаётся специальный параметр в GET запросе (например: http://cemail.net.ru?email=mymail@spb.ru&report=1)
- По умолчанию запрос НЕ асинхронный (при этом проверка длительная). Если не хочется ждать, то передаётся параметр означающий асинхронную обработку (http://cemail.org.ru?email=mymail@spb.ru&async=1). При этом пока идёт запрос будет возвращаться "202", результат кэшироваться, а клиент сам заботиться о повторной проверке.
- Для проверки через web-форму делается специальная страничка, которая будет обращаться как и другие к этому сервису и выдавать ответ в виде html-странички (с подробностями).
- надо описать, как это в случае ajax
Сервер
- если сервис будет популярен, то лучше отказаться от apache и сделать свой web-сервер (на своём порту) и написать его на c/c++. Возможно для cgi подойдёт и nginx.
- создать механизм кэширования (т.е. например БД, хранящая проверенные email-ы)
- продумать механизм асинхронной обработки. Либо возвращать клиенту идентификатор по которому он будет проверять готов ли ответ. Либо кэширование (предпочтительнее), т.е. сам сервер помечает, что запрос по данному email находится сейчас в обработке.
- Кэш действует в течение ограниченного времени (например в течение дня) (не должно создаваться никакой БД правильных адресов (особо неправильных - можно?), т.е. потенциального "клада" для спамеров)
- Для оптимизации (и безопасности) лучше использовать для кэша таблицы, создаваемые в памяти...
- Информацию о том, как сервера отвечают на проверку несуществующего адреса (можно и нужно кэшировать в отдельной таблице...)
Клиент
- клиент должен уметь обращаться повторно
- клиент должен уметь пережить отсутствие сервиса (аварию сервера)
Общие мысли по реализации
- http://www.postfix.org/verify.8.html
- возможно для проверки стоит использовать PERL (модуль Mail::CheckUser?)
- модуль который проверяет A и MX записи и опрашивает SMTP: http://search.cpan.org/~ilyam/Mail-CheckUser-1.21/CheckUser.pm
- Сервер реализуется как отдельный сервис (daemon), который всегда работает. Он периодически проходит по БД и находит все записи требующие проверки. После проверки выставляет им соответствующий статус, (и возможно заносит в отдельное поле таблицы отчёт о проверке). Заодно чистит кэш с устаревшими записями.
- Web-клиент (клиент для сервера) заносит в БД новую запись на проверку
(предварительно проверив нет ли уже такой) и ждёт изменения статуса.
Использование
Вы можете изучить пример использования cemail на http://www.cemail.net.ru/prime_1.
Основные моменты:
- Для работы Cemail необходимы файлы JsHttpRequest.js и cemail.js, их нужно подключить в заголовке своей страницы:
<script type="text/javascript" src="JsHttpRequest.js"></script> <script type="text/javascript" src="cemail.js"></script>
- В таблице стилей необходимо прописать класс input.blocked (стиль элемента, если адрес оказался неправильным):
input.blocked { border 2px solid red } - Сам компонент Cemail создается так:
var cg = new CemailGroup;
- И связывается с элементом ввода:
cg.add(document.getElementById('cemail_input')); - Вызов функции cg.startCheck() посылает запрос серверу и начинает проверку адреса на сервере. Если адрес неправильный, поле автоматически обведется красной рамкой.
- Кроме того, можно следить за ходом проверки, проверяя содержимое переменной cg.correct (в примере предлагается осуществлять такую проверку по таймеру):
- cg.correct == 2, если проверка еще идет
- cg.correct == 0, если результат проверки "адрес неверный"
- cg.correct == 1, если результат проверки "адрес правильный"
