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:
		
							parent
							
								
									9518c39417
								
							
						
					
					
						commit
						ea5d225aa4
					
				
					 2 changed files with 39 additions and 23 deletions
				
			
		| 
						 | 
				
			
			@ -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).
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										54
									
								
								checkmail.pl
									
										
									
									
									
								
							
							
						
						
									
										54
									
								
								checkmail.pl
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue