Melhor maneira de excluir mensagens de e-mail selecionadas do arquivo mbox usando script

5

Eu tenho um arquivo de mensagens de e-mail arbitrário no formato mbox. Eu gostaria de periodicamente (fim da semana), e automaticamente (via cron) limpar as mensagens do meu arquivo mbox "alertas" (nova pasta) apenas de um remetente (ou com um assunto específico), porque um remetente vamos chamá-lo ' [email protected] 'envia dezenas de mensagens por dia.

Eu quero fazer isso cronicamente, então, diariamente, ele fará o que eu digitar manualmente com mutt -f alerts; D; [email protected]; $; y (purge)

.procmailrc não é uma opção porque eu preciso passar por cima deles primeiro. Depois de ter desnatado eles estão bem. No final da semana eles não são mais necessários e querem que sejam removidos.

    
por Stickley 29.04.2016 / 21:52

2 respostas

3

Esta tarefa do cron faz o que você especificou diariamente à meia-noite:

0 0 * * * script >/dev/null -c 'env TERM=vt100 mutt -F/dev/null -falerts -e "push <delete-pattern>[email protected]<enter><sync-mailbox>y<enter><exit>"' /dev/null

Vamos quebrar isso.

script -c 'cmd' corre cmd sob uma falsa pseudo-tty (pty), de modo que cmd acha que tem um terminal com mobilidade de cursor e tal. Mutt precisa disso, mas seu trabalho no cron não pode ter isso. Script fornece o calço. O trabalho usual do script é gravar uma sessão de comando em um arquivo. Seu argumento final, /dev/null , diz para gravar o registro no dispositivo nulo, já que você provavelmente não se importa com um monte de eventos curses replayable.

env TERM=vt100 ... significa colocar um terminal vt100 no ambiente antes de executar o mutt. Você precisa disso porque as tarefas do cron não têm um tipo de terminal natural (já que elas não têm naturalmente um terminal).

Tudo o resto faz parte do mutt. Usamos -F/dev/null para garantir que seu .muttrc não seja lido. Não há nada de errado em lê-lo, mas mudanças em seu muttrc podem mudar a maneira como a interação com o mutt vai. É mais seguro, a longo prazo, usar apenas o padrão muttrc, que é o que o -F/dev/null faz.

A opção -e diz ao mutt o que fazer quando é executado. Os argumentos para -e são comandos que você pode colocar em um arquivo muttrc: set , alternatives , bind , hdr_order , etc. Push é um comando que "pressiona" pressionamentos de teclas no buffer do teclado , então o mutt interpreta o que segue como se você tivesse digitado.

Agora vamos ver as teclas virtuais.

<delete-pattern>[email protected]<enter> equivale a pressionamentos de tecla [email protected] mais ENTER, mas usa símbolos de vinculação de teclado em vez de pressionamentos de tecla reais. Essa é uma prática recomendada para macros e para pushes, porque ela isola seu script em relação a alterações de atalhos padrão ou pessoais. Você pode obter símbolos de ligação de chaves da ajuda interativa. Todos os nomes na coluna do meio (que você usa com a instrução bind ) são nomes de símbolos.

<sync-mailbox> é equivalente a pressionar $ , novamente com o símbolo de chave em vez do pressionamento de tecla. y<enter> responde ao "Tem certeza?" prompt.

Finalmente, <exit> sai do mutt. Isso também encerra sua sessão script e seu comando cron termina. O >/dev/null , de costume com o cron, impede que qualquer ruído do cron assedie sua caixa de correio.

Observe que toda a string push é citada! Isso é importante. Felizmente, só precisamos de duas camadas de citações, para que possamos usar aspas duplas dentro de singles sem nenhuma citação ridícula.

    
por 04.05.2016 / 21:17
2

Você pode usar mutt para fazer isso de cron com expect (ou uma de suas muitas implementações em muitos outros idiomas).

#!/usr/bin/env expect
spawn mutt -f alerts
expect -ex "Mutt" # or something if you've customized the display
send -- "D"
send -- "[email protected]"
...

Outra opção seria escrever um código que faça algo semelhante por meio de algo como Mail :: Box :: Mbox .

    
por 29.04.2016 / 22:39