#!/usr/bin/perl -w use strict; $|++; my %montonum = ( Jan => 1, Feb => 2, Mar => 3, Apr => 4, May => 5, Jun => 6, Jul => 7, Aug => 8, Sep => 9, Oct => 10, Nov => 11, Dec => 12 ); $/=""; # paragraph format while( defined($_=<>) ) { my($hits,$rules,$mid,$date); next unless /^From /; if (/^X-Spam-Status:/im) { my($status) = /^(X-Spam-Status:.+\n(?:\s+.+\n)*)/im; $status =~ s/\n\t+\s+//g; # unfold large sections $status =~ s/\n\t+/ /g; # unfold everything else ($hits,$rules) = ($status=~/\bhits=(\S+).+?\btests=(\S+)/); } else { ($hits,$rules) = (0,''); } my($messageid) = /^(Message-Id:.+\n(?:\s+.+\n)*)/im; $messageid =~ s/\n\s+/ /g; ($mid) = ($messageid=~/^Message-id:\s* ]+)>?\s*$/i); my($received) = /^(Received:.+\n(?:\s+.+\n)*)/im; $received =~ s/\n\s+/ /g; # ; Sun, 31 Mar 2002 23:44:05 -0500 my($d,$m,$y,$t) = ($received=~/;\s+\w+,\s+(\d+)\s+(\w+)\s+(\d+)\s+([0-9:]+)/); $date=sprintf "%04d-%02d-%02d %s",$y,$montonum{$m},$d,$t; show_stats($date,$hits,$mid,$rules); } sub show_stats { my($date,$hits,$mid,$rules) = @_; if ( defined $date && defined $hits && defined $rules ) { print join("\t",$date,$hits,$rules),"\n"; } }