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

Symfony framework

Автор: Александр Степанов

5 февр. 2013 г., 11:02:07  1758


Используя 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):


*/
class sfValidatorEmailMx extends sfValidatorEmail
{
 /**
  * @see sfValidatorEmail
  */
 protected function configure($options = array(), $messages = array())
 {
  parent::configure($options, $messages);
  $this->addMessage('mx_error', 'No MX records for domain %domain%.');
 }
 
 protected function doClean($value)
 {
  $value = parent::doClean($value);
 
  list(,$domain) = explode('@', $value);
 
  if ($this->checkMx($domain))
  {
   return $value;
  }
  else
  {
   throw new sfValidatorError($this, 'mx_error', array('domain' => $domain));
  }
 }
 
 protected function checkMx($domain)
 {
  if (function_exists('checkdnsrr'))
  {
   return (bool)checkdnsrr($domain, 'MX');
  }
  else
  {
   return true;
  }
 }
}

Использование:

validatorSchema['mail'] = new sfValidatorEmailMx(array(),array(
   'invalid'    => 'E-Mail введен не корректно.',
   'max_length'  => 'Максимальная длина e-mail %max_length% символов.',
   'mx_error'   => 'На сервере %domain% почты быть не может.',
));

Источник, по просьбе автора ссылка