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 {
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');
}
next if /^$/ or /^#/;
/^([\w\-\+\.]+):\s*("?)\|(.*)\2\s*$/ or next;
#$aliases{$1} = [ split(/\s+/, $3) ];
- $aliases{$1} = $3;
+ $aliases{$1} = [ qw(/bin/sh -c), $3 ];
}
}