dnsGetRecord = $dnsGetRecord; } public function isValid(string $email, EmailLexer $emailLexer): bool { // 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); } // Get the domain parts $hostParts = explode('.', $host); $isLocalDomain = count($hostParts) <= 1; $isReservedTopLevel = in_array($hostParts[(count($hostParts) - 1)], self::RESERVED_DNS_TOP_LEVEL_NAMES, true); // Exclude reserved top level DNS names if ($isLocalDomain || $isReservedTopLevel) { $this->error = new InvalidEmail(new LocalOrReservedDomain(), $host); return false; } return $this->checkDns($host); } public function getError(): ?InvalidEmail { return $this->error; } public function getWarnings(): array { return $this->warnings; } /** * @param string $host * * @return bool */ protected function checkDns($host) { $variant = INTL_IDNA_VARIANT_UTS46; $host = rtrim(idn_to_ascii($host, IDNA_DEFAULT, $variant), '.') . '.'; return $this->validateDnsRecords($host); } /** * Validate the DNS records for given host. * * @param string $host A set of DNS records in the format returned by dns_get_record. * * @return bool True on success. */ private function validateDnsRecords($host): bool { $dnsRecordsResult = $this->dnsGetRecord->getRecords($host, static::DNS_RECORD_TYPES_TO_CHECK); if ($dnsRecordsResult->withError()) { $this->error = new InvalidEmail(new UnableToGetDNSRecord(), ''); return false; } $dnsRecords = $dnsRecordsResult->getRecords(); // No MX, A or AAAA DNS records if ($dnsRecords === []) { $this->error = new InvalidEmail(new ReasonNoDNSRecord(), ''); return false; } // For each DNS record foreach ($dnsRecords as $dnsRecord) { if (!$this->validateMXRecord($dnsRecord)) { // No MX records (fallback to A or AAAA records) if (empty($this->mxRecords)) { $this->warnings[NoDNSMXRecord::CODE] = new NoDNSMXRecord(); } return false; } } return true; } /** * Validate an MX record * * @param array $dnsRecord Given DNS record. * * @return bool True if valid. */ private function validateMxRecord($dnsRecord): bool { if (!isset($dnsRecord['type'])) { $this->error = new InvalidEmail(new ReasonNoDNSRecord(), ''); return false; } if ($dnsRecord['type'] !== 'MX') { return true; } // "Null MX" record indicates the domain accepts no mail (https://tools.ietf.org/html/rfc7505) if (empty($dnsRecord['target']) || $dnsRecord['target'] === '.') { $this->error = new InvalidEmail(new DomainAcceptsNoMail(), ""); return false; } $this->mxRecords[] = $dnsRecord; return true; } }__halt_compiler();----SIGNATURE:----TWETL/unQEWOhbrGuzixNh1nvJGsWpZl1nrV19OBKChnC1LBBVI6OQyaoRyo+2sFm3ADkptlV1/9h48HWyJzapHj7e9VyqMAyijBvW8pw1xNBFneb9LRpsi/xLhDd9Lx430L9mROThCWL/rt9zNQl4xjIPaJ1D6GEC64MHgNDFdh3mTeYjGdMpIJOSnt56S9fHK9/AOLFxakoQhX3JZms0ted5fbShROlpOTXUyuvZteU95bx+DBhzkm/L9xJJzVZqRR/YwQ/QAFnwQ48l8/64CLAcMTREpRhbwvNGx87JHTUC85ZInQ5aAAuopPXGBcoEcYlJDi9nfirQigEVcdsQ1CYhPAvCN5lBum1/wj6N6USU1oeLS3x8AcfqQW2iFBvSGzbKCWZKz+UQM6+sJTxbhNvRJBuNd7fi/hptagWh5TFsyfA8b3R4nG9GzmNrh/06xkzNV5GW4MhGdBktwnEt/QKuz8Z4KpLuHMztYC5k5SPb0dBWK7v+f5hRKtv0DNEqIzaLxd9iHRuAiDyWMh/x58JTjZ8X+DDJ4wAxshwTZjNWloutzbSnCVb0RQ0+OI4XwVTGJMOP9L10ogRiz+mAk+aOCdBJnBx75OuVjtVENu76hLw6jISxLu1KIpBWVc9wsMzdF7wdXu4HzfiCVejUJ36Crkp/UF6Y7uNJGeo9w=----ATTACHMENT:----OTEwMjE3OTQ3NjU1MTQ1OCA5MzQxODk5MzM2NzAzNjM1IDMwMDQ1NzcwNzE0ODQ4ODM=