11 votes

Exécuter la méthode de filtrage sur maildir

Pour mon serveur de messagerie, j'ai une configuration dovecot, postfix et sieve.

J'ai plusieurs centaines de mails dans mon maildir et j'ai récemment créé quelques règles sieve pour les trier. Malheureusement, les règles sieve sont, par conception, uniquement appliquées aux messages entrants. Par conséquent, ma question :

Comment puis-je exécuter sieve contre les messages dans un maildir déjà existant ?

Merci

--- éditer :

Merci larsks

Avec le lien que vous avez fourni, j'ai fini par utiliser :

mkdir à faire
mkdir fait
mv cur/* à faire
pour i dans à faire/*; faire
    echo "Livraison du message $i ..."
    /usr/lib/dovecot/deliver -d mail@example.de < $i && mv $i fait/
fait

qui fonctionne comme un charme. Je peux réexécuter ce script pour chaque nouveau filtre que je crée.

7voto

Eric Noob Points 531

Il n'y a pas de moyen facile de faire cela, mais selon ce message vous pouvez écrire un script shell pour réacheminer les messages en utilisant le programme deliver de Dovecot... donc quelque chose comme ceci :

produce_message_list |
while read msg; do
  /usr/libexec/dovecot/deliver -d user < $msg && rm -f $msg
done

Vous devrez remplacer produce_message_list par quelque chose qui produit une liste de messages à traiter ; éventuellement find fera ce dont vous avez besoin.

5voto

tgharold Points 609

Les nouvelles versions de dovecot et pidgeonhole sont maintenant livrées avec une commande sieve-filter. Vous pouvez donc écrire un script pour scanner toutes les boîtes aux lettres à la recherche d'un dossier "INBOX.Refilter" et ensuite exécuter sieve-filter sur ce dossier.

Ce script suppose que vous avez structuré votre dossier de messagerie comme /var/vmail/domaine/utilisateur.

#!/bin/bash

FIND=/usr/bin/find
GREP=/bin/grep
RM=/bin/rm
SED=/bin/sed
SORT=/bin/sort

# BASE doit pointer vers /var/vmail/ et doit avoir un slash final
BASE="/var/vmail/"

RESORTFOLDER="INBOX.Refilter"

SEARCHFILE="dovecot-uidlist"

echo ""
echo "Recherche de messages à réorganiser sous ${BASE}"
echo "Commencé à : " `date`
echo "Recherche de boîtes aux lettres avec ${RESORTFOLDER}"
echo ""

# puisque RHEL5/CentOS5 n'ont pas l'option "sort -R" pour mélanger, utilisez l'exemple suivant
# echo -e "2\n1\n3\n5\n4" | perl -MList::Util -e 'print List::Util::shuffle <>'

DIRS=`$FIND ${BASE} -maxdepth 3 -name ${SEARCHFILE} | \
    $SED -n "s:^${BASE}::p" | $SED "s:/${SEARCHFILE}$:/:" | \
    perl -MList::Util -e 'print List::Util::shuffle <>'`

# garder une trace des répertoires traités jusqu'à présent
DCNT=0

for DIR in ${DIRS}
do
    UD="${BASE}${DIR}.${RESORTFOLDER}"
    D=`echo "$DIR" | tr '/' ' ' | awk '{print $1}'`
    U=`echo "$DIR" | tr '/' ' ' | awk '{print $2}'`

    if [ -d "$UD/cur" ] 
    then
        echo "`date` - $DIR"
        echo " domaine : $D"
        echo "   utilisateur : $U"
        FILES=`find $UD/cur/ $UD/new/ -type f -name '*' | wc -l`
        echo "  fichiers : $FILES"

        if [[ $FILES -ge 1 ]]; then
            echo "Exécutez $FILES messages à nouveau à travers le filtre sieve."
            # -c2 signifie exécuter avec le meilleur effort, -n7 est la priorité la moins élevée possible
            ionice -c2 -n7 sieve-filter -e -W -C -u "${U}@${D}" "${BASE}${DIR}.dovecot.sieve" "${RESORTFOLDER}"
        fi

        echo ""
    fi

    # le code suivant est du code de débogage, pour arrêter le script après N répertoires
    #DCNT=$(($DCNT+1))
    #echo "DCNT : $DCNT"
    #if [[ $DCNT -ge 5 ]]; then exit 0; fi
done

echo ""
echo "Terminé à : " `date`
echo ""

5voto

LaSchmu Points 46

J'ai aussi beaucoup cherché - rarement documenté.

En attendant, il y a une commande

sieve-filter

pour cela, trouvée sur ce blog https://mebsd.com/configure-freebsd-servers/dovecot-pigeonhole-sieve-filter-refilter-delivered-email.html pour un guide pratique

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X