Também tenho pesquisado muito - raramente documentado.
Enquanto isso, há um comando
sieve-filter
para isso, encontrado neste blog link para um howto
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.
Também tenho pesquisado muito - raramente documentado.
Enquanto isso, há um comando
sieve-filter
para isso, encontrado neste blog link para um howto
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.
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 ""