From 4079acf4a6e882f5ba0eef112cd62ae82dcf43d4 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Wed, 20 Nov 2013 16:30:12 +0100 Subject: [PATCH] changed EmailValidator MX check to be more useful issue #1246 --- framework/yii/validators/EmailValidator.php | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/framework/yii/validators/EmailValidator.php b/framework/yii/validators/EmailValidator.php index 238adab..cde175a 100644 --- a/framework/yii/validators/EmailValidator.php +++ b/framework/yii/validators/EmailValidator.php @@ -38,11 +38,22 @@ class EmailValidator extends Validator */ public $allowName = false; /** - * @var boolean whether to check the MX record for the email address. - * Defaults to false. To enable it, you need to make sure the PHP function 'checkdnsrr' - * exists in your PHP installation. + * @var boolean whether to check whether the emails domain exists and has either an A or MX record. + * Be aware of the fact that this check can fail due to temporary DNS problems even if the email address is + * valid and an email would be deliverable. Defaults to false. + * @see dnsMessage */ - public $checkMX = false; + public $checkDNS = false; + /** + * @var string the error message to display when the domain of the email does not exist. + * It may contain the following placeholders which will be replaced accordingly by the validator: + * + * - `{attribute}`: the label of the attribute being validated + * - `{value}`: the value of the attribute being validated + * + * @see checkDNS + */ + public $dnsMessage; /** * @var boolean whether to check port 25 for the email address. * Defaults to false. @@ -69,6 +80,9 @@ class EmailValidator extends Validator if ($this->message === null) { $this->message = Yii::t('yii', '{attribute} is not a valid email address.'); } + if ($this->dnsMessage === null) { + $this->dnsMessage = Yii::t('yii', 'The domain of this email address does not seem to exist.'); + } } /** @@ -105,8 +119,8 @@ class EmailValidator extends Validator } $valid = preg_match($this->pattern, $value) || $this->allowName && preg_match($this->fullPattern, $value); if ($valid) { - if ($this->checkMX && function_exists('checkdnsrr')) { - $valid = checkdnsrr($domain, 'MX'); + if ($this->checkDNS) { + $valid = checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A'); } if ($valid && $this->checkPort && function_exists('fsockopen')) { $valid = fsockopen($domain, 25) !== false;