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:
Thomas Hochstein 2010-06-16 21:37:43 +02:00
parent 9f87e75729
commit f18dc26f65

View file

@ -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;
} }