Como filtrar e entregar uma mensagem no Procmail

Como filtrar e entregar uma mensagem no Procmail

Eu reescrevo a linha de assunto para certos e-mails recebidos dependendo do campo TO::

:0fhw
* ! ^TO_user@domain\.com\>
* ^TO_[^<>@ ]+@domain\.com\>
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPAM]$MATCH"

O código acima (da minha pergunta anteriorprocmail reescreve a linha de assunto se o usuário destinatário do email falhar no teste de correspondência) funciona perfeitamente - se eu receber mensagens de algo DIFERENTE[e-mail protegido], a linha de assunto é reescrita como [SPAM] (assunto original)

Mas eu gostaria de fazer várias condicionais como esta - o bloco de trabalho acima será o final, mas antes disso, gostaria de reescrever a linha de assunto se TO corresponder a um endereço diferente.

Então adicionei este bloco logo acima dele:

:0fh
* ^TO_special@domain\.com
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPECIAL]$MATCH"
$DEFAULT

... e isso funciona - e-mails enviados para '[e-mail protegido]' ter sua linha de assunto reescrita.

O problema é que o Procmail não para - ele passa para opróximobloco e o reescreve novamente. Portanto, e-mails enviados para [email protected]ter suas linhas de assunto reescritas como:

[SPAM] [ESPECIAL] Linha de assunto original, blá, blá

Por que é isso? Por que a ação no final do primeiro bloco não $DEFAULTfaz com que o Procmail interrompa o processamento desse email?

Como posso combinar o novo bloco epararprocessar aquela correspondência e simplesmente terminar com ela?

Responder1

O $DEFAULTfinal é um erro de sintaxe. Não é possível especificar diversas ações na mesma receita.

O que você pode fazer é dividir em duas receitas; ou, neste caso, simplesmente combinar a reescrita e a entrega.

:0:
* ^TO_special@domain\.com
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPECIAL]$MATCH" >>$DEFAULT

Isso não tem mais sinalizadores fhporque queremos enviar toda a mensagem (não apenas os cabeçalhos, o que htem) e queremos entregar, e não capturar os resultados do pipeline de volta ao Procmail (que ftem).

Isso pressupõe que $DEFAULTseja um arquivo, não um diretório; e assim também adicionamos um segundo :para especificar o bloqueio.

Se você quiser especificar duas ações sob um único conjunto de condições, poderá usar colchetes com várias receitas dentro deles. Cada receita pode ter zero ou mais condições, mas apenas uma ação.

:0
* ^TO_special@domain\.com
* ^Subject:\/.+
{
    :0fhw
    | formail -I"Subject: [SPECIAL]$MATCH"

    :0:
    $DEFAULT
}

mas neste caso é uma complicação desnecessária.

(Talvez também fosse mais idiomático mover a ^Subject:condição para a formailreceita à qual ela pertence logicamente, mas, de qualquer forma, isso é apenas uma tangente.)

Também tangencialmente, talvez certifique-se de que PATHestá correto logo no início do seu, .procmailrcpara evitar especificar o caminho completo para utilitários externos como formail.

informação relacionada