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/

Reply via email to