#!/usr/bin/perl use warnings; use strict; use IO::Socket::INET; use Net::Server::Mail::SMTP; #our $host = $ARGV[0] || "157.163.168.131" ; $| = 1; my @local_domains = qw(example.com example.org); my $server = IO::Socket::INET->new(Listen => 1, LocalPort => 25); print "Waiting for incoming SMTP connections\n"; my $conn; while($conn = $server->accept) { my $smtp = Net::Server::Mail::SMTP->new(socket => $conn); $smtp->set_callback(RCPT => \&validate_recipient); $smtp->set_callback(DATA => \&queue_message); $smtp->process() or die $!; $conn->close(); } sub validate_recipient { my($session, $recipient) = @_; my $domain; if($recipient =~ /@(.*)>\s*$/) { $domain = $1; } if(not defined $domain) { return(0, 513, 'Syntax error.'); } elsif(not(grep $domain eq $_, @local_domains)) { return(0, 554, "$recipient: Recipient address rejected: Relay access denied"); } return(1); } sub queue_message { my($session, $data) = @_; my $sender = $session->get_sender(); my @recipients = $session->get_recipients(); return(0, 554, 'Error: no valid recipients') unless(@recipients); my $msgid = add_queue($sender, \@recipients, $data) or return(0); return(1, 250, "message queued $msgid"); }