> Why does smtp-forward not adopt to the 550 from the internal mailserver?

I made a patch to address this problem in the "rcpt to" stage. Multi-recipient mails with one failing recipient will be a problem here I suppose.

Regards,
Bjoern

--- smtp-forward.ORIG   2008-11-07 23:51:55.227844437 +0100
+++ smtp-forward        2008-11-08 10:35:02.489966487 +0100
@@ -52,18 +52,34 @@
                             Timeout => 60,
                             Hello => $self->qp->config("me"),
                            ) || die $!;
-  $smtp->mail( $transaction->sender->address || "" ) or return(DECLINED, 
"Unable to queue message ($!)");
+  $smtp->mail( $transaction->sender->address || "" ) or return(DECLINED, 
"Unable to queue message:", mkmsg($smtp));
   for ($transaction->recipients) {
-    $smtp->to($_->address) or return(DECLINED, "Unable to queue message ($!)");
+    unless ($smtp->to($_->address)) {
+       if ($smtp->code =~ /^4/) { return(DECLINED, "Unable to queue message:", 
mkmsg($smtp)); }
+       elsif ($smtp->code =~ /^5/) { return(DENY, "Fatal error, unable to 
queue message:", mkmsg($smtp)); }
+       else { return(DECLINED, "Unable to queue message:", mkmsg($smtp)); }
+    }
   }
-  $smtp->data() or return(DECLINED, "Unable to queue message ($!)");
-  $smtp->datasend($transaction->header->as_string) or return(DECLINED, "Unable 
to queue message ($!)");
+  $smtp->data() or return(DECLINED, "Unable to queue message:", mkmsg($smtp));
+  $smtp->datasend($transaction->header->as_string) or return(DECLINED, "Unable 
to queue message:", mkmsg($smtp));
   $transaction->body_resetpos;
   while (my $line = $transaction->body_getline) {
-    $smtp->datasend($line) or return(DECLINED, "Unable to queue message ($!)");
+    $smtp->datasend($line) or return(DECLINED, "Unable to queue message:", 
mkmsg($smtp));
   }
-  $smtp->dataend() or return(DECLINED, "Unable to queue message ($!)");
-  $smtp->quit() or return(DECLINED, "Unable to queue message ($!)");
+  $smtp->dataend() or return(DECLINED, "Unable to queue message:", 
mkmsg($smtp));
+  $smtp->quit() or return(DECLINED, "Unable to queue message:", mkmsg($smtp));
   $self->log(LOGINFO, "finished queueing");
   return (OK, "Queued!");
 }
+
+sub mkmsg {
+    my ($smtp) = @_;
+    my $code = $smtp->code;
+    my @messages = split(/\n/, $smtp->message);
+    my @outmsg;
+    while (my $msg = shift @messages) {
+       my $line = $code . (@messages?"-":" ").$msg;
+       push @outmsg, $line;
+    }
+    return @outmsg;
+}

Reply via email to