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