--- disspam_orig.pl 2007-08-01 10:11:59.000000000 -0700 +++ disspam.pl 2007-08-21 10:36:24.000000000 -0700 @@ -16,7 +16,17 @@ use Net::POP3; use vars qw($VERSION $CONFFILENAME %RBL %MAILBOX $SENDMAIL $SMARTRELAY $DATAFILE $PIDFILE %HEADERHASHES $SPAMASSASSIN $SAOBJECT); +use vars qw($num_msg $num_new_checked $num_deleted $num_spam $my_vers $start_time); +use Shell; +$num_msg = 0; +$num_new_checked = 0; +$num_deleted = 0; +$num_spam = 0; +$start_time = time; + $VERSION = '0.14'; +$my_vers = '.6'; +$VERSION = $VERSION . $my_vers; print "\nThis is DisSpam version $VERSION. The time is now ", scalar localtime(time), "\n\n"; @@ -33,6 +43,8 @@ deletepidfile(); +endstamp(); + # # This sub is the main loop. It loops through all the mailboxes defined in hash %MAILBOX # , checks them for spam, and does whatever's appropriate if spam's found (backup to @@ -102,19 +114,32 @@ foreach $message_number (keys %{$messages}) { undef $headers; undef $message; + $num_msg++; if ($SPAMASSASSIN) { - - # - # We need the entire message for spamassassin - # - print "\tRETRIEVING ENTIRE MESSAGE\n"; - $message = $pop->get($message_number); - if (!$message) { - print "\tERROR: FAILED TO RETRIEVE MESSAGE $message_number [$!] [$@]: SKIPPING\n"; - next; - } - $message = join("", @$message); - ($headers) = split(/\n\n/, $message); + # + # First check to see if message is in hash + # + print "\tRETRIEVING MESSAGE HEADERS\n"; + $headers = $pop->top($message_number); + $headers = join("", @$headers); + + if ($MAILBOX{$mbox}{checkonlyonce} && ($hash = gethash($headers)) && exists $HEADERHASHES{$hash}) { + # print "\tMESSAGE HEADERS in HASH\n"; + } + else { + # + # We need the entire message for spamassassin + # + print "\tRETRIEVING ENTIRE MESSAGE\n"; + $message = $pop->get($message_number); + $num_new_checked++; + if (!$message) { + print "\tERROR: FAILED TO RETRIEVE MESSAGE $message_number [$!] [$@]: SKIPPING\n"; + next; + } + $message = join("", @$message); + # ($headers) = split(/\n\n/, $message); #This is different from getting headers directly. + } } else { @@ -123,6 +148,7 @@ # print "\tRETRIEVING MESSAGE HEADERS\n"; $headers = $pop->top($message_number); + $num_new_checked++; if (ref($headers) ne "ARRAY") { next; } @@ -161,6 +187,7 @@ } if ($reason) { print "\tTHAT IS SPAM ($reason)\n"; + $num_spam++; if ($MAILBOX{$mbox}{deletespam}) { if ($MAILBOX{$mbox}{backupfile}) { if (!$message) { @@ -183,6 +210,7 @@ } $pop->delete($message_number); print "\tDELETED FROM SERVER\n"; + $num_deleted++; } else { print "\tNOT DELETED FROM SERVER\n"; @@ -832,3 +860,23 @@ close(FH); return wantarray ? @data : \@data; } + +sub endstamp { + my $speed; + my $end_time; + my $time_diff; + my $minutes; + my $seconds; + my $sa; + $sa = spamassassin ('-V'); + $end_time = time; + $time_diff = $end_time - $start_time; + $minutes = int($time_diff/60); + $seconds = $time_diff - ($minutes*60); + $speed = sprintf("%.2f", ($num_msg/$time_diff)); + print "\nDisSpam v$VERSION finished run at ", scalar localtime(time), "\n"; + print "Running against $sa\n"; + print "DisSpam executed in $minutes minutes and $seconds seconds.\n"; + print "$num_msg message(s) were checked. $num_new_checked new message(s) were checked. Average time $speed messages/sec.\n"; + print "$num_spam spam message(s) were detected and $num_deleted message(s) were removed from server.\n"; +}