Try to handle CNAMEs and resolve them to A records.

Change documentation accordingly.
Fixes #55.

Signed-off-by: Thomas Hochstein <thh@inter.net>
This commit is contained in:
Thomas Hochstein 2016-01-09 12:02:27 +01:00
parent 240c126484
commit 2378aae83e
2 changed files with 26 additions and 7 deletions

View file

@ -1,5 +1,10 @@
Version 0.6.2 (unreleased) Version 0.6.2 (unreleased)
* Try to handle CNAMEs and resolve them to A records.
Change documentation accordingly.
Fixes #55.
Thomas Hochstein <thh@inter.net> Sat Jan 9 12:02:27 2016 +0100
* Allow setting an empty envelope-from ('<>') using '-s'. * Allow setting an empty envelope-from ('<>') using '-s'.
Change documentation accordingly. Change documentation accordingly.
Update version and copyright dates. Update version and copyright dates.

View file

@ -156,12 +156,25 @@ sub gettargets {
print_dns_result($domain,'MX',undef,$resolver->errorstring,$logr); print_dns_result($domain,'MX',undef,$resolver->errorstring,$logr);
print(" Falling back to A record ...\n") if !($options{'q'}); 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')) { 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) { 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; $targets{$rr->address} = 0;
$$logr .= sprintf("- %s\n",$rr->address); $$logr .= sprintf("- %s\n",$rr->address);
}; };
print_dns_result($domain,'A',$acount,undef,$logr);
# no A record found either; log and fail # no A record found either; log and fail
} else { } else {
print_dns_result($domain,'A',undef,$resolver->errorstring,$logr); 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<DATA> stage, i.e. doing I<EHLO>, SMTP dialog until just before the I<DATA> stage, i.e. doing I<EHLO>,
I<MAIL FROM> and I<RCPT TO>. If no MX is defined, B<checkmail> will I<MAIL FROM> and I<RCPT TO>. If no MX is defined, B<checkmail> will
fall back to the I<example.org> host itself, provided there is at fall back to the I<example.org> host itself, provided there is at
least one A record defined in the DNS. If there are neither MX nor A least one A record defined in the DNS. CNAMEs will be accepted and
records for I<example.org>, mail is not deliverable and B<checkmail> resolved here. If there are neither MX nor A records for
will fail accordingly. If no host can be reached, B<checkmail> will I<example.org>, mail is not deliverable and B<checkmail> will fail
fail, too. Finally B<checkmail> will fail if mail to the given accordingly. If no host can be reached, B<checkmail> will fail,
recipient is not accepted by the respective host. too. Finally B<checkmail> will fail if mail to the given recipient
is not accepted by the respective host.
If B<checkmail> fails, you'll not be able to deliver mail to that If B<checkmail> fails, you'll not be able to deliver mail to that
address - at least not using the configured sender address and from address - at least not using the configured sender address and from