#! /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).
#
# 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!
use strict;
use File::Basename;
use Getopt::Std;
+use Mail::Address;
use Net::DNS;
use Net::SMTP;
# read commandline options
my %options;
-getopts('Vhqlrf:m:', \%options);
+getopts('Vhqlrf:m:s:e:', \%options);
# -V: display version
if ($options{'V'}) {
# display usage information if neither -f nor an address are present
if (!$options{'f'} and !$ARGV[0]) {
- print "Usage: $myself [-hqlr] [-m <host>] <address>|-f <file>\n";
+ print "Usage: $myself [-hqlr] [-m <host>] [-s <from>] [-e <EHLO>] <address>|-f <file>\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 <host> no DNS lookup, just test this host\n";
+ print " -s <from> override configured value for MAIL FROM\n";
+ print " -e <EHLO> override configured value for EHLO\n";
print " <address> mail address to check\n\n";
print " -f <file> 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'}) {
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
} 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);
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
=head1 SYNOPSIS
-B<checkmail> [B<-Vhqlr>] [B<-m> I<host>] I<address>|B<-f> I<file>
+B<checkmail> [B<-Vhqlr>] [B<-m> I<host>] [-s I<sender>] [-e I<EHLO>] I<address>|B<-f> I<file>
=head1 REQUIREMENTS
=item -
+Mail::Address I<(CPAN)>
+
+=item -
+
Net::DNS I<(CPAN)>
=item -
=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
checkmail -m test.host.example user@domain.example
+=item B<-s> I<sender> (value for MAIL FROM)
+
+Override configuration and use I<sender> for MAIL FROM.
+
+=item B<-e> I<EHLO> (value for EHLO)
+
+Override configuration and use I<EHLO> for EHLO.
+
=item B<-f> I<file> (file)
Process all addresses from I<file> (one on each line).