Pour parcourir les boîtes aux lettres de chaque utilisateur, et alimenter “l'apprentissage” de spamassassin.

#!/bin/bash
# Ce script parcours chaque BAL pour donner le contenu des dossiers $SPAM et $HAM à sa-learn
 
MBROOT=/home/mail
MBUSER=mailboxes
SPAM=.Junk.Spam-non-detecte
HAM=.Junk.Spam-detecte-a-tord
TMPD="$MBROOT/dirList.tmp"
TMPF="$MBROOT/fileList.tmp"
 
function checkDirExists() {
  # on créé les dossiers SPAM & HAM s'ils n'existent pas
  find -L "$MBROOT" -maxdepth 2 -mindepth 2 -type d|while read box
  do
    [ -d "$box/$SPAM" ] || (mkdir "$box/$SPAM"; chown $MBUSER:$MBUSER "$box/$SPAM";)
    [ -d "$box/$HAM" ] || (mkdir "$box/$HAM"; chown $MBUSER:$MBUSER "$box/$HAM";)
  done
}
 
function learnSpam() {
  # on liste les dossiers
  find -L "$MBROOT" -maxdepth 3 -mindepth 3 -name "$SPAM" -type d > "$TMPD"
  # init liste des spams
  >"$TMPF"
  # on liste les spam
  while read spamDir
  do
    find "$spamDir" -type f >> "$TMPF"
  done < "$TMPD"
  # on vire les fichiers dovecot du résultat
  sed -i -e '/dovecot/d' "$TMPF"
  # on les donne à sa-learn et on les efface
  while read spam
  do
    sa-learn --spam "$spam" > /dev/null && rm -f "$spam"
  done<"$TMPF"
}
 
function learnHam() {
  find -L "$MBROOT" -maxdepth 3 -mindepth 3 -name "$HAM" -type d > "$TMPD"
  # init liste des hams
  >"$TMPF"
  # on liste les spam
  while read hamDir
  do
    find "$hamDir" -type f >> "$TMPF"
  done < "$TMPD"
  # on vire les index du résultat
  sed -i -e '/dovecot/d' "$TMPF"
  # on les donne à sa-learn et on les mets dans inbox
  while read ham
  do
    new="`echo $ham|sed -e "s#$HAM/[a-z]*/#cur/#"`"
    sa-learn --ham "$ham" > /dev/null && mv "$ham" "$new"
  done<"$TMPF"
}
 
# main
checkDirExists
learnSpam
learnHam