diff options
-rw-r--r-- | _smtpd | 27 |
1 files changed, 16 insertions, 11 deletions
@@ -2,19 +2,22 @@ use strict; use Getopt::Std; -use vars qw(%aliases $opt_d $opt_a); +use vars qw(%aliases $opt_a); use subs qw(validate_recipient process_message read_aliases); use Net::Server::Mail::ESMTP; +use IPC::Run qw( run ); +use Sys::Syslog; -getopt('a:'); +getopt('a:v'); my $smtp = new Net::Server::Mail::ESMTP; $smtp->set_callback(RCPT => \&validate_recipient); $smtp->set_callback(DATA => \&process_message); +openlog('[_smtpd]', '', 'mail'); read_aliases; $smtp->process; - +closelog(); #-- sub validate_recipient { @@ -34,19 +37,21 @@ sub process_message { return(0, 554, 'Error: no valid recipients') unless(@recipients); + syslog('info', + 'received '.length($$data).' bytes for '.join(',', @recipients) + ); foreach my $recipient ( @recipients ) { $recipient =~ s/^<//; $recipient =~ s/\@.*$//; - open(PIPE, '|'.$aliases{$recipient}) - or return(0, 451, "Can't fork: $!" ); - print PIPE $$data - or return(0, 451, "Can't write to pipe: $!" ); - close PIPE - or return(0, 451, "Can't close: status=$?" ); - + my $result = eval { run $aliases{$recipient}, $data }; + if (!$result) { + syslog('info', "pipe command failed: $@"); + return(0, 451, "pipe command failed: $@"); + } } + syslog('info', 'message piped'); return(1, 250, 'message piped'); } @@ -62,7 +67,7 @@ sub read_aliases { next if /^$/ or /^#/; /^([\w\-\+\.]+):\s*("?)\|(.*)\2\s*$/ or next; #$aliases{$1} = [ split(/\s+/, $3) ]; - $aliases{$1} = $3; + $aliases{$1} = [ qw(/bin/sh -c), $3 ]; } } |