Analyze failure codes, don't fail on temporary failures.
Add analyze_smtp_reply(). Fixes #8. Signed-off-by: Thomas Hochstein <thh@inter.net>
This commit is contained in:
		
							parent
							
								
									9f87e75729
								
							
						
					
					
						commit
						f18dc26f65
					
				
					 1 changed files with 28 additions and 5 deletions
				
			
		
							
								
								
									
										33
									
								
								checkmail.pl
									
										
									
									
									
								
							
							
						
						
									
										33
									
								
								checkmail.pl
									
										
									
									
									
								
							| 
						 | 
					@ -202,7 +202,7 @@ sub checksmtp {
 | 
				
			||||||
    my ($success,$code,@message) = try_rcpt_to(\$smtp,$address,$logr);
 | 
					    my ($success,$code,@message) = try_rcpt_to(\$smtp,$address,$logr);
 | 
				
			||||||
    # connection failure?
 | 
					    # connection failure?
 | 
				
			||||||
    if ($success < 0) {
 | 
					    if ($success < 0) {
 | 
				
			||||||
      $status = connection_failed();
 | 
					      $status = connection_failed(@message);
 | 
				
			||||||
    # delivery attempt was successful?
 | 
					    # delivery attempt was successful?
 | 
				
			||||||
    } elsif ($success) {
 | 
					    } elsif ($success) {
 | 
				
			||||||
      # -r: try random address (which should be guaranteed to be invalid)
 | 
					      # -r: try random address (which should be guaranteed to be invalid)
 | 
				
			||||||
| 
						 | 
					@ -211,7 +211,7 @@ sub checksmtp {
 | 
				
			||||||
        my ($success,$code,@message) = try_rcpt_to(\$smtp,$config{'rand'}.'@'.$domain,$logr);
 | 
					        my ($success,$code,@message) = try_rcpt_to(\$smtp,$config{'rand'}.'@'.$domain,$logr);
 | 
				
			||||||
        # connection failure?
 | 
					        # connection failure?
 | 
				
			||||||
        if ($success < 0) {
 | 
					        if ($success < 0) {
 | 
				
			||||||
          $status = connection_failed();
 | 
					          $status = connection_failed(@message);
 | 
				
			||||||
        # verification impossible?
 | 
					        # verification impossible?
 | 
				
			||||||
        } elsif ($success) {
 | 
					        } elsif ($success) {
 | 
				
			||||||
          $status = 3;
 | 
					          $status = 3;
 | 
				
			||||||
| 
						 | 
					@ -298,16 +298,18 @@ sub print_dns_result {
 | 
				
			||||||
# IN : \$smtp    : a reference to an SMTP object
 | 
					# IN : \$smtp    : a reference to an SMTP object
 | 
				
			||||||
#      $recipient: a mail address
 | 
					#      $recipient: a mail address
 | 
				
			||||||
#      \$log     : reference to the log (to be printed out via -l)
 | 
					#      \$log     : reference to the log (to be printed out via -l)
 | 
				
			||||||
# OUT: $success: true or false
 | 
					# OUT: $success: exit code (0 for false, 1 for true, -1 for tempfail)
 | 
				
			||||||
#      $code   : SMTP status code
 | 
					#      $code   : SMTP status code
 | 
				
			||||||
#      $message: SMTP status message
 | 
					#      $message: SMTP status message
 | 
				
			||||||
#      \$log will be changed
 | 
					#      \$log will be changed
 | 
				
			||||||
sub try_rcpt_to {
 | 
					sub try_rcpt_to {
 | 
				
			||||||
  my($smtpr,$recipient,$logr)=@_;
 | 
					  my($smtpr,$recipient,$logr)=@_;
 | 
				
			||||||
  $$logr .= sprintf("RCPT TO:<%s>\n",$recipient);
 | 
					  $$logr .= sprintf("RCPT TO:<%s>\n",$recipient);
 | 
				
			||||||
  my $success = $$smtpr->to($recipient);
 | 
					  my $success;
 | 
				
			||||||
 | 
					  $$smtpr->to($recipient);
 | 
				
			||||||
  if ($$smtpr->code) {
 | 
					  if ($$smtpr->code) {
 | 
				
			||||||
    log_smtp_reply($logr,$$smtpr->code,$$smtpr->message);
 | 
					    log_smtp_reply($logr,$$smtpr->code,$$smtpr->message);
 | 
				
			||||||
 | 
					    $success = analyze_smtp_reply($$smtpr->code,$$smtpr->message);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    $success = -1;
 | 
					    $success = -1;
 | 
				
			||||||
    $$logr .= "---Connection failure---\n";
 | 
					    $$logr .= "---Connection failure---\n";
 | 
				
			||||||
| 
						 | 
					@ -328,11 +330,32 @@ sub log_smtp_reply {
 | 
				
			||||||
  return;
 | 
					  return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					############################### analyze_smtp_reply ##############################
 | 
				
			||||||
 | 
					# analyze SMTP response codes and messages
 | 
				
			||||||
 | 
					# IN : $code    : SMTP status code
 | 
				
			||||||
 | 
					#      @message : SMTP status message
 | 
				
			||||||
 | 
					# OUT: exit code (0 for false, 1 for true, -1 for tempfail)
 | 
				
			||||||
 | 
					sub analyze_smtp_reply {
 | 
				
			||||||
 | 
					  my($code,@message)=@_;
 | 
				
			||||||
 | 
					  my $type = substr($code, 0, 1);
 | 
				
			||||||
 | 
					  if ($type == 2) {
 | 
				
			||||||
 | 
					    return 1;
 | 
				
			||||||
 | 
					  } elsif ($type == 5) {
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					  } elsif ($type == 4) {
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  return -1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
############################## connection_failed ###############################
 | 
					############################## connection_failed ###############################
 | 
				
			||||||
# print failure message and return status 1
 | 
					# print failure message and return status 1
 | 
				
			||||||
 | 
					# IN : @message : SMTP status message
 | 
				
			||||||
# OUT: 1
 | 
					# OUT: 1
 | 
				
			||||||
sub connection_failed {
 | 
					sub connection_failed {
 | 
				
			||||||
  print "  > Connection failure.\n" if !($options{'q'});
 | 
					  my(@message)=@_;
 | 
				
			||||||
 | 
					  print "  ! Connection failed or other temporary failure.\n" if !($options{'q'});
 | 
				
			||||||
 | 
					  printf("    %s\n",join('    ',@message)) if @message;
 | 
				
			||||||
  return 1;
 | 
					  return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue