diff options
Diffstat (limited to 'rt/lib/RT/Action')
-rwxr-xr-x | rt/lib/RT/Action/SendEmail.pm | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/rt/lib/RT/Action/SendEmail.pm b/rt/lib/RT/Action/SendEmail.pm index 431b97c75..1ebcb0ccd 100755 --- a/rt/lib/RT/Action/SendEmail.pm +++ b/rt/lib/RT/Action/SendEmail.pm @@ -253,12 +253,28 @@ sub SendMessage { if ( $RT::MailCommand eq 'sendmailpipe' ) { eval { - open( my $mail, "|$RT::SendmailPath $RT::SendmailArguments" ) || die $!; + # don't ignore CHLD signal to get proper exit code + local $SIG{'CHLD'} = 'DEFAULT'; + + my $mail; + unless( open $mail, "|$RT::SendmailPath $RT::SendmailArguments" ) { + die "Couldn't run $RT::SendmailPath: $!"; + } + + # if something wrong with $mail->print we will get PIPE signal, handle it + local $SIG{'PIPE'} = sub { die "$RT::SendmailPath closed pipe" }; $MIMEObj->print($mail); - close($mail); + + unless ( close $mail ) { + die "Close failed: $!" if $!; # system error + # sendmail exit statuses mostly errors with data not software + # TODO: status parsing: core dump, exit on signal or EX_* + $RT::Logger->warning( "$RT::SendmailPath exitted with status $?" ); + } }; if ($@) { - $RT::Logger->crit( $msgid . "Could not send mail. -" . $@ ); + $RT::Logger->crit( $msgid . "Could not send mail: " . $@ ); + return 0; } } else { @@ -284,13 +300,12 @@ sub SendMessage { } } - my $success = - ( $msgid - . " sent To: " - . $MIMEObj->head->get('To') . " Cc: " - . $MIMEObj->head->get('Cc') . " Bcc: " - . $MIMEObj->head->get('Bcc') ); - $success =~ s/\n//gi; + my $success = "$msgid sent"; + foreach (qw(To Cc Bcc)) { + next unless my $addresses = $MIMEObj->head->get($_); + $success .= " $_: ". $addresses; + } + $success =~ s/\n//g; $self->RecordOutgoingMailTransaction($MIMEObj) if ($RT::RecordOutgoingEmail); |