Spamassassin
Setup on Debian for use with EXIM.
Install
apt-get install spamassassin sa-compile
Configure
Local
Edit /etc/spamassassin/local.cf to add local rules.
Compile
Compiling rules will speed up spamd but it will work otherwise.
compile-spamd.sh
#! /bin/sh sa-compile chown -R debian-spamd:debian-spamd /var/lib/spamassassin chmod -R go-w,go+rX /var/lib/spamassassin/compiled kill -HUP `cat /var/run/spamd.pid` exit 0
Update
Run from cron once per day to download new rules and recompile.
update-spamd.sh
#! /bin/sh sa-update --nogpg if test $? -eq 0; then compile-spamd.sh fi exit 0
Run it
#! /bin/sh export TZ="UTC" rm -f /var/run/spamd.pid exec /usr/sbin/spamd --helper-home-dir=/var/lib/spamassassin --create-prefs --nouser-config -udebian-spamd -gdebian-spamd --socketpath=/var/run/spamd.sock --socketowner=debian-spamd --socketgroup=debian-spamd --socketmode=0777 --max-children 5 --pidfile /var/run/spamd.pid
Plugin
Example plugin I wrote to catch fake mailing list spam.
#! /usr/bin/perl # # By # Darron M Broad, July 2022 # # See # https://spamassassin.apache.org/full/3.4.x/doc/Mail_SpamAssassin_Plugin.html # https://spamassassin.apache.org/full/3.4.x/doc/Mail_SpamAssassin_Logger.html # https://spamassassin.apache.org/full/3.4.x/doc/Mail_SpamAssassin_PerMsgStatus.html # # /etc/spamassassin/local.cf: # loadplugin LocalPlugin /etc/spamassassin/local/plugin.pm # header LOCAL_FAKE_LIST eval:check_for_fake_list() # score LOCAL_FAKE_LIST 100 # describe LOCAL_FAKE_LIST From Fake List package LocalPlugin; use Mail::SpamAssassin::Plugin; use Mail::SpamAssassin::Logger; use Mail::SpamAssassin::PerMsgStatus; our @ISA = qw(Mail::SpamAssassin::Plugin); sub new { my($class, $mailsa) = @_; $class = ref($class) || $class; my $self = $class->SUPER::new($mailsa); bless ($self, $class); $self->register_eval_rule("check_for_fake_list"); info("LocalPlugin: REGISTERED"); return $self; } sub check_for_fake_list { my($self, $permsgstatus) = @_; $from = $permsgstatus->get("EnvelopeFrom"); my @to = split /@/, $permsgstatus->get("To:addr"); # x@y.z my $name = $to[0]; my $host = $to[1]; if ($from && $name && $host) { # *mail-user=host@mail.* if ((index $from, "mail-$name=$host\@mail\.") > 0) { info("LocalPlugin: SPAM $from"); return 1; } # newsletter-user=host@mail.* if ((rindex $from, "newsletter-$name=$host\@mail\.", 0) == 0) { info("LocalPlugin: SPAM $from"); return 1; } } return 0; } 1; # vim: shiftwidth=4 tabstop=4 noexpandtab
Spam
Here is a PHP command line tool to send test spam.
Change Host, Sender and addAddress as appropriate.
#! /usr/bin/php -q <?php /* DEBIAN BUSTER */ require_once 'libphp-phpmailer/src/Exception.php'; require_once 'libphp-phpmailer/src/OAuth.php'; require_once 'libphp-phpmailer/src/PHPMailer.php'; require_once 'libphp-phpmailer/src/POP3.php'; require_once 'libphp-phpmailer/src/SMTP.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; $mail = new PHPMailer(true); $mail->SMTPDebug = SMTP::DEBUG_SERVER; $mail->isSMTP(); $mail->Host = 'localhost'; $mail->SMTPAuth = false; $mail->Sender = "newsletter-root=example.com@mail.example.com"; $mail->setFrom('root@example.com', 'SPAM'); $mail->addAddress('root@example.com', "SPAM"); $mail->addReplyTo('root@example.com', 'SPAM'); $mail->isHTML(false); $mail->Subject = 'Subject'; $mail->Body = 'Body'; try { $mail->send(); } catch (Exception $e) { echo $e->getMessage(); } /* * vim: shiftwidth=4 tabstop=4 softtabstop=4 expandtab */ ?>