Processamento / classificação de mensagens de um arquivo de caixa de correio?

1

Eu obtive um arquivo de caixa de correio ("Mboxrd") criado por getmail , e gostaria de "processá-lo" classificando mensagens de vários (grupos de) remetentes e movê-los para separar arquivos de caixa de correio ( Eu acho que 3-5 por enquanto). Idealmente, as mensagens de e-mail assim movidas devem ser excluídas do arquivo de caixa de correio original.

Eu provavelmente gostaria de classificar as mensagens pelo remetente - embora seja possível classificá-las por Assunto (ou seja, certas palavras / frases) também seria bom ...

Agora, se essas mensagens tivessem acabado de ser recebidas no meu computador MTA - ou se eu tivesse configurado getmail para entregar e-mails para o MTA - eu acho que poderia usar procmail da maneira normal ... No entanto , o que eu tenho é um arquivo "morto" com mensagens de correio já armazenadas, então isso não é uma opção. Eu acho que poderia enviar o email através do MTA, mas certamente deve haver uma maneira de processar o email como ele é (no arquivo)?

Então, existe um programa ou comando - ou algumas opções especiais para procmail ou um comando similar - que me "ordena" o e-mail em um arquivo de caixa de correio em vários outros arquivos de caixa de correio, com base no remetente / assunto das mensagens? Um pequeno exemplo (por exemplo, do arquivo de configuração) também seria apreciado ...

    
por Baard Kopperud 16.01.2017 / 00:32

2 respostas

3

O método formail -s está documentado com um script de demonstração na procmail man page ; procure esta frase:

Procmail can also be invoked to postprocess an already filled system mailbox.

Você também acharia isso no link

Se a sua caixa de correio não for um arquivo único do mbox Berkeley, é provável que você tenha um diretório em que cada arquivo seja uma mensagem individual. Neste caso, você pode processá-lo simplesmente com

for f in folder/*; do
    procmail -options <"$f"
    # maybe rm "$f" to remove the original after processing completes
done

Como um exemplo de como filtrar por remetente, uma receita simples seria algo como

# If your mailbox destination is maildir, no locking is required
:0:  # so you could lose the second colon here, and in subsequent examples
* ^From:.*\<alice@example\.com\>
alice

:0:
* ^From:.*\<bob@example\.net\>
bob

Isso examina o cabeçalho "De:" que normalmente é o que as pessoas querem dizer com "remetente", embora haja dois outros campos em uso comum (o remetente do envelope, que geralmente é em Return-Path: , eo cabeçalho Sender: real que é opcional, mas freqüentemente preenchido pelo software de envio quando o cabeçalho From: não é o remetente real).

Da mesma forma, para classificar por Subject: , basta especificar um regex que corresponda aos assuntos que você deseja capturar.

:0:
* ^Subject: *((Fwd?|Re): *)*\[gunk]
gunk-list

encontra mensagens com cabeçalhos de assunto que contêm o rótulo [gunk] , opcionalmente precedido por espaço em branco e / ou Re: e / ou Fw: e / ou Fwd: .

    
por 16.01.2017 / 07:01
2

Supondo que seu arquivo de caixa de correio esteja no formato mbox, você pode usar o utilitário formail que vem com o procmail para executar um comando em cada email, com a opção -s para informar que a entrada é uma caixa de correio e não apenas um único email. Esse comando pode ser procmail se você quiser aplicar as regras do procmail, ou pode ser qualquer outra coisa que receba o email na entrada padrão e faça o que quiser com ele.

formail -s procmail <Mboxrd && mv Mboxrd Mboxrd.done

Outra abordagem seria carregar a caixa de correio no mutt e aplicar algumas macros. Isso tem a vantagem de ser agnóstico para o formato da caixa de correio, mas tem a desvantagem de que as macros mutt podem ser enigmáticas (não necessariamente mais enigmáticas do que as regras do procmail). Outra vantagem de usar o mutt é que ele pode mover um e-mail de cada vez, portanto, se for interrompido no meio do caminho, ele poderá continuar de onde parou.

    
por 16.01.2017 / 01:05