AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 421433
Accepted
FaxMax
FaxMax
Asked: 2018-02-03 05:24:22 +0800 CST2018-02-03 05:24:22 +0800 CST 2018-02-03 05:24:22 +0800 CST

procmail salvar anexo com data de recebimento no nome do arquivo

  • 772

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
}
email procmail
  • 2 2 respostas
  • 4170 Views

2 respostas

  • Voted
  1. Best Answer
    tripleee
    2018-02-03T06:38:40+08:002018-02-03T06:38:40+08:00

    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 é chamar date +%Y%m%d.

    Para corresponder a qualquer um dos dois cabeçalhos não relacionados, basta colocá-los em um regex 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 fwbandeiras não fazem sentido neste contexto, então eu as tirei (e, na verdade, não tenho certeza se a Content-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))".

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

    Ou simplesmente use a pontuação;

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

    Atualizar:

    Parece ripmimeque não suporta (extrair ou) nomear um anexo individual. A solução mais fácil é talvez um crontrabalho 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):

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

    Observe como (peculiarmente) você precisa dobrar quaisquer sinais de porcentagem em um croncomando! Obviamente, você reverteria a receita do Procmail acima para simplesmente ripmimesalvar 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.

    :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 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.

    • 7
  2. mjturner
    2018-02-03T06:16:01+08:002018-02-03T06:16:01+08:00

    Respondendo a cada uma de suas perguntas:

    1. Você pode chamar comandos externos de dentro de uma receita, então você pode 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
      {
      ....
      
    • 3

relate perguntas

  • Mutt abook consulta vazia

  • Lidando com portas SMTP não padrão com sendmail -t

  • Como posso adicionar um anexo com o Sendmail (opções limitadas)?

  • Uma "exclusão segura" pode ser implementada para um servidor IMAP no modo Maildir?

  • Recebendo e-mail em um novo Debian fresco

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve