# NOTE: We Could Write A Log Of Outgoing Email So That People Would Know If Their Stuff Went Out # Have to set RES_NAMESERVERS env to DNS server first # This Version Of The Relayer Forks To Handle Multiple Connections use strict; use Carp; use Net::SMTP::Server; use Net::SMTP::Server::Client3; use Net::SMTP_auth; use File::Temp qw/ tempfile tempdir /; # Server Code # Globals my $server = undef; my $conn = undef; # Create Temp Mail Directory For MIME files sent to this "SERVER" if (not -d ".\\MailToBeSent") { mkdir ".\\MailToBeSent"; } $server = new Net::SMTP::Server('192.168.10.68', 25) || croak("Unable to handle client connection: $!\n"); while($conn = $server->accept()) { fork and last; $conn->close; }; # End Server Code # Client Code print "Client Thread Started\n"; # Store Mail In Temp File (Otherwise Bad Things Happen ;-)) my ($fh, $filename) = tempfile(TEMPLATE => 'tempXXXXX',DIR => '.\MailToBeSent',SUFFIX => '.dat'); my $client = new Net::SMTP::Server::Client3($conn,$fh) || croak("Unable to handle client: $!\n"); $client->greet; # this is new while($client->get_message){ # this is different my $smtp = undef; my $to = ""; my $line = ""; print "Sending Message\n"; # Send Confirmation Of Receipt To The Sender $client->okay("message saved for relay"); # this is new $client->_quit(); # Relay With Perl Module Net::SMTP_auth to Mail Street Or usmail.betalasermike.com $smtp = Net::SMTP_auth->new( Host => 'hostname', Hello => 'server.com', Timeout => 30, ); # Could add a Debug => 1, directive to get debug statements $smtp->auth('NTLM', 'user', 'pass'); $smtp->mail('username@server.com'); # Could Paste The $client->{FROM} Into The Body (Or Subject) # Add To Lines foreach $to (@{$client->{TO}}) { print "TO: $to\n"; $smtp->to($to); } $smtp->data(); open(IN,$filename); binmode(IN); while ($line = ) { $smtp->datasend($line); } close(IN); $smtp->dataend(); $smtp->quit; print "Message Sent\n"; # End Relay With Perl Module Net::SMTP_auth close($fh); if (-e $filename) { unlink $filename; } } print "Client Thread Closing\n"; # Cleanup exit; # End Client Code