./MailFilter/SpamAssassin.pm


package MailFilter::SpamAssassin;

# process mails with spamassassin and optionally block
#
# based on:
# $Id: suggested-minimum-filter-for-windows-clients,v 1.81 2004/10/26 18:34:33 dfs Exp $

use strict;
use warnings;
use Mimedefang qw(:global :spamassassin :action :logging message_rejected);

sub filter_initialize () {
    # The next lines force SpamAssassin modules to be loaded and rules
    # to be compiled immediately.  This may improve performance on busy
    # mail servers.  Comment the lines out if you don't like them.
    if ($Features{"SpamAssassin"}) {
        spam_assassin_init()->compile_now(1) if defined(spam_assassin_init());

        # If you want to use auto-whitelisting:
#       if (defined($SASpamTester)) {
#           use Mail::SpamAssassin::DBBasedAddrList;
#           my $awl = Mail::SpamAssassin::DBBasedAddrList->new();
#           $SASpamTester->set_persistent_address_list_factory($awl)
#               if defined($awl);
#       }
    }
}

sub filter_end ($) {
    my($entity) = @_;

    # No sense doing any extra work
    return if message_rejected();

    # Spam checks if SpamAssassin is installed
    if ($Features{"SpamAssassin"}) {
	if (-s "./INPUTMSG" < 100*1024) {
	    # Only scan messages smaller than 100kB.  Larger messages
	    # are extremely unlikely to be spam, and SpamAssassin is
	    # dreadfully slow on very large messages.
	    my($hits, $req, $names, $report) = spam_assassin_check();
	    my($score);
	    if ($hits < 40) {
		$score = "*" x int($hits);
	    } else {
		$score = "*" x 40;
	    }
	    # We add a header which looks like this:
	    # X-Spam-Score: 6.8 (******) NAME_OF_TEST,NAME_OF_TEST
	    # The number of asterisks in parens is the integer part
	    # of the spam score clamped to a maximum of 40.
	    # MUA filters can easily be written to trigger on a
	    # minimum number of asterisks...
	    if ($hits >= $req) {
		action_change_header("X-Spam-Score", "$hits ($score) $names");
                md_graphdefang_log('spam', $hits, $RelayAddr);

		# If you find the SA report useful, add it, I guess...
		action_add_part($entity, "text/plain", "-suggest",
		                "$report\n",
				"SpamAssassinReport.txt", "inline");
	    } else {
		# Delete any existing X-Spam-Score header?
		action_delete_header("X-Spam-Score");
	    }
	}
    }
}

# DO NOT delete the next line, or Perl will complain.
1;