04f2e4ee73
git-svn-id: https://svn.perl.org/qpsmtpd/trunk@160 958fd67b-6ff1-0310-b445-bb7760255be9
62 lines
1.3 KiB
Plaintext
62 lines
1.3 KiB
Plaintext
|
|
=head1 NAME
|
|
|
|
SPF - plugin to implement Sender Permitted From
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
# in config/plugins
|
|
sender_permitted_from
|
|
|
|
=cut
|
|
|
|
use Mail::SPF::Query;
|
|
|
|
sub register {
|
|
my ($self, $qp) = @_;
|
|
$self->register_hook("mail", "mail_handler");
|
|
$self->register_hook("rcpt", "rcpt_handler");
|
|
}
|
|
|
|
sub mail_handler {
|
|
my ($self, $transaction, $sender) = @_;
|
|
|
|
return (DECLINED) unless ($sender->format ne "<>"
|
|
and $sender->host && $sender->user);
|
|
|
|
my $host = lc $sender->host;
|
|
my $from = $sender->user . '@' . $host;
|
|
|
|
my $ip = $self->qp->connection->remote_ip;
|
|
my $query = Mail::SPF::Query->new(ip => $ip, sender => $from)
|
|
|| die "Couldn't construct Mail::SPF::Query object";
|
|
$transaction->notes('spfquery', $query);
|
|
|
|
return (DECLINED);
|
|
}
|
|
|
|
sub rcpt_handler {
|
|
my ($self, $transaction, $rcpt) = @_;
|
|
my $query = $transaction->notes('spfquery');
|
|
my ($result, $comment) = $query->result();
|
|
|
|
if ($result eq "pass") {
|
|
# domain is not forged
|
|
$self->qp->connection->notes('spf_ok', 1);
|
|
}
|
|
elsif ($result eq "deny") {
|
|
# domain is forged
|
|
return (DENY, "SPF forgery ($comment)");
|
|
}
|
|
elsif ($result eq "softdeny") {
|
|
# domain may be forged
|
|
$self->qp->connection->notes('spf_ok', 0);
|
|
}
|
|
else {
|
|
# domain has not implemented SPF
|
|
}
|
|
|
|
return (DECLINED);
|
|
}
|
|
|