This one is for vmail which is attached.

Bill


On 11/10/2016 8:29 PM, Ben Johnson wrote:
On 11/10/2016 3:46 AM, Bill Shirley wrote:
I don't use the Anti-Spam plugin; I just fire off a BASH script every
four hours with
crontab which iterates thru the vmail email accounts and trains
Spamassassin 'per-user'
accounts.  If the script sounds interesting I can post it here.  It
probably could use a little polish
though.

Bill
Thanks, Bill!

Sure, please do share the script, if it's not too much trouble.

For my specific use-case, I've been maintaining a "corpus" of known
ham/spam messages, and enjoy being able to hand
classify/re-classify/ignore if necessary.

But I do see the appeal of training with a single script that iterates
through each user's mailbox.

Heretofore, my thinking has been that combining all "submitted" spam,
which is piped into the training mailbox automatically, whenever a user
drags from Inbox -> Spam (or vice versa), I have a much broader sample
of the the ham and spam out there.

And yes, a "shared" corpus among all users does seem to "dilute"
specific individuals' would-be training preferences a bit, but the
trade-off seems worthwhile.

Interesting quandary... I would love to see the script! No problem if
it's a bit "rough around the edges"; the overall concept and approach
are what's important to me.

-Ben

#!/bin/bash
# 2015-11-02 add -u to sa-learn; change delete to doveadm expunge
# 2015-07-21 update executable paths and dbpath
# vmail home is organized like: /home/vmail/domains/example.com/bob/Maildir
MAILDIR=Maildir
SPAMDIR="SystemFolders.Spam"
HAMDIR="SystemFolders.Ham"
VMAILHOME=/home/vmail
VMAILUSER=vmail

LS=/usr/bin/ls
RM=/usr/bin/rm
SU=/usr/bin/su
FIND=/usr/bin/find
DOVEADM=/usr/bin/doveadm
SALEARN=/usr/bin/sa-learn

for domain in `$LS "$VMAILHOME/domains"`; do
        for user in `$LS $VMAILHOME/domains/$domain`; do
                if [ "$user" = "public_html" ]; then continue; fi

                dbpath="$VMAILHOME/domains/$domain/$user/.spamassassin"
                [ ! -d "$dbpath" ] && continue

                
prefs="$VMAILHOME/domains/$domain/$user/.spamassassin/user_prefs"
                [ ! -f "$prefs" ] && continue
echo "$user@$domain"
#echo "$user@$domain user_prefs=$prefs dbpath=$dbpath"

                spamdir="$VMAILHOME/domains/$domain/$user/$MAILDIR/.$SPAMDIR"
                hamdir="$VMAILHOME/domains/$domain/$user/$MAILDIR/.$HAMDIR"

                saparm=''
                if [ -d "$spamdir/new" ]; then
                        saparm="$saparm --spam $spamdir/new "
                fi
                if [ -d "$spamdir/cur" ]; then
                        saparm="$saparm --spam $spamdir/cur "
                fi
                if [ -d "$hamdir/new" ]; then
                        saparm="$saparm --ham $hamdir/new "
                fi
                if [ -d "$hamdir/cur" ]; then
                        saparm="$saparm --ham $hamdir/cur "
                fi
#echo $saparm

                if [ x"$saparm" != x ]; then
#                       $SU -c "$SALEARN --dbpath=$dbpath --prefspath=$prefs 
$saparm" $VMAILUSER
#                       $SALEARN --dbpath=$dbpath --prefspath=$prefs $saparm
                        $SALEARN -u "$VMAILUSER" --dbpath "$dbpath" -p "$prefs" 
$saparm
                fi

# delete using find
#               [ -d "$spamdir/new" ] && $FIND "$spamdir/new" -type f -delete
#               [ -d "$spamdir/cur" ] && $FIND "$spamdir/cur" -type f -delete
#               [ -d "$hamdir/new" ] && $FIND "$hamdir/new" -type f -delete
#               [ -d "$hamdir/cur" ] && $FIND "$hamdir/cur" -type f -delete

# next two lines are for testing:
#               $DOVEADM -f table fetch -u "$user@$domain" 'date.received' 
mailbox "$SPAMDIR"
#               $DOVEADM -f table fetch -u "$user@$domain" 'date.received' 
mailbox "$HAMDIR"
# delete using dovecot
                $DOVEADM expunge -u "$user@$domain" all mailbox "$SPAMDIR"
                $DOVEADM expunge -u "$user@$domain" all mailbox "$HAMDIR"
        done
done

Reply via email to