X-Git-Url: https://code.th-h.de/?p=mail%2Fcheckmail.git;a=blobdiff_plain;f=checkmail.pl;h=2d8bfb08a770c6b15f70903c2ff38e86a399e472;hp=f6cf417dce0ef80321cc0b13be68804124a432f3;hb=9518c3941780f392d05b59918088fc8264a1d026;hpb=9fc0e927760e5b4ba173ac738b4793172e96152d;ds=sidebyside diff --git a/checkmail.pl b/checkmail.pl index f6cf417..2d8bfb0 100644 --- a/checkmail.pl +++ b/checkmail.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl -W # -# checkmail Version 0.3 by Thomas Hochstein +# checkmail Version 0.4 by Thomas Hochstein # # This script tries to verify the deliverability of (a) mail address(es). # @@ -9,7 +9,7 @@ # It can be redistributed and/or modified under the same terms under # which Perl itself is published. -our $VERSION = "0.3"; +our $VERSION = "0.4"; ################################# Configuration ################################ # Please fill in a working configuration! @@ -24,6 +24,7 @@ my %config=( use strict; use File::Basename; use Getopt::Std; +use Mail::Address; use Net::DNS; use Net::SMTP; @@ -34,7 +35,7 @@ my $myself = basename($0); # read commandline options my %options; -getopts('Vhqlrf:m:', \%options); +getopts('Vhqlrf:m:s:e:', \%options); # -V: display version if ($options{'V'}) { @@ -51,18 +52,24 @@ if ($options{'h'}) { # display usage information if neither -f nor an address are present if (!$options{'f'} and !$ARGV[0]) { - print "Usage: $myself [-hqlr] [-m ]
|-f \n"; + print "Usage: $myself [-hqlr] [-m ] [-s ] [-e ]
|-f \n"; print "Options: -V display copyright and version\n"; print " -h show documentation\n"; print " -q quiet (no output, just exit with 0/1/2/3)\n"; print " -l extended logging\n"; print " -r test random address to verify verification\n"; print " -m no DNS lookup, just test this host\n"; + print " -s override configured value for MAIL FROM\n"; + print " -e override configured value for EHLO\n"; print "
mail address to check\n\n"; print " -f parse file (one address per line)\n"; exit(100); }; +# -s / -e: override configuration +$config{'from'} = $options{'s'} if $options{'s'}; +$config{'helo'} = $options{'e'} if $options{'e'}; + # -f: open file and read addresses to @adresses my @addresses; if ($options{'f'}) { @@ -85,7 +92,7 @@ if ($options{'f'}) { my (%targets,$curstat,$status,$log,$message); foreach (@addresses) { my $address = $_; - (undef,my $domain) = splitaddress($address); + my $domain = Mail::Address->new('',$address)->host; printf(" * Testing %s ...\n",$address) if !($options{'q'}); $log .= "\n===== BEGIN $address =====\n"; # get list of target hosts or take host forced via -m @@ -205,8 +212,7 @@ sub checksmtp { } elsif ($success) { # -r: try random address (which should be guaranteed to be invalid) if ($options{'r'}) { - (undef,my $domain) = splitaddress($address); - my ($success,$code,@message) = try_rcpt_to(\$smtp,create_rand_addr($domain),$logr); + my ($success,$code,@message) = try_rcpt_to(\$smtp,create_rand_addr(Mail::Address->new('',$address)->host),$logr); # connection failure? if ($success < 0) { $status = connection_failed(@message); @@ -239,18 +245,6 @@ sub checksmtp { return $status; } -################################# splitaddress ################################# -# split mail address into local and domain part -# IN : $address: a mail address -# OUT: $local : local part -# $domain: domain part -sub splitaddress { - my($address)=@_; - (my $lp = $address) =~ s/^([^@]+)@.*/$1/; - (my $domain = $address) =~ s/[^@]+\@(\S*)$/$1/; - return ($lp,$domain); -}; - ############################### create_rand_addr ############################### # create a random mail address # IN : $domain: the domain part @@ -381,7 +375,7 @@ checkmail - check deliverability of a mail address =head1 SYNOPSIS -B [B<-Vhqlr>] [B<-m> I] I
|B<-f> I +B [B<-Vhqlr>] [B<-m> I] [-s I] [-e I] I
|B<-f> I =head1 REQUIREMENTS @@ -401,6 +395,10 @@ Getopt::Std =item - +Mail::Address I<(CPAN)> + +=item - + Net::DNS I<(CPAN)> =item - @@ -434,6 +432,9 @@ The sender address to be used for I while testing. =back +You may override that configuration by using the B<-e> and B<-s> +command line options. + =head2 Usage After configuring the script you may run your first test with @@ -513,6 +514,9 @@ B You shouldn't try to validate addresses while working from a dial-up or blacklisted host. If in doubt, use the B<-l> option to have a closer look on the SMTP dialog yourself. +B To avoid shell expansion on addresses you submit to +B, use B. + =head1 OPTIONS =over 3 @@ -545,6 +549,14 @@ particular host irrespective of DNS entries. For example: checkmail -m test.host.example user@domain.example +=item B<-s> I (value for MAIL FROM) + +Override configuration and use I for MAIL FROM. + +=item B<-e> I (value for EHLO) + +Override configuration and use I for EHLO. + =item B<-f> I (file) Process all addresses from I (one on each line).