AnyEvent-SMTP
view release on metacpan or search on metacpan
lib/AnyEvent/SMTP/Server.pm view on Meta::CPAN
my $mail = shift;
warn "Received mail from $mail->{from} to $mail->{to}\n$mail->{data}\n";
};
# or
use AnyEvent::SMTP::Server;
my $server = AnyEvent::SMTP::Server->new(
port => 2525,
mail_validate => sub {
my ($m,$addr) = @_;
if ($good) { return 1 } else { return 0, 513, 'Bad sender.' }
},
rcpt_validate => sub {
my ($m,$addr) = @_;
if ($good) { return 1 } else { return 0, 513, 'Bad recipient.' }
},
data_validate => sub {
my ($m,$data) = @_;
my $size = length $data;
if ($size > $max_email_size) {
return 0, 552, 'REJECTED: message size limit exceeded';
} else {
return 1;
}
},
);
lib/AnyEvent/SMTP/Server.pm view on Meta::CPAN
my $from = join ' ',@args;
$from =~ s{^from:}{}i or return $con->reply('501 Usage: MAIL FROM:<mail addr>');
$con->{helo} or return $con->reply("503 Error: send HELO/EHLO first");
my @addrs;
if ($from !~ /^\s*<>\s*$/) {
@addrs = map { $_->address } Mail::Address->parse($from);
@addrs == 1 or return $con->reply('501 Usage: MAIL FROM:<mail addr>');
} else {
@addrs = ('');
}
if ($self->{mail_validate}) {
my ($res,$err,$errstr) = $self->{mail_validate}->($con->{m}, $addrs[0]);
$res or return $con->reply("$err $errstr");
}
$con->{m}{from} = $addrs[0];
$con->ok;
},
RCPT => sub {
my ($s,$con,@args) = @_;
my $to = join ' ',@args;
$to =~ s{^to:}{}i or return $con->reply('501 Usage: RCPT TO:<mail addr>');
defined $con->{m}{from} or return $con->reply("503 Error: need MAIL command");
my @addrs = map { $_->address } Mail::Address->parse($to);
@addrs or return $con->reply('501 Usage: RCPT TO:<mail addr>');
if ($self->{rcpt_validate}) {
my ($res,$err,$errstr) = $self->{rcpt_validate}->($con->{m}, $addrs[0]);
$res or return $con->reply("$err $errstr");
}
push @{ $con->{m}{to} ||= [] }, $addrs[0];
$con->ok;
},
DATA => sub {
my ($s,$con) = @_;
defined $con->{m}{from} or return $con->reply("503 Error: need MAIL command");
$con->{m}{to} or return $con->reply("554 Error: need RCPT command");
$con->reply("354 End data with <CR><LF>.<CR><LF>");
$con->data(cb => sub {
my $data = shift;
if ($self->{data_validate}) {
my ($res,$err,$errstr) = $self->{data_validate}->($con->{m}, $data);
$res or return $con->reply("$err $errstr");
}
$con->{m}{data} = $data;
local $s->{event_failed} = 0;
local $s->{current_con} = $con;
$s->event( mail => delete $con->{m} );
if ($s->{event_failed}) {
$con->reply("500 Internal Server Error");
} else {
$con->ok("I'll take it");
( run in 0.234 second using v1.01-cache-2.11-cpan-4d50c553e7e )