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 Version 0.4
* Add overrides for configuration (MAIL FROM/EHLO). * Add overrides for configuration (MAIL FROM/EHLO).

View file

@ -1,6 +1,6 @@
#! /usr/bin/perl -W #! /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). # 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 # It can be redistributed and/or modified under the same terms under
# which Perl itself is published. # which Perl itself is published.
our $VERSION = "0.4"; our $VERSION = "0.5";
################################# Configuration ################################ ################################# Configuration ################################
# Please fill in a working configuration! # Please fill in a working configuration!
@ -92,6 +92,12 @@ if ($options{'f'}) {
my (%targets,$curstat,$status,$log,$message); my (%targets,$curstat,$status,$log,$message);
foreach (@addresses) { foreach (@addresses) {
my $address = $_; my $address = $_;
# 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;
} else {
my $domain = Mail::Address->new('',$address)->host; my $domain = Mail::Address->new('',$address)->host;
printf(" * Testing %s ...\n",$address) if !($options{'q'}); printf(" * Testing %s ...\n",$address) if !($options{'q'});
$log .= "\n===== BEGIN $address =====\n"; $log .= "\n===== BEGIN $address =====\n";
@ -114,6 +120,7 @@ foreach (@addresses) {
$log .= $message . '.'; $log .= $message . '.';
}; };
$log .= "====== END $address ======\n"; $log .= "====== END $address ======\n";
};
$status = $curstat if (!defined($status) or $curstat > $status); $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 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 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 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 them in order of precedence (if necessary). It will run through the