| #!/bin/sh |
| # Copyright (C) 2008-2021 all contributors <meta@public-inbox.org> |
| # License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt> |
| # This is installed as /etc/dc-dcvr on my system |
| # to use with postfix main.cf: mailbox_command = /etc/dc-dlvr "$EXTENSION" |
| DELIVER=/usr/lib/dovecot/deliver |
| CLAMDSCAN=clamdscan |
| |
| # change if your spamc/spamd listens elsewhere |
| spamc='spamc' |
| |
| # allow plus addressing to train spam filters, $1 is the $EXTENSION |
| # which may be "trainspam" or "trainham". Only allow spam training |
| # when $CLIENT_ADDRESS is empty (local client) |
| case $1,$CLIENT_ADDRESS in |
| trainspam,) exec $spamc -L spam > /dev/null 2>&1 ;; |
| trainham,) exec $spamc -L ham > /dev/null 2>&1 ;; |
| esac |
| |
| TMPMSG=$(mktemp -t dc-dlvr.orig.$USER.XXXXXX || exit 1) |
| CDMSG=$(mktemp -t dc-dlvr.orig.$USER.XXXXXX || exit 1) |
| rm_list="$TMPMSG $CDMSG" |
| |
| cat >$CDMSG |
| $CLAMDSCAN --quiet - <$CDMSG |
| if test $? -eq 1 |
| then |
| $DELIVER -m INBOX.spam <$CDMSG |
| exec rm -f $rm_list |
| fi |
| |
| # pre-filter, for infrequently read lists which do their own spam filtering: |
| if test -r ~/.dc-dlvr.pre |
| then |
| set -e |
| mv -f $CDMSG $TMPMSG |
| DEFAULT_INBOX=$(. ~/.dc-dlvr.pre) |
| case $DEFAULT_INBOX in |
| '') exec rm -f $rm_list ;; |
| INBOX) ;; # do nothing |
| *) |
| $DELIVER -m $DEFAULT_INBOX <$TMPMSG |
| exec rm -f $rm_list |
| ;; |
| esac |
| PREMSG=$(mktemp -t dc-dlvr.orig.$USER.XXXXXX || exit 1) |
| rm_list="$rm_list $PREMSG" |
| set +e |
| mv -f $TMPMSG $PREMSG |
| $spamc -E <$PREMSG >$TMPMSG |
| else |
| $spamc -E <$CDMSG >$TMPMSG |
| fi |
| err=$? |
| |
| # normal delivery |
| set -e |
| |
| case $err in |
| 1) $DELIVER -m INBOX.spam <$TMPMSG ;; |
| *) |
| # users may override normal delivery and have it go elsewhere |
| if test -r ~/.dc-dlvr.rc |
| then |
| . ~/.dc-dlvr.rc |
| else |
| $DELIVER -m INBOX <$TMPMSG |
| fi |
| ;; |
| esac |
| |
| exec rm -f $rm_list |