polyze/Polyze/RRejectRCPT.pm

73 lines
2.0 KiB
Perl

package Polyze::RRejectRCPT;
use Moose;
with 'Polyze::RReject';
sub _build_sender_domain {
my ($self) = @_;
my ($domain) = ($self->text =~ m/ RCPT from ([^[]+)?\[/);
return $domain;
}
sub _build_sender_ip {
my ($self) = @_;
my ($ip) = ($self->text =~ m/ RCPT from (?:[^[]+)?\[([^]]+)\]/);
return $ip;
}
# Regexes for identifying the rejection reason.
my $RegGreylist =
qr[rejected: Greylisted, see http://postgrey.schweikert.ch];
my $RegReverseDNS =
qr[Client host rejected: cannot find your reverse hostname];
my $RegBlocked = qr[
# Designed to capture a string like "zen.spamhaus.org".
postfix/postscreen\b.+
\ Service\ unavailable;\ client\ .+
\ blocked\ using\ ([^[:space:];]+)
]x;
my $RegRelay = qr[Relay access denied;];
# For postfix's recipient address rejections, e.g. 'User unknown',
# 'undeliverable address' or rejected via check_recipient_access.
my $RegCheckRecipient = qr[: Recipient address rejected: ([^:;]+).*; from=<];
my $RegProtocolErr = qr[ Protocol error; from=<];
# For postfix's reject_unknown_sender_domain.
my $RegSenderAddress = qr[: (Sender address rejected: .+); from=<];
# For postfix's reject_non_fqdn_helo_hostname.
my $RegHelo = qr[: (Helo command rejected: .+); from=<];
sub _build_reason {
my ($self) = @_;
my $t = $self->text;
return do {
if ($t =~ $RegGreylist)
{ "Greylist"; }
elsif ($t =~ $RegReverseDNS)
{ "No reverse DNS"; }
elsif (my ($blocker) = $t =~ $RegBlocked)
{ $blocker; }
elsif ($t =~ $RegRelay)
{ "Relay access denied"; }
elsif (my ($recipient_defect) = $t =~ $RegCheckRecipient)
{ $recipient_defect; }
elsif ($t =~ $RegProtocolErr)
{ "Protocol error"; }
elsif (my ($sender_defect) = $t =~ $RegSenderAddress)
{ $sender_defect; }
elsif (my ($helo_defect) = $t =~ $RegHelo)
{ $helo_defect; }
else
{ "Other"; }
};
}
no Moose;
__PACKAGE__->meta->make_immutable;