procmail salvar anexo com data de recebimento no nome do arquivo

2

Todos os dias recebemos um e-mail de, e. [email protected] com um anexo, o nome do arquivo é, por exemplo, report.xlsx

Como posso salvar o arquivo com a data de recebimento? por exemplo. 20180131_report.xlsx e como posso filtrar o assunto ou o remetente?

Meu ~ / .procmailrc :

:0
*^content-Type:
{
    :fw
    | ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment
}
    
por FaxMax 02.02.2018 / 14:24

2 respostas

6

Se o seu Procmail ou o MTA destinatário estiver configurado para colocar uma From_ line antes da mensagem propriamente dita, este pseudo-cabeçalho geralmente já contém a data. Você precisará analisá-lo, o que é um empecilho, portanto, a menos que seja um sistema em que você realmente precise otimizar o desempenho (centenas de correspondências por segundo nessa condição?), A solução mais fácil é chamar date +%Y%m%d . / p>

Para combinar em um dos dois cabeçalhos não relacionados, basta colocar os dois em uma expressão regular com | :

:0
* ^Content-type:
* ^From:(.*\<)?foo@example\.tld|^Subject: Your daily report
| ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment/$(date +%Y%m%d)_report.xslx

(bug aqui; veja a atualização abaixo.)

As sinalizações fw não fazem sentido neste contexto, então eu as tirei (e, na verdade, não tenho certeza se a condição Content-type: faz muito sentido também; a maioria das mensagens terá de qualquer maneira, nos dias de hoje ).

Se você tem condições mais complexas que você deseja combinar, você pode usar um princípio fundamental da lógica chamado leis de Morgan. Não existe nenhuma sintaxe direct no Procmail para dizer "esta condição ou essa condição", mas você pode refatorar isto para" não ((não esta condição) e (não essa condição)). "

:0
* ! this condition
* ! that condition
{ } # nothing happens here
:0E # else
{ LOG="at least one of them matched
" }

Ou simplesmente use pontuação;

:0
* 1^0 this condition
* 1^0 that conditon
{ LOG="at least one of them matched
" }

Atualização:

Parece que ripmime não suporta (extraindo ou nomeando) um anexo individual. A solução mais fácil é talvez um trabalho cron que renomeia a chegada mais recente um pouco antes da meia-noite (ou se você sabe quando ela chega, um pouco depois da última vez que você espera):

 55 23 * * * cd /dir/to/save/attachment && mv report.xslx "$(date +%%Y%%m%%d)"_report.xslx

Observe como (peculiarmente) você precisa dobrar qualquer sinal de porcentagem em um comando cron ! Você obviamente reverteria a receita do Procmail acima para simplesmente ter ripmime save em /dir/to/save/attachment

Alternativamente, eu mudaria o nome do anexo logo depois que ele chegasse, talvez ao mesmo tempo em que aumentasse consideravelmente as condições. O que se segue inclui uma quantidade razoável de adivinhação de como exatamente a mensagem que entrega o anexo é codificada - ele pode escolher entre vários tipos de conteúdo, estruturas MIME, convenções de cabeçalho MIME, etc. provavelmente não funciona sem alguns ajustes.

:0
* ^From:(.*\<)?foo@example\.tld
* ^Subject: Your daily report
* HB ?? ^Content-type: application/(octet-stream|vnd\.openxmlformats-officedocument\.spreadsheetml\.sheet|vnd\.ms-here-be-dragons-xslx); filename="?report.xslx
| ( cd dir/to/save/attachment; \
    ripmime --overwrite --no-nameless -i - -d . && \
    mv report.xslx $(date +%Y%m%d)"_report.xslx )

O cabeçalho Content-type: pode não conter o nome do arquivo; ele poderia (e esses dias devem) ser especificados em Content-Disposition: , mas muitos remetentes os colocam em ambos os lugares para compatibilidade com versões anteriores. O nome do arquivo deve ser corretamente codificado com RFC2231, o que significa que vários campos opcionais podem ser preenchidos onde eu convenientemente assumi que eles estarão vazios, como eram quando os nomes de arquivos ASCII eram o único jogo na cidade.

Observe também como eu preciso do remetente e do assunto para corresponder agora. O HB ?? diz (imprecisamente) para procurar uma correspondência nos cabeçalhos das mensagens principais ou em algum lugar do corpo. Corretamente falando, a correspondência deve estar nos cabeçalhos de uma parte do corpo MIME no último caso, mas o Procmail não tem uma maneira fácil de especificar isso.

    
por 02.02.2018 / 15:38
3

Respondendo a cada uma das suas perguntas:

  1. Você pode chamar comandos externos de dentro de uma receita, para poder fazer algo assim para definir a variável TODAY :

    TODAY='date +%Y%m%d'
    

    Você pode consultá-lo em suas receitas:

    ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment/$TODAY_report_xlsx
    

    Se você precisar determinar o nome do arquivo dinamicamente, ajuste a receita de acordo.

  2. Para filtrar um assunto e um remetente, você pode fazer algo como:

    :0
    * ^content-Type:
    * ^From:.* [email protected]
    * ^Subject:.*Report
    {
    ....
    
por 02.02.2018 / 15:16