GNU/Linux >> Tutoriels Linux >  >> Linux

exécuter sieve sur maildir

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

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

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


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

Ce script suppose que vous avez structuré votre dossier de messagerie sous la forme /var/vmail/domain/user.

#!/bin/bash

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

# BASE should point at /var/vmail/ and should have trailing slash
BASE="/var/vmail/"

RESORTFOLDER="INBOX.Refilter"

SEARCHFILE="dovecot-uidlist"

echo ""
echo "Search for messages to resort under ${BASE}"
echo "Started at: " `date`
echo "Looking for mailboxes with ${RESORTFOLDER}"
echo ""

# since RHEL5/CentOS5 don't have "sort -R" option to randomize, use the following example
# 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 <>'`

# keep track of directories processed so far
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 " domain: $D"
        echo "   user: $U"
        FILES=`find $UD/cur/ $UD/new/ -type f -name '*' | wc -l`
        echo "  files: $FILES"

        if [[ $FILES -ge 1 ]]; then
            echo "Run $FILES messages back through the sieve filter."
            # -c2 means run at best-effort, -n7 is least priority possible
            ionice -c2 -n7 sieve-filter -e -W -C -u "${U}@${D}" "${BASE}${DIR}.dovecot.sieve" "${RESORTFOLDER}"
        fi

        echo ""
    fi

    # the following is debug code, to stop the script after N directories
    #DCNT=$(($DCNT+1))
    #echo "DCNT: $DCNT"
    #if [[ $DCNT -ge 5 ]]; then exit 0; fi
done

echo ""
echo "Finished at:" `date`
echo ""

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

En attendant il y a une commande

sieve-filter

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


Linux
  1. Linux - Comment exécuter un script sur le verrouillage/déverrouillage de l'écran ?

  2. Linux – Exécuter des applications Mac Os X sous Linux ?

  3. Exécuter à nouveau le script si l'entrée est Oui ?

  4. Utilisation de l'exportation dans .bashrc ?

  5. Changer la police dans la commande Echo ?

16 exemples de commandes Echo sous Linux

Comment exécuter Windows 95 sous Linux

Comment exécuter un script bash

Comment faire écho dans le fichier

Comment exécuter une commande en arrière-plan avec un délai ?

Quel est le moyen le plus rapide d'exécuter un script ?