procmail salvar em um dir e executar um script?

2

Estou usando procmail com Maildir/ e regras 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 de desktop em novos e-mails em certos diretórios / regras, eu já sei como lidar com notificações, mas como dizer procmail para salvar em um diretório e executar um script?

Eu sei que posso canalizar um |command , mas eu preferiria deixar procmail salvando o arquivo, depois apenas executar um script.

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

atualização

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 copie a mensagem no diretório, mas continua com as próximas regras

Eu não estou usando f becase que não é um filtro, se a correspondência de regra eu quero que o procmail pare aqui (espero não estar entendendo mal o manual aqui)

W para suprimir qualquer falha no programa

h para pipe somente cabeçalhos

i para ignorar qualquer erro de gravação no canal

Eu não estou usando w porque não quero esperar que o script retorne

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

atualização 12/5/14

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

Interpretado também com mailutils-comsatd por alguns minutos antes de desistir.

.procmailrc:

COMSAT=no
    
por Alex 11.05.2014 / 16:27

2 respostas

2

Aqui está uma pequena 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 foram o caminho errado. (Você criaria efetivamente um arquivo de bloqueio chamado c , em vez de clonar a mensagem, para que a segunda ação nunca fosse disparada).

A bandeira f parece estar fora do lugar.

Eu inverti a ordem das ações; enquanto faz sentido entregar, em seguida, notificar, do ponto de vista do Procmail, a notificação é uma ação secundária que é permitido falhar, então eu faço isso em um clone e ignorar seu status de saída.

Por fim, agrupar duas ações sob uma condição é mais intuitivo usando chaves.

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

Dito isto, também noto que o Procmail já gera comsat de notificações prontas para uso. Esse é um protocolo de notificação legado, mas você pode usá-lo para algo. Em segundo lugar, um mecanismo de notificação simples poderia ser criado usando um script que monitora seu procmail.log . (Mas sim, analisar arquivos de log é uma merda.)

    
por 12.05.2014 / 09:21
4

Para executar o e-mail por meio de um script, você pode modificar sua regra assim 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 email no STDIN. Você terá que 'ecoar' o e-mail possivelmente transformado no STDOUT.

fw significa:

  • f Considere o pipe como um filtro.
  • w Aguarde 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 será filtrado.
  • c Gere uma cópia carbono deste e-mail. Isso só faz sentido na entrega de receitas. A única receita que não entrega esta bandeira tem um efeito sobre um bloco de aninhamento, a fim de gerar uma cópia carbono que irá clonar o processo procmail em execução (arquivos de bloqueio não serão herdados), pelo qual o clone irá proceder como de costume e os pais vai pular o bloco.

Referências

por 11.05.2014 / 20:08