| 
<?phpdeclare(strict_types=1);
 namespace ParagonIE\Ionizer\Filter\Special;
 
 use ParagonIE\Ionizer\Filter\StringFilter;
 use ParagonIE\Ionizer\InvalidDataException;
 
 /**
 * Class EmailAddressFilter
 * @package ParagonIE\Ionizer\Filter\Special
 */
 class EmailAddressFilter extends StringFilter
 {
 /**
 * @var bool $checkDNS
 */
 protected $checkDNS = true;
 
 public function __construct()
 {
 $this->addThisCallback('validateEmailAddress');
 }
 
 /**
 * @param bool $value
 *
 * @return self
 */
 public function setCheckDNS(bool $value): self
 {
 $this->checkDNS = $value;
 return $this;
 }
 
 /**
 * @param string $input
 *
 * @return string
 * @throws InvalidDataException
 */
 public function validateEmailAddress(string $input): string
 {
 /** @var string|bool $filtered */
 $filtered = \filter_var($input, FILTER_VALIDATE_EMAIL);
 if (!\is_string($filtered)) {
 throw new InvalidDataException('Invalid email address: ' . $input);
 }
 $pos = \strpos($filtered, '@');
 if ($pos === false) {
 throw new InvalidDataException('Invalid email address (no @): ' . $input);
 }
 if (\substr_count($filtered, '@') !== 1) {
 throw new InvalidDataException('Invalid email address (more than one @): ' . $input);
 }
 if ($pos === 0) {
 throw new InvalidDataException('Invalid email address (no username): ' . $input);
 }
 /**
 * @var string $username
 * @var string $domain
 */
 list ($username, $domain) = \explode('@', $filtered);
 if (\preg_match('#^\.#', $username) || \preg_match('#\.$#', $username)) {
 throw new InvalidDataException('Invalid email address (leading or trailing dot): ' . $input);
 }
 if (\strpos($filtered, '..') !== false) {
 throw new InvalidDataException('Invalid email address (consecutive dots): ' . $input);
 }
 if ($this->checkDNS) {
 if (!\preg_match('#^\[?' . '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' . '\]?$#', $domain)) {
 if (!\checkdnsrr($domain, 'MX')) {
 throw new InvalidDataException('Invalid email address (no MX record on domain): ' . $input);
 }
 }
 }
 
 return $filtered;
 }
 }
 
 |