Открыть список
Как стать автором
Обновить

Валидация Email с проверкой MX-записи домена

Symfony
Используя symfony с ORM Doctrine, возникла необходимость проверки e-mail'a в форме, но обычного sfValidatorEmail не достаточно, т.к. если в модели данных Doctrine поле email объявлено с валидатором «email: true» оно проверяется самой Doctrine на наличие MX-записи домена и если ее нет — выбрасывает эксепшн. Согласитесь, это не красиво(: Пользователь вводит регистрационные данные и фейковый почтовый адрес, удовлетворяющий шаблону, и получает в ответ «500 Inernal Server Error».

Для корректной обработки фейковых адресов я сделал свой валидатор sfValidatorEmailMx, который наследует стандартный валидатор sfValidatorEmail добавляя проверку MX-записи домена, если записей нет — вызыдает ошибку «mx_error» и именем домена в поле %domain%.

Код валидатора (lib/validator/sfValidatorEmailMx.class.php):
  1. <?php
  2. /**
  3. * sfValidatorEmailMx validates emails width mx record.
  4. *
  5. * @package symfony
  6. * @subpackage validator
  7. * @author Rustam Miniakhmetov <pycmam[at]gmail.com>
  8. */
  9. class sfValidatorEmailMx extends sfValidatorEmail
  10. {
  11. /**
  12. * @see sfValidatorEmail
  13. */
  14. protected function configure($options = array(), $messages = array())
  15. {
  16. parent::configure($options, $messages);
  17. $this->addMessage('mx_error', 'No MX records for domain %domain%.');
  18. }
  19. protected function doClean($value)
  20. {
  21. $value = parent::doClean($value);
  22. list(,$domain) = explode('@', $value);
  23. if ($this->checkMx($domain))
  24. {
  25. return $value;
  26. }
  27. else
  28. {
  29. throw new sfValidatorError($this, 'mx_error', array('domain' => $domain));
  30. }
  31. }
  32. protected function checkMx($domain)
  33. {
  34. if (function_exists('checkdnsrr'))
  35. {
  36. return (bool)checkdnsrr($domain, 'MX');
  37. }
  38. else
  39. {
  40. return true;
  41. }
  42. }
  43. }
* This source code was highlighted with Source Code Highlighter.


Использование:
  1. <?php
  2. //...
  3. $this->validatorSchema['mail'] = new sfValidatorEmailMx(array(),array(
  4. 'invalid' => 'E-Mail введен не корректно.',
  5. 'max_length' => 'Максимальная длина e-mail %max_length% символов.',
  6. 'mx_error' => 'На сервере %domain% почты быть не может.',
  7. ));
* This source code was highlighted with Source Code Highlighter.

Буду рад, если кому-нибудь пригодится(:
Теги:symfonyemail validatormx record
Хабы: Symfony
Всего голосов 29: ↑23 и ↓6 +17
Просмотры8.4K

Похожие публикации

Backend PHP Symfony-разработчик‌
от 80 000 до 150 000 ₽Like ЦентрМожно удаленно
Developer / Программист / Разработчик (Symfony)
от 120 000 ₽TRANSPORTIRМожно удаленно
PHP developer (Symfony)
от 100 000 до 200 000 ₽SibedgeСанкт-ПетербургМожно удаленно
Backend-разработчик (Symfony)
от 90 000 ₽PENA AgencyМожно удаленно
PHP developer (Symfony)
до 200 000 ₽Code PilotsМожно удаленно

Лучшие публикации за сутки