Thomas,
> The full patch is on its way...
So here it is, adding back the missing 'Ok, id=01234-01-2, from MTA...'
to SMTP responses (with some code streamlining):
--- amavisd.orig 2008-04-23 20:50:05.000000000 +0200
+++ amavisd 2008-05-21 15:23:23.000000000 +0200
@@ -16498,22 +16498,26 @@
}
-# Insert a fabricated enhanced status code if missing in a response to RCPT TO
+# Add a log_id to the SMTP status text, insert a fabricated RFC 3463 enhanced
+# status code if missing in a MTA response
#
-sub enhance_rcpt_smtp_response($$$) {
- my($smtp_resp,$am_id,$mta_id) = @_;
- local($1,$2,$3);
- if ($smtp_resp =~ /^ (\d{3}) [ \t]+ ([245] \. \d{1,3} \. \d{1,3})?
- \s* (.*) \z/xs) {
- my($resp_code, $resp_enhcode, $resp_msg) = ($1, $2, $3);
- if ($resp_enhcode eq '' && $resp_code =~ /^([245])/) {
- my($c1) = $1;
- $resp_enhcode = $resp_code eq '452' ? "$c1.5.3" : "$c1.1.0";
- }
- $smtp_resp = sprintf("%s %s %s, id=%s, from MTA(%s): %s",
- $resp_code, $resp_enhcode,
- ($resp_code=~/^2/ ? 'Ok' : 'Failed'),
- $am_id, $mta_id, $smtp_resp);
- }
- $smtp_resp;
+sub enhance_smtp_response($$$$$) {
+ my($smtp_resp,$am_id,$mta_id,$dflt_enhcode,$cmd_name) = @_;
+ local($1,$2,$3); my($resp_shortmsg,$resp_msg);
+ my($resp_code,$resp_enhcode) = ('451', '4.5.0');
+ if (!defined($smtp_resp) || $smtp_resp eq '') {
+ $resp_shortmsg = 'No resp. to '.$cmd_name;
+ } elsif ($smtp_resp !~ /^[245]\d{2}/) {
+ $resp_shortmsg = 'Bad resp. to '.$cmd_name;
+ } elsif ($smtp_resp =~ /^ (\d{3}) [ \t]+ ([245] \. \d{1,3} \. \d{1,3})?
+ \s* (.*) \z/xs) {
+ ($resp_code, $resp_enhcode, $resp_msg) = ($1, $2, $3);
+ my($c) = substr($resp_code,0,1);
+ if ($resp_enhcode eq '' && $resp_code =~ /^[245]/)
+ { $resp_enhcode = $dflt_enhcode; $resp_enhcode =~ s/^\d*/$c/ }
+ $resp_shortmsg = $c eq '2' ? 'Ok' : $c eq '4' ? 'TempFailed' : 'Failed';
+ }
+ sprintf("%s %s %s, id=%s, from MTA(%s): %s",
+ $resp_code, $resp_enhcode, $resp_shortmsg,
+ $am_id, $mta_id, $smtp_resp);
}
@@ -16550,5 +16554,5 @@
map {$_->recip_final_addr} @per_recip_data) ));
my($msg) = $msginfo->mail_text; # a file handle or a MIME::Entity object
- my($smtp_session, $smtp_handle, $smtp_resp);
+ my($smtp_session, $smtp_handle, $smtp_resp, $smtp_response);
my($any_valid_recips) = 0; my($any_tempfail_recips) = 0; my($pipelining) = 0;
my($any_valid_recips_and_data_sent) = 0; my($in_datasend_mode) = 0;
@@ -16677,13 +16681,11 @@
do_log($ok?3:1, "smtp resp to MAIL: %s", $smtp_resp);
if (!$ok) {
- $smtp_resp =
- sprintf("451 4.5.0 %s resp. to MAIL FROM, id=%s, from MTA(%s): %s",
- $smtp_resp eq '' ? 'No' : 'Invalid', $am_id,$mta_id,$smtp_resp)
- if $smtp_resp !~ /^[245]\d{2}/;
+ my($smtp_resp_ext) = enhance_smtp_response($smtp_resp,$am_id,$mta_id,
+ '.1.0','MAIL FROM');
for my $r (@per_recip_data) {
next if $r->recip_done;
$r->recip_remote_mta($relayhost);
$r->recip_remote_mta_smtp_response($smtp_resp);
- $r->recip_smtp_response($smtp_resp); $r->recip_done(2);
+ $r->recip_smtp_response($smtp_resp_ext); $r->recip_done(2);
}
}
@@ -16729,19 +16731,17 @@
$r->recip_remote_mta($relayhost);
$r->recip_remote_mta_smtp_response($smtp_resp);
- $smtp_resp = enhance_rcpt_smtp_response($smtp_resp,$am_id,$mta_id);
- $r->recip_smtp_response($smtp_resp); # preliminary response
+ my($smtp_resp_ext) = enhance_smtp_response($smtp_resp,$am_id,$mta_id,
+ '.1.0','RCPT TO');
+ $r->recip_smtp_response($smtp_resp_ext); # preliminary response
my($ok) = $smtp_resp =~ /^2/;
do_log($ok?3:1, "smtp resp to RCPT (%s): %s", $raddr,$smtp_resp);
if ($ok) { $any_valid_recips++ }
else {
- $smtp_resp =
- sprintf("451 4.5.0 %s resp. to RCPT TO, id=%s, from MTA(%s): %s",
- $smtp_resp eq '' ? 'No' : 'Invalid', $am_id,$mta_id,$smtp_resp)
- if $smtp_resp !~ /^[245]\d{2}/;
if ($smtp_resp =~ /^452/) { # too many recipients - see rfc2821
do_log(-1, 'Only %d recips sent in one go: "%s"',
$any_valid_recips, $smtp_resp)
if !defined($skipping_resp);
- $skipping_resp = $smtp_resp;
+ $skipping_resp = enhance_smtp_response($smtp_resp,$am_id,$mta_id,
+ '.5.3','RCPT TO');
} elsif ($smtp_resp =~ /^4/) { $any_tempfail_recips++ }
$r->recip_done(2); # got a negative response to RCPT TO
@@ -16782,13 +16782,11 @@
do_log($ok?3:1, "smtp resp to MAIL (pip): %s", $smtp_resp);
if (!$ok) {
- $smtp_resp =
- sprintf("451 4.5.0 %s resp. to MAIL FROM, id=%s, from MTA(%s): %s",
- $smtp_resp eq '' ? 'No' : 'Invalid', $am_id,$mta_id,$smtp_resp)
- if $smtp_resp !~ /^[245]\d{2}/;
+ my($smtp_resp_ext) = enhance_smtp_response($smtp_resp,$am_id,$mta_id,
+ '.1.0','MAIL FROM');
for my $r (@per_recip_data) {
next if $r->recip_done;
$r->recip_remote_mta($relayhost);
$r->recip_remote_mta_smtp_response($smtp_resp);
- $r->recip_smtp_response($smtp_resp); $r->recip_done(2);
+ $r->recip_smtp_response($smtp_resp_ext); $r->recip_done(2);
}
}
@@ -16801,5 +16799,4 @@
$smtp_resp = $smtp_session->smtp_response; $fetched_rcpt_resp = 1;
$smtp_resp = '' if !defined $smtp_resp;
- $smtp_resp = enhance_rcpt_smtp_response($smtp_resp,$am_id,$mta_id);
my($raddr) = qquote_rfc2821_local($r->recip_final_addr);
my($ok) = $smtp_resp =~ /^2/;
@@ -16809,15 +16806,14 @@
$r->recip_remote_mta($relayhost);
$r->recip_remote_mta_smtp_response($smtp_resp);
- $r->recip_smtp_response($smtp_resp); # preliminary response
+ my($smtp_resp_ext) = enhance_smtp_response($smtp_resp,$am_id,$mta_id,
+ '.1.0','RCPT TO');
+ $r->recip_smtp_response($smtp_resp_ext); # preliminary response
if ($ok) { $any_valid_recips++ }
else {
- $smtp_resp =
- sprintf("451 4.5.0 %s resp. to RCPT TO, id=%s, from MTA(%s): %s",
- $smtp_resp eq '' ? 'No' : 'Invalid', $am_id,$mta_id,$smtp_resp)
- if $smtp_resp !~ /^[245]\d{2}/;
if ($smtp_resp =~ /^452/) { # too many recipients - see rfc2821
do_log(-1, 'Only %d recips sent in one go: "%s"',
$any_valid_recips, $smtp_resp);
- $skipping_resp = $smtp_resp;
+ $skipping_resp = enhance_smtp_response($smtp_resp,$am_id,$mta_id,
+ '.5.3','RCPT TO');
} elsif ($smtp_resp =~ /^4/) { $any_tempfail_recips++ }
$r->recip_done(2); # got a negative response to RCPT TO
@@ -16912,13 +16908,12 @@
$smtp_resp=~/^2/ or do_log(0,"Negative SMTP response to %s (%s): %s",
$what_cmd,$raddr,$smtp_resp);
- $smtp_resp =
- sprintf("451 4.5.0 %s resp. to data-dot, id=%s, from MTA(%s): %s",
- $smtp_resp eq '' ? 'No' : 'Invalid', $am_id,$mta_id,$smtp_resp)
- if $smtp_resp !~ /^[245]\d{2}/;
}
next if $r->recip_done; # skip those that failed at earlier stages
$r->recip_remote_mta($relayhost);
$r->recip_remote_mta_smtp_response($smtp_resp);
- $r->recip_smtp_response($smtp_resp); $r->recip_done(2);
+ my($smtp_resp_ext) = enhance_smtp_response($smtp_resp,$am_id,$mta_id,
+ '.6.0','data-dot');
+ $smtp_response = $smtp_resp_ext if !defined($smtp_response);
+ $r->recip_smtp_response($smtp_resp_ext); $r->recip_done(2);
$r->recip_mbxname($r->recip_final_addr) if $smtp_resp =~ /^2/;
}
@@ -16980,5 +16975,4 @@
undef $smtp_handle; undef $smtp_session;
# prepare final smtp response and log abnormal events
- my($smtp_response);
for my $r (@per_recip_data) {
my($resp) = $r->recip_smtp_response;
@@ -16987,16 +16981,6 @@
$resp !~ /^2/ && $smtp_response !~ /^[45]/;
}
- if ($err eq '') { # no errors
- local($1,$2);
- if ($smtp_response !~ /^[245]\d{2}/) {
- $smtp_response =
- sprintf("451 4.5.0 Bad SMTP code, id=%s, from MTA(%s): %s",
- $am_id, $mta_id, $smtp_response);
- } elsif ($smtp_response =~ /^((\d)\d{2})/) {
- my($smtp_code,$smtp_status) = ($1,$2);
- $smtp_response = sprintf("%s %d.6.0 %s, id=%s, from MTA(%s): %s",
- $smtp_code, $smtp_status, ($smtp_status == 2 ? 'Ok' : 'Failed'),
- $am_id, $mta_id, $smtp_response);
- }
+ if ($err eq '') {
+ # no errors
} elsif ($err =~ /^timed out\b/ || $err =~ /: Timeout\z/) {
$smtp_response = sprintf("450 4.4.2 Timed out during %s, MTA(%s), id=%s",
Mark
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
AMaViS-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/amavis-user
AMaViS-FAQ:http://www.amavis.org/amavis-faq.php3
AMaViS-HowTos:http://www.amavis.org/howto/