martedì 29 giugno 2010

How to write Spamassassin plugin - part 2

Come promesso eccoci al secondo e ultimo appuntamento di questa serie.
Precisiamo subito che semplici regole possono essere scritte direttamente all'interno dei file di configurazione. All'interno dei plugin vanno messe regole più complesse o che si basano su dati che cambiano frequentemente.

Per prima cosa bisogna ereditare dalla classe base Plugin
package Mail::SpamAssassin::Plugin::MyPlugin;
use Mail::SpamAssassin::Plugin;
use DBI;
our @ISA = qw(Mail::SpamAssassin::Plugin);

sub new {
my ($class, $mailsa) = @_;

# the usual perlobj boilerplate to create a subclass object
$class = ref($class) || $class;
my $self = $class->SUPER::new($mailsa);
bless ($self, $class);

# add rule
$self->register_eval_rule ("check_myplugin_header");

return $self;
}

1;

In questo modo abbiamo registrato la nuova regola già definita all'interno del file di configurazione.

A questo punto bisogna dare corpo alla nuova regola che vogliamo introdurre nel tool.
Nel frammento di codice sopra abbiamo importanto anche le librerie DBI che ci consentono di interrogare il database con un comodo Object Model.

Facciamo un esempio di implementazione di una regola basata su DB.
sub check_myplugin_header
{

my ($self, $pms) = @_;

# Extract desidered informations from mail header
$head = $pms->get('CustomHeader');

$result = 0;
study;

chomp($head);
$head =~ s/;//;

$dbh = DBI->connect("dbi:mysql:spamassassindb","user","pass");


if(!defined $dbh)
{
die "Connessione al database non riuscita: $DBI::errstrn";
}

$query = "SELECT count(accepted_headers) FROM headers WHERE accepted_headers = $head";

# Insert query into database instructions
$sth = $dbh->prepare($query);

# Database query execution
$sth->execute;

$count = $sth->fetchrow();


if($count eq 0)
{
# Report error
$result = 1;
}

# Disconnect from database
$dbh->disconnect();

return $result;
}

Questo frammento di codice è piuttosto semplice e fa una query al db, tramite DBI, dopo aver bonificato la stringa da passare.
Una cosa sicuramente da notare è il paramtro $pms che consente di accedere a tutti gli headers della mail.
Forniamo allora questo messaggio
From god@heaven.com  Thu Jun 17 21:33:41 2010
Return-Path: <god@heaven.com>
X-Original-To: account@post-server
Delivered-To: account@post-server
Received: from post-server (host [127.0.0.1])
by post-server (Postfix) with SMTP id B66E9424F5
for <account@post-server>; Thu, 30 Jun 2010 21:33:20 +0200 (CEST)
CustomHeader:blablabla
Subject:Try this

Simple mail to test my plugin.

a spamassassin e avremo due comportamenti diversi:
  • Se la stringa "blablabla" è contenuta nel database la regola non andrà ad aggiungere i punti definiti nel file di configurazione (2.0 dal post precedente)
  • Se la stringa "blablabla" non è contenuta allora la regola avrà un hit che sommerà 2 punti allo score totale. In questo secondo caso se questo punteggio fa superare la soglia (definita sempre nei vari file di configurazione) allora il messaggio verrà identificato come SPAM!!!


È un argomento piuttosto vasto che richiede tempo per essere assimilato. Questo è solo un input che vuole stimolare interesse. Spero di essere stato chiaro e sono a disposizione per un help in linea, per quanto posso fare.

Have fun ;)
Posta un commento