=head1 NAME
RelayCountry - add message metadata indicating the country code of each relay
=head1 SYNOPSIS
loadplugin Mail::SpamAssassin::Plugin::RelayCountry
=head1 DESCRIPTION
By the RelayCountry plugin attempts to determine the domain country
codes of each relay used in the delivery path of messages and add that
information to the message metadata as "X-Relay-Countries", or
the C<_RELAYCOUNTRY_> header markup.
=head1 REQUIREMENT
This plugin requires the IP::Country module from CPAN.
=cut
package Mail::SpamAssassin::Plugin::RelayCountry;
use Mail::SpamAssassin::Plugin;
use Mail::SpamAssassin::Logger;
use strict;
use warnings;
use bytes;
use vars qw(@ISA);
@ISA = qw(Mail::SpamAssassin::Plugin);
sub new {
my $class = shift;
my $mailsaobject = shift;
$class = ref($class) || $class;
my $self = $class->SUPER::new($mailsaobject);
bless ($self, $class);
return $self;
}
sub extract_metadata {
my ($self, $opts) = @_;
my $reg;
eval {
require IP::Country::Fast;
$reg = IP::Country::Fast->new();
};
if ($@) {
dbg("metadata: failed to load 'IP::Country::Fast', skipping ($@)");
return 1;
}
my $msg = $opts->{msg};
my $countries = '';
foreach my $relay (@{$msg->{metadata}->{relays_untrusted}}) {
my $ip = $relay->{ip};
my $cc = $reg->inet_atocc($ip) || "XX";
$countries .= $cc." ";
}
chop $countries;
$msg->put_metadata("X-Relay-Countries", $countries);
dbg("metadata: X-Relay-Countries: $countries");
return 1;
}
sub parsed_metadata {
my ($self, $opts) = @_;
$opts->{permsgstatus}->set_tag ("RELAYCOUNTRY",
$opts->{permsgstatus}->get_message->get_metadata('X-Relay-Countries'));
return 1;
}
1;