From 7a7bb3d42c8615cb28d9d654919522b5dfcef706 Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Thu, 6 Mar 2025 08:39:33 +0100 Subject: [PATCH 1/3] Fix connection timeout issue when try combine MX + A records for specific DNS when A record not exists --- src/Validation/DNSCheckValidation.php | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/Validation/DNSCheckValidation.php b/src/Validation/DNSCheckValidation.php index 469e87dc..17a8b516 100644 --- a/src/Validation/DNSCheckValidation.php +++ b/src/Validation/DNSCheckValidation.php @@ -17,7 +17,7 @@ class DNSCheckValidation implements EmailValidation /** * Reserved Top Level DNS Names (https://tools.ietf.org/html/rfc2606#section-2), * mDNS and private DNS Namespaces (https://tools.ietf.org/html/rfc6762#appendix-G) - * + * * @var string[] */ public const RESERVED_DNS_TOP_LEVEL_NAMES = [ @@ -145,14 +145,20 @@ protected function checkDns($host) */ private function validateDnsRecords($host): bool { - $dnsRecordsResult = $this->dnsGetRecord->getRecords($host, DNS_A + DNS_MX); + $dnsRecords = []; - if ($dnsRecordsResult->withError()) { - $this->error = new InvalidEmail(new UnableToGetDNSRecord(), ''); - return false; + $mxRecordsResult = $this->dnsGetRecord->getRecords($host, DNS_MX); + + if (! $mxRecordsResult->withError()) { + $dnsRecords = $mxRecordsResult->getRecords(); } - $dnsRecords = $dnsRecordsResult->getRecords(); + // Combined check for A+MX can fail with connection timed out, even in the presence of valid MX record + $aRecordsResult = $this->dnsGetRecord->getRecords($host, DNS_A); + + if (! $aRecordsResult->withError()) { + $dnsRecords = array_merge($dnsRecords, $aRecordsResult->getRecords()); + } // Combined check for A+MX+AAAA can fail with SERVFAIL, even in the presence of valid A/MX records $aaaaRecordsResult = $this->dnsGetRecord->getRecords($host, DNS_AAAA); @@ -163,6 +169,14 @@ private function validateDnsRecords($host): bool // No MX, A or AAAA DNS records if ($dnsRecords === []) { + if ($mxRecordsResult->withError() + && $aRecordsResult->withError() + && $aaaaRecordsResult->withError() + ) { + $this->error = new InvalidEmail(new UnableToGetDNSRecord(), ''); + return false; + } + $this->error = new InvalidEmail(new ReasonNoDNSRecord(), ''); return false; } From 39fb12bd4670d17c33c024409570ffc3182c81b3 Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Thu, 6 Mar 2025 08:43:14 +0100 Subject: [PATCH 2/3] Move validate MxRecords in own method --- src/Validation/DNSCheckValidation.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Validation/DNSCheckValidation.php b/src/Validation/DNSCheckValidation.php index 17a8b516..e52fa413 100644 --- a/src/Validation/DNSCheckValidation.php +++ b/src/Validation/DNSCheckValidation.php @@ -181,6 +181,11 @@ private function validateDnsRecords($host): bool return false; } + return $this->validateMxRecords($dnsRecords); + } + + private function validateMxRecords($dnsRecords): bool + { // For each DNS record foreach ($dnsRecords as $dnsRecord) { if (!$this->validateMXRecord($dnsRecord)) { @@ -191,6 +196,7 @@ private function validateDnsRecords($host): bool return false; } } + return true; } From 1b0892ad08a9e530dd021c7143dc27a505d5c5ff Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Tue, 24 Jun 2025 12:30:32 +0200 Subject: [PATCH 3/3] Add some phpdoc --- src/Validation/DNSCheckValidation.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Validation/DNSCheckValidation.php b/src/Validation/DNSCheckValidation.php index e52fa413..58a9faf6 100644 --- a/src/Validation/DNSCheckValidation.php +++ b/src/Validation/DNSCheckValidation.php @@ -184,6 +184,11 @@ private function validateDnsRecords($host): bool return $this->validateMxRecords($dnsRecords); } + /** + * @param array $dnsRecords + * + * @return bool True if valid. + */ private function validateMxRecords($dnsRecords): bool { // For each DNS record