Chris@18
|
1 <?php
|
Chris@18
|
2
|
Chris@18
|
3 namespace Egulias\EmailValidator\Validation;
|
Chris@18
|
4
|
Chris@18
|
5 use Egulias\EmailValidator\EmailLexer;
|
Chris@18
|
6 use Egulias\EmailValidator\Exception\InvalidEmail;
|
Chris@18
|
7 use Egulias\EmailValidator\Warning\NoDNSMXRecord;
|
Chris@18
|
8 use Egulias\EmailValidator\Exception\NoDNSRecord;
|
Chris@18
|
9
|
Chris@18
|
10 class DNSCheckValidation implements EmailValidation
|
Chris@18
|
11 {
|
Chris@18
|
12 /**
|
Chris@18
|
13 * @var array
|
Chris@18
|
14 */
|
Chris@18
|
15 private $warnings = [];
|
Chris@18
|
16
|
Chris@18
|
17 /**
|
Chris@18
|
18 * @var InvalidEmail
|
Chris@18
|
19 */
|
Chris@18
|
20 private $error;
|
Chris@18
|
21
|
Chris@18
|
22 public function __construct()
|
Chris@18
|
23 {
|
Chris@18
|
24 if (!extension_loaded('intl')) {
|
Chris@18
|
25 throw new \LogicException(sprintf('The %s class requires the Intl extension.', __CLASS__));
|
Chris@18
|
26 }
|
Chris@18
|
27 }
|
Chris@18
|
28
|
Chris@18
|
29 public function isValid($email, EmailLexer $emailLexer)
|
Chris@18
|
30 {
|
Chris@18
|
31 // use the input to check DNS if we cannot extract something similar to a domain
|
Chris@18
|
32 $host = $email;
|
Chris@18
|
33
|
Chris@18
|
34 // Arguable pattern to extract the domain. Not aiming to validate the domain nor the email
|
Chris@18
|
35 if (false !== $lastAtPos = strrpos($email, '@')) {
|
Chris@18
|
36 $host = substr($email, $lastAtPos + 1);
|
Chris@18
|
37 }
|
Chris@18
|
38
|
Chris@18
|
39 return $this->checkDNS($host);
|
Chris@18
|
40 }
|
Chris@18
|
41
|
Chris@18
|
42 public function getError()
|
Chris@18
|
43 {
|
Chris@18
|
44 return $this->error;
|
Chris@18
|
45 }
|
Chris@18
|
46
|
Chris@18
|
47 public function getWarnings()
|
Chris@18
|
48 {
|
Chris@18
|
49 return $this->warnings;
|
Chris@18
|
50 }
|
Chris@18
|
51
|
Chris@18
|
52 protected function checkDNS($host)
|
Chris@18
|
53 {
|
Chris@18
|
54 $variant = INTL_IDNA_VARIANT_2003;
|
Chris@18
|
55 if ( defined('INTL_IDNA_VARIANT_UTS46') ) {
|
Chris@18
|
56 $variant = INTL_IDNA_VARIANT_UTS46;
|
Chris@18
|
57 }
|
Chris@18
|
58 $host = rtrim(idn_to_ascii($host, IDNA_DEFAULT, $variant), '.') . '.';
|
Chris@18
|
59
|
Chris@18
|
60 $Aresult = true;
|
Chris@18
|
61 $MXresult = checkdnsrr($host, 'MX');
|
Chris@18
|
62
|
Chris@18
|
63 if (!$MXresult) {
|
Chris@18
|
64 $this->warnings[NoDNSMXRecord::CODE] = new NoDNSMXRecord();
|
Chris@18
|
65 $Aresult = checkdnsrr($host, 'A') || checkdnsrr($host, 'AAAA');
|
Chris@18
|
66 if (!$Aresult) {
|
Chris@18
|
67 $this->error = new NoDNSRecord();
|
Chris@18
|
68 }
|
Chris@18
|
69 }
|
Chris@18
|
70 return $MXresult || $Aresult;
|
Chris@18
|
71 }
|
Chris@18
|
72 }
|