receita do procmail para filtrar emails para várias pastas

2

Atualmente minhas receitas do procmail são as seguintes:

 FROM_='formail -c -x"From "| awk '{ print $1 }''

 SUBJ_='formail -c -x"Subject:" | sed -e 's/^[ ]*//g' -e 's/[ ]*$//g''

 :0
 *^Subject:.*(60)
 {
  :0 fwh
  | formail | (echo "$FROM_"; echo "$SUBJ_";)

  :0 fwb
  | formail -I ""

  :0
  myemail/
 }

Minha receita do procmail somente filtrará os e-mails com o número "60" no assunto. Depois disso, o formulário será executado, retirando o endereço de e-mail do remetente e seu assunto antes de encaminhá-lo junto com seu conteúdo para o diretório "myemail".

Alguém pode me ajudar a construir uma receita do procmail para filtrar e-mails recebidos em diretórios diferentes se houver vários "60" separados por vírgulas nos assuntos?

(Por exemplo, o email com o assunto 6010,6011,6012, .. o 6010 vai para a pasta 6010, o 6011 vai para o 6011 e assim por diante.)

Os números no assunto são números de telefone, pode haver um grande número de diferentes, então enumerar todas as correspondências possíveis não é realmente uma opção.

    
por user119720 27.12.2012 / 05:06

1 resposta

1

Se as caixas de correio forem diretórios, você poderá listar todos eles em uma única ação de entrega. Então tudo se torna tão simples quanto

:0
* ^Subject:.*60
'formail -zxSubject: | egrep -o 60[0-9]+ | sed 's%$%/%''

O script nos backticks produzirá algo como 60123456789/ (newline) 609876543210/ (newline) - quantos forem os números de telefone; cada um é tratado como um nome de pasta e a mensagem é entregue a todas essas pastas.

(Tenho certeza que o egrep | sed pode ser refatorado em um único script sed . Adicionar uma barra após cada nome de pasta é necessário para o Procmail tratar a entrega como uma entrega de diretório. Não é possível entregar em várias mbox pastas ao mesmo tempo.)

Minha resposta original segue abaixo da linha.

O que você está perguntando é bastante complicado de fazer no Procmail. Não há facilidade para loop em um conjunto de correspondências. Uma solução um pouco desesperada seria coletar as correspondências em uma variável e, em seguida, INCLUDERC= em um arquivo de receita diferente, que processará um valor desde o início da variável, então SWITCHRC= para si mesmo enquanto houver valores restantes na variável . Não precisa ser muito complicado, mas é decididamente difícil, a ponto de você precisar perguntar se o Procmail é realmente a ferramenta certa para o trabalho.

Naturalmente, há também a opção de força bruta; crie uma sequência de receitas para lidar com cada padrão 60xx possível.

:0c
* ^Subject:.*6000
myinbox/6000/

etc para 6001, 6002. Isto pressupõe que você tenha um número limitado destes, ou se você precisa lidar com cada caso de 00 a 99, talvez gerar as receitas com um script simples.

perl -e 'printf ("%02i\n", $_) for 0..99' |
while read i; do
    cat <<____HERE
    :0c
    * ^Subject:.*60$i
    myinbox/$i/
____HERE
done >60xx.rc
    
por 31.12.2012 / 11:41