run sieve on maildir

7

Para meu servidor de e-mail, eu tenho uma configuração de pombo, postfix e peneira.

Eu tenho centenas de e-mails no meu maildir e criei recentemente algumas regras para classificá-las. Infelizmente, as regras de peneira são, por design, aplicadas somente a mensagens de entrada. Portanto, minha pergunta:

Como posso executar uma peneira contra mensagens em um maildir já existente?

Obrigado

--- editar:

Obrigado larsks

Com o link que você forneceu, acabei usando:

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

que funciona como eu encanto. Eu posso reexecutar esse script para cada novo filtro que eu criar.

    
por ftiaronsem 17.08.2012 / 18:33

3 respostas

2

Também tenho pesquisado muito - raramente documentado.

Enquanto isso, há um comando

sieve-filter

para isso, encontrado neste blog link para um howto

    
por 04.01.2016 / 23:38
7

Não há uma maneira fácil de fazer isso, mas de acordo com esta mensagem você pode escrever um script de shell para re-entregar mensagens usando o Dovecot's deliver program ... então algo assim:

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

Você terá que substituir produce_message_list por algo que produz uma lista de mensagens para processamento; possivelmente find fará o que você precisa.

    
por 17.08.2012 / 19:19
5

Novas versões do dovecot e pidgeonhole agora vêm com um comando sieve-filter. Assim, você pode escrever um script para verificar todas as caixas de correio de uma pasta "INBOX.Refilter" e, em seguida, executar o filtro de filtro nessa pasta.

Este script assume que você estruturou sua pasta de e-mails como / 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 ""
    
por 02.06.2013 / 17:16