#!/bin/sh # Copyright (C) 2008-2014, Eric Wong # License: GPLv3 or later # Usage: report-spam /path/to/message/in/maildir # This is intended for use with incron or similar systems. # my incrontab(5) looks like this: # /path/to/maildir/.INBOX.good/cur IN_MOVED_TO /path/to/report-spam $@/$# # /path/to/maildir/.INBOX.spam/cur IN_MOVED_TO /path/to/report-spam $@/$# # gigantic emails tend not to be spam (but they suck anyways...) bytes=$(stat -c %s $1) if test $bytes -gt 512000 then exit fi # Only tested with the /usr/sbin/sendmail which ships with postfix # *** Why not call spamc directly in this script? *** # I route this through my MTA so it gets queued properly. # incrond has no concurrency limits and will fork a new process on # every single event, which sucks with rename storms when a client # commits folder changes. The sendmail executable exits quickly and # queues up the message for training. This should also ensure fairness # to newly arriving mail. Instead of installing/configuring # another queueing system, I reuse the queue in the MTA. # See scripts/dc-dlvr for corresponding trainspam/trainham handlers, # which are for my personal bayes training, and scripts/dc-dlvr.pre # for the pispam/piham handlers for training emails going to public-inbox DO_SENDMAIL='/usr/sbin/sendmail -oi' PI_USER=pi case $1 in *[/.]spam/cur/*) # non-new messages in spam get trained $DO_SENDMAIL $PI_USER+pispam <$1 exec $DO_SENDMAIL $USER+trainspam <$1 ;; *:2,*S*) # otherwise, seen messages only case $1 in *:2,*T*) exit 0 ;; # ignore trashed messages esac $DO_SENDMAIL $PI_USER+piham <$1 exec $DO_SENDMAIL $USER+trainham <$1 ;; esac