Add syntax checking for mail addresses.

* Add check against regexp from
  http://www.regular-expressions.info/email.html
* Change documentation accordingly.
* Bump version number to 0.5

Fixes #11.

Signed-off-by: Thomas Hochstein <thh@inter.net>
This commit is contained in:
Thomas Hochstein 2011-07-24 00:12:52 +02:00
parent 9518c39417
commit ea5d225aa4
2 changed files with 39 additions and 23 deletions

View file

@ -1,3 +1,11 @@
Version 0.5
* Add syntax check for mail addresses.
Change documentation accordingly.
Fixes #11.
Thomas Hochstein <thh@inter.net> Sat Jul 23 23:53:22 2011 +0200
Version 0.4
* Add overrides for configuration (MAIL FROM/EHLO).

View file

@ -1,6 +1,6 @@
#! /usr/bin/perl -W
#
# checkmail Version 0.4 by Thomas Hochstein
# checkmail Version 0.5 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.4";
our $VERSION = "0.5";
################################# Configuration ################################
# Please fill in a working configuration!
@ -92,28 +92,35 @@ if ($options{'f'}) {
my (%targets,$curstat,$status,$log,$message);
foreach (@addresses) {
my $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
if (!$options{'m'}) {
%targets = %{gettargets($domain,\$log)};
} else {
$message = sprintf("Connection to %s forced by -m.\n",$options{'m'});
$log .= $message;
print " $message" if !($options{'q'});
# just one target host with preference 0
$targets{$options{'m'}} = 0;
};
if (%targets) {
$curstat = checkaddress($address,\%targets,\$log);
} else {
# regexp taken from http://www.regular-expressions.info/email.html
# and escaping of "/" added two times
if ($address !~ /^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i) {
printf(" > Address <%s> is syntactically INVALID.\n",$address) if !($options{'q'});
$curstat = 2;
$message = 'DNS lookup failure';
printf(" > Address is INVALID (%s).\n",$message) if !($options{'q'});
$log .= $message . '.';
} else {
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
if (!$options{'m'}) {
%targets = %{gettargets($domain,\$log)};
} else {
$message = sprintf("Connection to %s forced by -m.\n",$options{'m'});
$log .= $message;
print " $message" if !($options{'q'});
# just one target host with preference 0
$targets{$options{'m'}} = 0;
};
if (%targets) {
$curstat = checkaddress($address,\%targets,\$log);
} else {
$curstat = 2;
$message = 'DNS lookup failure';
printf(" > Address is INVALID (%s).\n",$message) if !($options{'q'});
$log .= $message . '.';
};
$log .= "====== END $address ======\n";
};
$log .= "====== END $address ======\n";
$status = $curstat if (!defined($status) or $curstat > $status);
};
@ -441,7 +448,8 @@ After configuring the script you may run your first test with
checkmail user@example.org
B<checkmail> will try to determine the mail exchanger(s) (MX)
B<checkmail> will check the address for syntactic validity. If the
address is valid, it will try to determine the mail exchanger(s) (MX)
responsible for I<example.org> by querying the DNS for the respective
MX records and then try to connect via SMTP (on port 25) to each of
them in order of precedence (if necessary). It will run through the