Todos os dias recebemos um e-mail de, por exemplo, [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
}
Se o seu Procmail ou o MTA receptor estiver configurado para colocar uma
From_
linha antes da mensagem propriamente dita, esse pseudo-cabeçalho geralmente já contém a data. Você precisará analisá-lo, o que é uma chatice, portanto, a menos que este seja um sistema em que você realmente precise otimizar o desempenho (centenas de correspondências por segundo nesta condição?) A solução absolutamente mais fácil é chamardate +%Y%m%d
.Para corresponder a qualquer um dos dois cabeçalhos não relacionados, basta colocá-los em um regex com
|
:(Bug aqui; veja a atualização abaixo.)
As
fw
bandeiras não fazem sentido neste contexto, então eu as tirei (e, na verdade, não tenho certeza se aContent-type:
condição também faz muito sentido; a maioria das mensagens terá isso de qualquer maneira, hoje em dia).Se você tiver condições mais complexas que deseja combinar, pode usar um princípio fundamental da lógica chamado leis de Morgan. Não há sintaxe direta no Procmail para dizer "esta condição ou aquela condição", mas você pode refatorar isso para "não ((não esta condição) e (não aquela condição))".
Ou simplesmente use a pontuação;
Atualizar:
Parece
ripmime
que não suporta (extrair ou) nomear um anexo individual. A solução mais fácil é talvez umcron
trabalho que renomeie a última chegada um pouco antes da meia-noite (ou se você souber quando chegar, um pouco depois da última hora que você espera):Observe como (peculiarmente) você precisa dobrar quaisquer sinais de porcentagem em um
cron
comando! Obviamente, você reverteria a receita do Procmail acima para simplesmenteripmime
salvar em/dir/to/save/attachment
Como alternativa, eu renomearia o anexo logo após sua chegada, talvez ao mesmo tempo em que endurece consideravelmente as condições. O seguinte inclui uma boa quantidade de suposições sobre como exatamente a mensagem que entrega o anexo é codificada - ele pode escolher entre vários tipos de conteúdo diferentes, estruturas MIME, convenções de cabeçalho MIME, etc., portanto, provavelmente não funcionará sem alguns ajustes.
O
Content-type:
cabeçalho pode não conter o nome do arquivo; ele poderia (e hoje em dia deveria) ser especificado,Content-Disposition:
mas muitos remetentes o colocam em ambos os lugares para compatibilidade com versões anteriores. O nome do arquivo deve ser codificado corretamente em RFC2231, o que significa que vários campos opcionais podem ser preenchidos onde eu presumi convenientemente que eles estarão vazios, como eram quando os nomes de arquivos ASCII eram o único jogo na cidade.Observe também como eu exijo que o remetente e o assunto correspondam agora. O
HB ??
diz (imprecisamente) para procurar uma correspondência nos cabeçalhos da mensagem principal ou em algum lugar do corpo. Propriamente 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.Respondendo a cada uma de suas perguntas:
Você pode chamar comandos externos de dentro de uma receita, então você pode fazer algo assim para definir a variável
TODAY
:Você pode consultá-lo em suas receitas:
Se você precisar determinar o nome do arquivo dinamicamente, ajuste a receita de acordo.
Para filtrar um assunto e um remetente, você pode fazer algo como: