Sieb auf Maildir laufen lassen

7

Für meinen Mailserver habe ich ein Taubenschlag-, Postfix- und Sieb-Setup.

Ich habe mehrere hundert Mails in meinem Maildir und habe kürzlich einige Siebregeln zum Sortieren erstellt. Leider gelten die Siebregeln standardmäßig nur für eingehende Nachrichten. Deshalb meine Frage:

Wie kann ich Nachrichten in einem bereits vorhandenen Maildir durchsieben?

Vielen Dank

--- bearbeiten:

Danke Larsks

Mit dem von Ihnen angegebenen Link habe ich am Ende Folgendes verwendet:

mkdir todo
mkdir done
mv cur/* todo
for  i  in todo/*; do
    echo "Delivering message $i ..."
    /usr/lib/dovecot/deliver -d [email protected] < $i && mv $i done/
done

das funktioniert wie ich bezaubere. Ich kann dieses Skript für jeden neuen Filter, den ich erstelle, erneut ausführen.

ftiaronsem
quelle

Antworten:

7

Es gibt keine einfache Möglichkeit, dies zu tun, aber gemäß dieser Nachricht können Sie ein Shell-Skript schreiben, um Nachrichten mit Dovecots deliverProgramm erneut zuzustellen ... also so etwas wie das:

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

Sie müssen durch produce_message_listetwas ersetzen , das eine Liste der zu verarbeitenden Nachrichten erstellt. wird möglicherweise findtun, was Sie brauchen.

Larsks
quelle
5

Neuere Versionen von Dovecot und Pidgeonhole verfügen jetzt über einen Siebfilterbefehl. Sie können also ein Skript schreiben, um alle Postfächer nach einem Ordner "INBOX.Refilter" zu durchsuchen, und dann den Siebfilter für diesen Ordner ausführen.

In diesem Skript wird davon ausgegangen, dass Sie Ihren E-Mail-Ordner als / var / vmail / domain / user strukturiert haben.

#!/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 ""
tgharold
quelle