learn_junk_mail   [plain text]


#!/bin/sh
#
# SpamAssassin auto learn script
#

PROG=$0

DEBUG=false
JUNK_MAIL_USER=junkmail
NOT_JUNK_MAIL_USER=notjunkmail

usage()
{
  echo "\
Usage: $PROG [options]
Options:
  -d                        debug
  -h not-junk-mail-user     user whose mail is not junk ('ham') [$NOT_JUNK_MAIL_USER]
  -s junk-mail-user         user whose mail is all junk ('spam') [$JUNK_MAIL_USER]"
  exit 1
}

while getopts dh:s: o
do
  case "$o" in
  d) DEBUG=true
    ;;
  h) NOT_JUNK_MAIL_USER=$OPTARG
    ;;
  s) JUNK_MAIL_USER=$OPTARG
    ;;
  *) usage
    ;;
  esac
done
shift `expr $OPTIND - 1`

JUNK_MAIL_GUID=`/usr/bin/cvt_mail_data -i "$JUNK_MAIL_USER"`
if [ `expr "$JUNK_MAIL_GUID" : '[0-9A-F]*-[0-9A-F]*-[0-9A-F]*-[0-9A-F]*-[0-9A-F]*'` -eq 0 ]
then
  echo "Can't find GUID for junk mail user $JUNK_MAIL_USER"
  echo $JUNK_MAIL_GUID
  exit 1
fi

NOT_JUNK_MAIL_GUID=`/usr/bin/cvt_mail_data -i "$NOT_JUNK_MAIL_USER"`
if [ `expr "$NOT_JUNK_MAIL_GUID" : '[0-9A-F]*-[0-9A-F]*-[0-9A-F]*-[0-9A-F]*-[0-9A-F]*'` -eq 0 ]
then
  echo "Can't find GUID for not-junk mail user $NOT_JUNK_MAIL_USER"
  echo $NOT_JUNK_MAIL_GUID
  exit 1
fi

PART_MAP_PATH=/etc/dovecot/partition_map.conf
MAIL_STORE_PATH=`grep "^default:" $PART_MAP_PATH | sed s,default:,,`
case "$MAIL_STORE_PATH" in
/*) # OK
  ;;
*) echo "Can't determine mail store path from $PART_MAP_PATH"
  exit 1
  ;;
esac

JUNK_MAIL_PATH="$MAIL_STORE_PATH/$JUNK_MAIL_GUID"
NOT_JUNK_MAIL_PATH="$MAIL_STORE_PATH/$NOT_JUNK_MAIL_GUID"

if $DEBUG
then
  echo "Junk user:     $JUNK_MAIL_USER"
  echo "Not-junk user: $NOT_JUNK_MAIL_USER"
  echo "Junk GUID:     $JUNK_MAIL_GUID"
  echo "Not-junk GUID: $NOT_JUNK_MAIL_GUID"
  echo "Junk path:     $JUNK_MAIL_PATH"
  echo "Not-junk path: $NOT_JUNK_MAIL_PATH"
fi

SA_LEARN_PATH="/usr/bin/sa-learn"
DB_PATH=/var/amavis/.spamassassin

# Check for root user
if [ `whoami` != "root" ]
then
  echo "You must be root to execute this script"
  exit 1
fi

# Does the mail store exist
if [ ! -d "$MAIL_STORE_PATH" ]
then
  echo "Mail store path: $MAIL_STORE_PATH does not exist" 
  exit 1
fi

# Does the sa-learn tool exits
if [ ! -e $SA_LEARN_PATH ]
then
  echo "Mail tool: $SA_LEARN_PATH does not exist"
  exit 2
fi

# Has the junk-mail user account been created
if [ -d "$JUNK_MAIL_PATH" ]
then
  echo "Learning what is junk mail"
  find "$JUNK_MAIL_PATH/cur" "$JUNK_MAIL_PATH/new" -type f -print | while read file
  do
    sudo -u _amavisd $SA_LEARN_PATH --dbpath $DB_PATH --spam --no-sync < "$file" > /dev/null
  done
fi

# Has the not-junk-mail user account been created
if [ -d "$NOT_JUNK_MAIL_PATH" ]
then
  echo "Learning what is not junk mail"
  find "$NOT_JUNK_MAIL_PATH/cur" "$NOT_JUNK_MAIL_PATH/new" -type f -print | while read file
  do
    sudo -u _amavisd $SA_LEARN_PATH --dbpath $DB_PATH --ham --no-sync < "$file" > /dev/null
  done
fi

# Force a database sync
sudo -u _amavisd $SA_LEARN_PATH --dbpath $DB_PATH --sync > /dev/null