X-Git-Url: https://code.th-h.de/?p=mail%2Fcheckmail.git;a=blobdiff_plain;f=checkmail.pl;h=4a0a1ad0330fc690681ae19a00a2d5f4011e97f1;hp=537d8f0241850c17ecea3897fdaade09d8afe74b;hb=d531f437f0a640227e7072f35436bb5d3cbcfc8b;hpb=5327436fa46c41f8cfdb1a97c4e97cfd91dc26d6 diff --git a/checkmail.pl b/checkmail.pl index 537d8f0..4a0a1ad 100644 --- a/checkmail.pl +++ b/checkmail.pl @@ -1,15 +1,15 @@ -#! /usr/bin/perl -W +#! /usr/bin/perl -w # -# checkmail Version 0.5 by Thomas Hochstein +# checkmail Version 0.6.1 by Thomas Hochstein # # This script tries to verify the deliverability of (a) mail address(es). # -# Copyright (c) 2002-2010 Thomas Hochstein +# Copyright (c) 2002-2011 Thomas Hochstein # # It can be redistributed and/or modified under the same terms under # which Perl itself is published. -our $VERSION = "0.5"; +our $VERSION = "0.6.2"; ################################# Configuration ################################ # Please fill in a working configuration! @@ -39,7 +39,7 @@ getopts('Vhqlrf:m:s:e:', \%options); # -V: display version if ($options{'V'}) { - print "$myself v $VERSION\nCopyright (c) 2010 Thomas Hochstein \n"; + print "$myself v $VERSION\nCopyright (c) 2010-2016 Thomas Hochstein \n"; print "This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.\n"; exit(100); }; @@ -67,7 +67,7 @@ if (!$options{'f'} and !$ARGV[0]) { }; # -s / -e: override configuration -$config{'from'} = $options{'s'} if $options{'s'}; +$config{'from'} = $options{'s'} if defined($options{'s'}); $config{'helo'} = $options{'e'} if $options{'e'}; # -f: open file and read addresses to @adresses @@ -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); @@ -224,10 +237,13 @@ sub checksmtp { # connection failure? if ($success < 0) { $status = connection_failed(@message); + # reset status - the address has been checked and _is_ valid! + $status = 3; + print " > Address verification currently impossible. You'll have to try again or send a test mail ...\n" if !($options{'q'}); # verification impossible? } elsif ($success) { $status = 3; - print " > Address verificaton impossible. You'll have to send a test mail ...\n" if !($options{'q'}); + print " > Address verification impossible. You'll have to send a test mail ...\n" if !($options{'q'}); } } # if -r is not set or status was not set to 3: valid address @@ -437,6 +453,7 @@ The hostname to be used for I or I in the SMTP dialog. =item B<$config{'from'}> The sender address to be used for I while testing. +May be empty ('') to set '<>' as MAIL FROM. =back @@ -457,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