62 lines
2.2 KiB
Perl
62 lines
2.2 KiB
Perl
#!perl -w
|
|
=head1 NAME
|
|
|
|
forcespamcheck - SpamAssassin integration for qpsmtpd
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Plugin that forces check if the mail is spam by using the "spamd" daemon
|
|
from the SpamAssassin package. F<http://www.spamassassin.org>
|
|
|
|
=head1 CONFIG
|
|
This plugins needs spamassassin like arguments
|
|
Refer to spamassassin plugin
|
|
|
|
On top of that it uses a config file with an ip per line corresponding of
|
|
local_ip of the qpsmtpd server on which the remote client is trying to deliver
|
|
the mail. Please be cautious this is not the remote client ip !
|
|
THe initial idea is to force spam check for some deamons by making them
|
|
sending to 127.0.0.200:25 so other daemons trying to deliver on 127.0.0.1:25
|
|
or LAN client delivering on 192.168.0.1:25 will avoid the spam check, unless you
|
|
also specify those ips in forcespamcheck file.
|
|
|
|
=cut
|
|
|
|
use strict;
|
|
use warnings;
|
|
use Qpsmtpd::Constants;
|
|
use Qpsmtpd::DSN;
|
|
use Socket qw(:DEFAULT :crlf);
|
|
use IO::Handle;
|
|
|
|
sub register {
|
|
my ($self, $qp, %args) = @_;
|
|
$self->log(LOGERROR, "Bad parameters for the forcespamcheck plugin")
|
|
if @_ % 2;
|
|
#first if spamassassin already loaded return DECLINED; not to load it twice
|
|
my @datahooked = $qp->hooks('data_post');
|
|
for my $item (@datahooked) {
|
|
$self->log(LOGNOTICE,"spamassassin aleady loaded") if $item->{name} eq "spamassassin";
|
|
return DECLINED if $item->{name} eq "spamassassin";
|
|
}
|
|
# else we can go on
|
|
my $param = join(q{ }, map{qq{$_ $args{$_}}} keys %args);
|
|
my $ip = $self->qp->connection->local_ip;
|
|
# read here list of ip from file; or default on 127.0.0.200
|
|
my %forcespamcheck = map { $_ => 1 } $self->qp->config('forcespamcheck');
|
|
# we force spamcheck on 127.0.0.200 as used by fetchmail
|
|
$forcespamcheck{'127.0.0.200'} = 1;
|
|
return DECLINED unless (exists $forcespamcheck{$ip});
|
|
my $plugin_line = "spamassassin " . $param;
|
|
my $this_plugin = $self->qp->_load_plugin($plugin_line, $self->qp->plugin_dirs);
|
|
$self->register_hook('data', 'data_handler');
|
|
}
|
|
|
|
sub data_handler {
|
|
my ($self, $transaction) = @_;
|
|
my $ip = $self->qp->connection->local_ip;
|
|
# logged only there to avoid double line in log in register.
|
|
$self->log(LOGINFO,
|
|
"forcing spamassassin check for connection on $ip");
|
|
}
|