organizrnginxsonarrradarrplexdashboardcouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallemby
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.9 KiB
72 lines
1.9 KiB
<?php
|
|
|
|
namespace Egulias\EmailValidator\Validation;
|
|
|
|
use Egulias\EmailValidator\EmailLexer;
|
|
use Egulias\EmailValidator\Exception\InvalidEmail;
|
|
use Egulias\EmailValidator\Warning\NoDNSMXRecord;
|
|
use Egulias\EmailValidator\Exception\NoDNSRecord;
|
|
|
|
class DNSCheckValidation implements EmailValidation
|
|
{
|
|
/**
|
|
* @var array
|
|
*/
|
|
private $warnings = [];
|
|
|
|
/**
|
|
* @var InvalidEmail
|
|
*/
|
|
private $error;
|
|
|
|
public function __construct()
|
|
{
|
|
if (!extension_loaded('intl')) {
|
|
throw new \LogicException(sprintf('The %s class requires the Intl extension.', __CLASS__));
|
|
}
|
|
}
|
|
|
|
public function isValid($email, EmailLexer $emailLexer)
|
|
{
|
|
// use the input to check DNS if we cannot extract something similar to a domain
|
|
$host = $email;
|
|
|
|
// Arguable pattern to extract the domain. Not aiming to validate the domain nor the email
|
|
if (false !== $lastAtPos = strrpos($email, '@')) {
|
|
$host = substr($email, $lastAtPos + 1);
|
|
}
|
|
|
|
return $this->checkDNS($host);
|
|
}
|
|
|
|
public function getError()
|
|
{
|
|
return $this->error;
|
|
}
|
|
|
|
public function getWarnings()
|
|
{
|
|
return $this->warnings;
|
|
}
|
|
|
|
protected function checkDNS($host)
|
|
{
|
|
$variant = INTL_IDNA_VARIANT_2003;
|
|
if ( defined('INTL_IDNA_VARIANT_UTS46') ) {
|
|
$variant = INTL_IDNA_VARIANT_UTS46;
|
|
}
|
|
$host = rtrim(idn_to_ascii($host, IDNA_DEFAULT, $variant), '.') . '.';
|
|
|
|
$Aresult = true;
|
|
$MXresult = checkdnsrr($host, 'MX');
|
|
|
|
if (!$MXresult) {
|
|
$this->warnings[NoDNSMXRecord::CODE] = new NoDNSMXRecord();
|
|
$Aresult = checkdnsrr($host, 'A') || checkdnsrr($host, 'AAAA');
|
|
if (!$Aresult) {
|
|
$this->error = new NoDNSRecord();
|
|
}
|
|
}
|
|
return $MXresult || $Aresult;
|
|
}
|
|
}
|
|
|