procmail salva em um diretório e executa um script?

procmail salva em um diretório e executa um script?

Estou usando procmailregras Maildir/fáceis como a abaixo para salvar e-mails recebidos em diretórios:

:0:
* ^X-Spam-Status: Yes
Spam/

Agora eu gostaria de uma notificação na área de trabalho sobre novos e-mails em determinados diretórios/regras, já sei como lidar com notificações, mas como saber procmailpara salvar em um diretórioeexecutar um script?

Eu sei que possocanoa |command, mas eu preferiria deixar procmailsalvar o arquivo e depois executar um script.

Ter o e-mail (pelo menos cabeçalhos) no canal ou o caminho dir+arquivo como argumentos seria bom, executar o script assíncrono também seria bom.

atualizar

Então, com base na resposta do @slm, esse é o resultado:

:0 c:
* ^X-Spam-Status: Yes
Spam/

:0 Whi
* ^X-Spam-Status: Yes
| $HOME/install/bin/notify.sh

c cópia dea mensagem no diretório, mas continua com as próximas regras

Não estou usando fporque não é um filtro, se a regra corresponder quero que o procmail pare por aqui (espero não estar entendendo mal o manual aqui)

Wpara suprimir qualquer falha do programa

hparacanoapenas cabeçalhos

iignorar qualquer erro de gravação no pipe

Não estou usando wporque não quero esperar o script retornar

Acho que também não preciso de um arquivo de bloqueio (não :depois Whi)

atualização 05/12/14

No final adotei exatamente a solução proposta por @tripleee.

Brinquei também por mailutils-comsatdalguns minutos antes de desistir.

.procmailrc:

COMSAT=no

Responder1

Para executar o e-mail por meio de um script, você pode modificar sua regra usando 2 regras:

:0: c
* ^X-Spam-Status: Yes
Spam/

:0: fw
* ^X-Spam-Status: Yes
| /usr/bin/python /work/scripts/process_mail.bash

Seu programa receberá o e-mail no STDIN. Você terá que 'ecoar' o e-mail possivelmente transformado em STDOUT.

fw significa:

  • fConsidere o tubo como um filtro.
  • wAguarde o término do filtro ou programa e verifique seu código de saída (normalmente ignorado); se o filtro não for bem-sucedido, o texto não terá sido filtrado.
  • cGere uma cópia carbono deste e-mail. Isso só faz sentido na entrega de receitas. A única receita de não entrega na qual este sinalizador tem efeito é em um bloco de aninhamento, para gerar uma cópia carbono, isso clonará o processo procmail em execução (os arquivos de bloqueio não serão herdados), pelo que o clone prosseguirá normalmente e o pai vai pular através do bloco.

Referências

Responder2

Aqui está uma ligeira adaptação da resposta do @slm.

Você não deve usar o bloqueio com o Maildir, e os sinalizadores e os dois pontos de bloqueio estavam ao contrário. (Você criaria efetivamente um arquivo de bloqueio chamado c, em vez de clonar a mensagem, para que a segunda ação nunca fosse acionada.)

A fbandeira parece fora de lugar.

Inverti a ordem das ações; embora faça sentido entregar e depois notificar, do ponto de vista do Procmail, a notificação é uma ação secundária que pode falhar, então faço isso em um clone e ignoro seu status de saída.

Finalmente, agrupar duas ações sob uma condição é mais intuitivo usando colchetes.

:0
* ^X-Spam-Status: Yes
{
    :0cWhi
    | $HOME/install/bin/notify.sh
    :0
    Spam/
}

Dito isto, observo também que o Procmail já gera comsatnotificações prontas para uso. Esse é um protocolo de notificação legado, mas você pode usá-lo para alguma coisa. Em segundo lugar, um mecanismo de notificação simples poderia ser construído usando um script que monitorasse o seu procmail.log. (Mas sim, analisar arquivos de log é uma droga.)

informação relacionada