#!/bin/bash MAILDIR=/home/gregday/Mail SPAMDIRS=( .Junk ) # Optional features. Unset to disable. EXCLUDED=( .Trash .To\ Do ) LOGFILE=/var/log/mail/spamd.log MAIL_REPORT=yes QUARANTINE=yes IMPORT_HAM=yes MARK_HAM_READ=yes VERBOSE=yes SIMPLE_MAIL_OVERRIDE=yes # You should not need to change these in most setups. AMAVIS_CONF=/etc/amavisd.conf SA_LEARN='/usr/bin/sa-learn' SA_HOME=/var/spool/spamassassin QUARANTINEDIR=/var/virusmails/spam OWNER=$(grep "daemon_user" $AMAVIS_CONF | awk '{print $3}' | sed s/\'//g | sed s/\;//) GROUP=$(grep "daemon_group" $AMAVIS_CONF | awk '{print $3}' | sed s/\'//g | sed s/\;//) PERMISSIONS=600 TIMESTAMP=$(date | awk '{print $2 " " $3 " " $4}') HOST=airwaterunix MAILTO=content-filter@$HOSTNAME MAILFROM=content-filter@$HOSTNAME MAILER=/usr/sbin/sendmail HEADER="Subject: Junk mail imported From: Content-filter at $HOSTNAME <$MAILFROM> Mail imported into SpamAssassin database: " # Do not change anything below this line unless you know what you are doing. Verbose() { varray[${#varray[@]}]="$1" } Import() { cd "$MAILDIR/$DIR/cur" tokens="$($SA_LEARN --$1 -u $OWNER . )" if ! echo "$tokens" | grep -q "Learned tokens from 0 message" ; then body[${#body[@]}]="$TIMESTAMP $HOST spamlearn: $1 $(echo $DIR | cut -c 2-) $(echo $tokens | sed s/tokens\ //g | sed s/message\(s\)\ //g)" eval ${1}found=1 else Verbose "$TIMESTAMP $HOST spamlearn: Nothing new in $(echo $DIR | cut -c 2-) $(echo $tokens | sed s/"Learned tokens from 0 message(s)"\ /'\t'/g | sed s/message\(s\)\ //g)" fi } Quarantine() { if ls * &> /dev/null ; then for i in * ; do from="$(grep From: "$i" | grep -v X-Envelope)" gzip "$i" 2>&1 chown $OWNER:$GROUP *gz 2>&1 chmod $PERMISSIONS *gz 2>&1 mv "$i".gz $QUARANTINEDIR/${i:0:10}.gz 2>&1 Verbose "$TIMESTAMP $HOST spamlearn: $(echo $i | cut -b 1-10).gz $(echo $from)" done fi } Exclude() { for excluded in "${EXCLUDED[@]}" "${SPAMDIRS[@]}" ; do if [ "$HAMDIR" = "$excluded" ] ; then return 1 fi done } GetHamDirs() { for HAMDIR in "$MAILDIR/".[!.]*/ ; do HAMDIR=${HAMDIR%/} HAMDIR=${HAMDIR##*/} if Exclude ; then HAMDIRS[${#HAMDIRS[@]}]=$HAMDIR fi done } MarkRead() { if ls *\, &> /dev/null ; then for i in *\, ; do mv "$i" "$i"S &> /dev/null done fi } SimpleLog() { printf "%s\n" "${body[@]}" >> $LOGFILE printf "\n" >> $LOGFILE } VerboseLog() { printf "%s\n" "${varray[@]}" >> $LOGFILE echo "" >> $LOGFILE } Report() { reportmsg[0]="$HEADER" reportmsg[1]="$(printf "%s\n" "${body[@]}") " printf "%s\n" "${reportmsg[@]}" | $MAILER -f $MAILFROM -t $MAILTO Verbose $'\n' Verbose "$TIMESTAMP $HOST spamlearn: Report mailed to $MAILTO" } AppendVerboseToReport() { reportmsg[2]="$(printf "%s\n" "${varray[@]}")" } FixPerms() { chown $OWNER:$GROUP $SA_HOME/bayes_toks } for DIR in ${SPAMDIRS[@]} ; do Import spam if [ $QUARANTINE ] ; then Quarantine if [ $spamfound ] ; then Verbose "$TIMESTAMP $HOST spamlearn: Total messages in $QUARANTINEDIR: $(ls $QUARANTINEDIR | wc -l)" Verbose $'\n' fi else MarkRead fi done GetHamDirs for DIR in ${HAMDIRS[@]} ; do if [ $IMPORT_HAM ] ; then Import ham fi if [ $MARK_HAM_READ ] ; then cd "$MAILDIR/$DIR/cur" MarkRead fi done FixPerms if [[ $SIMPLE_MAIL_OVERRIDE && $LOGFILE && $MAIL_REPORT ]] ; then SimpleLog if [ $spamfound ] ; then Report fi VerboseLog else if [ $LOGFILE ] && [[ $spamfound || $hamfound ]] ; then SimpleLog fi if [[ $MAIL_REPORT && $spamfound ]] ; then if [ $VERBOSE ] ; then AppendVerboseToReport fi Report fi if [[ $LOGFILE && $VERBOSE ]] ; then VerboseLog fi fi