Валидация Email с проверкой MX-записи домена
Используя 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% почты быть не может.',
));
Источник, по просьбе автора ссылка