Pull to refresh

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

Reading time 2 min
Views 9.6K
Используя 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. /**
  4. * sfValidatorEmailMx validates emails width mx record.
  5. *
  6. * @package  symfony
  7. * @subpackage validator
  8. * @author   Rustam Miniakhmetov <pycmam[at]gmail.com>
  9. */
  10. class sfValidatorEmailMx extends sfValidatorEmail
  11. {
  12.  /**
  13.   * @see sfValidatorEmail
  14.   */
  15.  protected function configure($options = array(), $messages = array())
  16.  {
  17.   parent::configure($options, $messages);
  18.   $this->addMessage('mx_error', 'No MX records for domain %domain%.');
  19.  }
  20.  
  21.  protected function doClean($value)
  22.  {
  23.   $value = parent::doClean($value);
  24.  
  25.   list(,$domain) = explode('@', $value);
  26.  
  27.   if ($this->checkMx($domain))
  28.   {
  29.    return $value;
  30.   }
  31.   else
  32.   {
  33.    throw new sfValidatorError($this, 'mx_error', array('domain' => $domain));
  34.   }
  35.  }
  36.  
  37.  protected function checkMx($domain)
  38.  {
  39.   if (function_exists('checkdnsrr'))
  40.   {
  41.    return (bool)checkdnsrr($domain, 'MX');
  42.   }
  43.   else
  44.   {
  45.    return true;
  46.   }
  47.  }
  48. }
* This source code was highlighted with Source Code Highlighter.


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

Буду рад, если кому-нибудь пригодится(:
Tags:
Hubs:
+17
Comments 79
Comments Comments 79

Articles