From: Thomas Hochstein Date: Sat, 9 Jan 2016 11:02:27 +0000 (+0100) Subject: Try to handle CNAMEs and resolve them to A records. X-Git-Tag: v0.6.2~1 X-Git-Url: https://code.th-h.de/?p=mail%2Fcheckmail.git;a=commitdiff_plain;h=2378aae83e0c71a824fd0e73ba5ecad6ceab3123;ds=sidebyside Try to handle CNAMEs and resolve them to A records. Change documentation accordingly. Fixes #55. Signed-off-by: Thomas Hochstein --- diff --git a/ChangeLog b/ChangeLog index 3388109..5d3504f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ Version 0.6.2 (unreleased) +* Try to handle CNAMEs and resolve them to A records. + Change documentation accordingly. + Fixes #55. + Thomas Hochstein Sat Jan 9 12:02:27 2016 +0100 + * Allow setting an empty envelope-from ('<>') using '-s'. Change documentation accordingly. Update version and copyright dates. diff --git a/checkmail.pl b/checkmail.pl index 9bf82b8..4a0a1ad 100644 --- a/checkmail.pl +++ b/checkmail.pl @@ -155,13 +155,26 @@ sub gettargets { } else { print_dns_result($domain,'MX',undef,$resolver->errorstring,$logr); print(" Falling back to A record ...\n") if !($options{'q'}); - # get A record(s) + # get A record(s) + # may get CNAMEs instead ... if (my $query = $resolver->query($domain,'A','IN')) { - print_dns_result($domain,'A',$query->header->ancount,undef,$logr); + # save number of answers in a counter + my $acount = $query->header->ancount; foreach my $rr ($query->answer) { + if ($rr->type ne 'A') { + # decrease counter if it's not an A record + $acount--; + # report CNAMEs and don't add them to target list + if ($rr->type eq 'CNAME') { + printf (" ~ '%s' is a CNAME for '%s' and will be resolved accordingly. \n",$rr->name,$rr->cname) if !($options{'q'}); + $$logr .= sprintf("CNAME resolved: %s -> %s\n",$rr->name,$rr->cname); + } + next; + } $targets{$rr->address} = 0; $$logr .= sprintf("- %s\n",$rr->address); }; + print_dns_result($domain,'A',$acount,undef,$logr); # no A record found either; log and fail } else { print_dns_result($domain,'A',undef,$resolver->errorstring,$logr); @@ -461,11 +474,12 @@ them in order of precedence (if necessary). It will run through the SMTP dialog until just before the I stage, i.e. doing I, I and I. If no MX is defined, B will fall back to the I host itself, provided there is at -least one A record defined in the DNS. If there are neither MX nor A -records for I, mail is not deliverable and B -will fail accordingly. If no host can be reached, B will -fail, too. Finally B will fail if mail to the given -recipient is not accepted by the respective host. +least one A record defined in the DNS. CNAMEs will be accepted and +resolved here. If there are neither MX nor A records for +I, mail is not deliverable and B will fail +accordingly. If no host can be reached, B will fail, +too. Finally B will fail if mail to the given recipient +is not accepted by the respective host. If B fails, you'll not be able to deliver mail to that address - at least not using the configured sender address and from