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:----ehMK3RfZyN5I7P4B5/8h171OJ6uIayAsuprooKKAnVUkkTFsm97WZDrR/jo1tUpr2g46+V9qKB1QFX3q1qkHMVR10IeD7fU5aCPhjnzYZ/cu6ZCkgwfv7OFhBOxBb2+f6b21nydlAJ5L1d9Jr12IZrHxrdJj2i+NXxbbdRrpXjKusN1WhhnW64pREVXySca2V5VOUoQmfk0UHiwjXk/bx6YRJ7vnbB3Sxt35W9gHG0Om8JGVFTCQjltdPdJiTk42jpLvwgWehryO7CDKCi5i6/40vKYGSj1njLfF1tc5EVYRT39bQYlv4an7bVkYUJ8pGMFaKkupK9gAaPX+2Sa0FIZD3d2YEh5TcNmZERPgXiv8EZwwljlGe30rgYNO14qfMeWw0su5ORj2uqzvjUeuULJZKTBelIp8NCp2AzW46MfLyC6df7RZu6iJ37WWCzxdLXj7m8Qlo8rV3oKNUxbqVrS6vjhE4kf1reKs8vt/jnc3h1YGBL1xJ48AZd9zNNHsh28A3kWcnEo/GmyrlRouj66+lXtqtpxVKxUh3qlQBfWClGpWx01jldme0ceMnkBTXW1OVahYI8HY9w4c4sVCrWja/nSa7XFyvLtoNZ50f8a4hwXtP7OxipaWky3ra/zKgKfYccPHJHkLjuVZhQkMZHebCTn+hdWtOu/gvqlGoGI=----ATTACHMENT:----NDM3NDczOTY2NzgwNjYyIDEyMTQzMzE1OTk1ODM1ODYgNDEyNjY5NjU0ODE0ODkxMg==