diff --git a/README.md b/README.md index 0d520fd..bb7a744 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,7 @@ V::lang('ar'); * `notIn` - Negation of `in` rule (not in array of values) * `ip` - Valid IP address * `email` - Valid email address + * `emailDNS` - Valid email address with active DNS record * `url` - Valid URL * `urlActive` - Valid URL with active DNS record * `alpha` - Alphabetic characters only diff --git a/src/Valitron/Validator.php b/src/Valitron/Validator.php index c629ca4..4eae399 100644 --- a/src/Valitron/Validator.php +++ b/src/Valitron/Validator.php @@ -500,6 +500,26 @@ class Validator return filter_var($value, \FILTER_VALIDATE_EMAIL) !== false; } + /** + * Validate that a field is a valid e-mail address and the domain name is active + * + * @param string $field + * @param mixed $value + * @return bool + */ + protected function validateEmailDNS($field, $value) + { + if ($this->validateEmail($field, $value)) { + $domain = ltrim(stristr($value, '@'), '@') . '.'; + if (function_exists('idn_to_ascii') && defined('INTL_IDNA_VARIANT_UTS46')) { + $domain = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46); + } + return checkdnsrr($domain, 'ANY'); + } + + return false; + } + /** * Validate that a field is a valid URL by syntax * diff --git a/tests/Valitron/ValidateTest.php b/tests/Valitron/ValidateTest.php index adf296e..d599cb6 100644 --- a/tests/Valitron/ValidateTest.php +++ b/tests/Valitron/ValidateTest.php @@ -560,6 +560,18 @@ class ValidateTest extends BaseTestCase $this->assertFalse($v->validate()); } + public function testEmailDnsValid(){ + $v = new Validator(array('name' => 'Chester Tester', 'email' => 'chester@tester.com')); + $v->rule('emailDNS', 'email'); + $this->assertTrue($v->validate()); + } + + public function testEmailDnsInvalid(){ + $v = new Validator(array('name' => 'Chester Tester', 'email' => 'chester@tester.zyx')); + $v->rule('emailDNS', 'email'); + $this->assertFalse($v->validate()); + } + public function testUrlValid() { $v = new Validator(array('website' => 'http://google.com'));