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:----oOKDeWknNuz7VEfVgb8CqvsCAoz8ZJe2NrP4v5hEwl6Tb6lJ01zrjY50b5iEtymigu3FxJZnwM3DKCWd0Iz1cuIU7NMGIGjwwbuntY4AiIzw2DFYtt+pQV3e9gW1djIROGRHVZ2fTc+TSevW/gw5s8Ok9bZIu9jBWRF38nUIkXDanexDSL6334d5Ixz4BCe6AgaBY+1MZ4AvEEhum2TM7KeFYOqkOrfuRp4GC6LSCz4JG/FW1NMfpnyFuLoxVSzoKuB68ptmbepTI+kN6vDUsnerbKacHzRyBkADKh1Nh4DYYjDmjGEfrb31BZ9KgUDqqRe9m/zmZpE6ookYFki4xycx1PVx9k9rE0OHoaFJS4A5Gd75uYyVTbAY0r9p8XLoL7VIP1AeRli9o8YT2/9WawAbjHe1SPKBLQ1KzbdxdZzgOQ0GbYoERqp1+/sXx+bglCc6y5u20UcG4XBSnuLBdPgX3NbqwJjlqtihRtzzIqOUmHYzuobWmcg2fQl0uQYIjm/Um5Sc4kDMo2osJ3dBkVVg9H22VlDKdq7xLFjYg2ZH+JYe7jTW3R+K62VI5xbm1Rbb07tS5HzevivBV/7iZGogmSiti5Cq2Od0JjPparRdq3eHu+IarpGqxZCPpkvom/bpaiBhoBG4hQ6nDi5NlWDsf+h0mmw31QP8X7NVtKs=----ATTACHMENT:----NDI2MzIwMDMwNDc2NTcyMyA5MjQ4OTc5NDc3MjY1NTI2IDY5OTEwMTY3ODU5MTM3NjQ=