Сервис проверки существования email

http://cemail.net.ru

Сфера использования

  • проверка адреса пользователя, когда он регистрируется в системе;
  • проверка в веб-приложениях перед отправкой письма (вдруг у пользователя 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 находится сейчас в обработке.
  • Кэш действует в течение ограниченного времени (например в течение дня) (не должно создаваться никакой БД правильных адресов (особо неправильных - можно?), т.е. потенциального "клада" для спамеров)
  • Для оптимизации (и безопасности) лучше использовать для кэша таблицы, создаваемые в памяти...
  • Информацию о том, как сервера отвечают на проверку несуществующего адреса (можно и нужно кэшировать в отдельной таблице...)

Клиент

  • клиент должен уметь обращаться повторно
  • клиент должен уметь пережить отсутствие сервиса (аварию сервера)

Общие мысли по реализации

  • Сервер реализуется как отдельный сервис (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, если результат проверки "адрес правильный"