Executando regras em uma caixa de correio?

2

Estou tentando executar algumas regras smartsieve em uma caixa de correio IMAP, certamente posso fazer isso para emails que são entregues a essa caixa de correio, mas para emails que já estão nessa caixa de correio ou que foram movidos para ela (via thunderbird / outlook) as regras não são processadas. Existe algum aplicativo / método de ter uma regra (s) executada (s) na caixa de correio X secconds / minutes?

    
por glisignoli 17.08.2011 / 23:02

2 respostas

0

Por design, processos de peneira são enviados na chegada na caixa de correio do usuário a partir do exterior. Não há uma maneira interna de processar pastas depois.

No entanto, seria possível coletar mensagens de uma pasta cyrus ("hotfolder") e enviá-las novamente através do MTA comum para uma caixa de correio especial ("specialmailbox") que, por sua vez, tem as regras de peneira necessárias .

Para este propósito, você poderia usar algo assim, por exemplo, via cron:

#!/bin/sh
for msg in /var/spool/cyrus/mail/hotfolder; do
    sendmail speicalmailbox <$msg && rm $msg
done

As mensagens na pasta "hot" são removidas do sistema de arquivos sem removê-las do índice cyrus, isso não é o ideal. Você pode usar iprune (parte da distribuição cyrus, ele excluirá as mensagens das pastas dependendo da idade) para corrigir isso. A remoção do sistema de arquivos é necessária, portanto, não processamos cada mensagem várias vezes.

Espero que isso ajude.

    
por 14.09.2011 / 08:57
0

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:17