Como extraio e ordeno o anexo de imagem dos emails?

1

Aqui está o que eu estava pensando:

Eu quero criar um quadro de imagem Raspberry Pi (DPF) para minha avó, mas com suporte básico por e-mail. Os e-mails podem ser enviados por seis membros da família e serão recebidos diariamente pelo fetchmail / procmail. Isso já funciona!

Em /home/pi/Mail/ agora tenho três arquivos (um para cada e-mail, incluindo anexos):

  • msg.nTIB
  • msg.pTIB
  • msg.oTIB

O que eu quero fazer agora é extrair SENDER, SUBJECT (, TEXT) e ANEXO de cada arquivo, para renomear a imagem de anexo e adicionar o texto com imagemagick (ainda não incluído).

for file in msg.*; do
    export SENDER='tee $file | formail -zxFrom: -zxReply-To:|cut -fs- -d'<'|cut -f1 -d'>''
    SUBJECT = '/bin/cat $file | formail -zxSubject:'

    if grep -qxis $SENDER /home/pi/Mail/.markus; then
        SENDER2=Markus
    fi
    if grep -qxis $SENDER /home/pi/Mail/.someone; then
        SENDER2=Someone
    fi

    /bin/mkdir -p /home/pi/Mail/$SENDER2 >/dev/null 
    munpack -C /home/pi/Mail/$SENDER2 $file
    /bin/cat $file
    /bin/rm $file
done

A parte grep e munpack funciona bem, mas a extração de SENDER e SUBJECT não funciona quando eu executo o arquivo sh. Parece que ele congelou. Eu só posso cancelá-lo com ctrl - c !

Não sei porque, quando incluo as linhas 2 e 3 no meu .procmailrc , funciona sem problemas.

Quero dizer que esta é uma tarefa básica e sem feitiçaria, mas não encontrei nada de útil com o google :/

Qualquer ajuda é apreciada! Talvez você tenha outra solução. Eu não sou totalmente especialista em Linux, então talvez seja um pouco simples :)

    
por Markus 08.02.2015 / 16:48

1 resposta

1

Tanto o cat quanto o tee são inúteis ; o tee duplamente, e a razão para (o que você percebe) o congelamento do script. Requer um argumento de nome de arquivo, como o arquivo para copiar sua entrada, e um fluxo de texto ou dados na entrada padrão, o que obviamente não está recebendo, então fica lá.

Além disso, você deve geralmente citar suas variáveis .

A extração SENDER é meio problemática. Você realmente quer que a variável contenha duas strings? Normalmente, você poderia simplesmente fazer formail -rtzxTo: <"$file" e obter um resultado sensato. (A opção -t tem alguma semântica obscura, mas para esse tipo de finalidade, provavelmente faz a coisa certa.) Isso também acaba com o incômodo cut s para obter apenas o terminal de email (porque formail na geração de resposta modo já faz isso para você).

Por fim, a sintaxe sh não permite espaços em branco ao redor das atribuições de sinal de igual.

for file in msg.*; do
    SENDER=$(formail -zxFrom: -zxReply-To: <"$file" |
        cut -fs- -d'<'|cut -f1 -d'>')
    SUBJECT=$(formail -zxSubject: <"$file")

    if grep -qxis "$SENDER" /home/pi/Mail/.markus; then
        SENDER2=Markus
    elif grep -qxis "$SENDER" /home/pi/Mail/.someone; then
        SENDER2=Someone
    fi

    mkdir -p /home/pi/Mail/"$SENDER2"
    munpack -C /home/pi/Mail/"$SENDER2" "$file"
    cat "$file"
    rm "$file"
done

Também removi os caminhos completos dos nomes dos comandos (você deve simplesmente certificar-se de que seu PATH é são) e alternou da sintaxe de substituição do processo 'obsolescent' para $(modern) . mkdir -p é executado silenciosamente, por isso removi o redirecionamento de saída disso.

O complexo grep pode ser substituído por um mapeamento simples, algo assim:

SENDER2=$(awk -v who="$SENDER" '
    $1 == who { print $2; x=1 } END { exit 1-x }' <<'________HERE'
        [email protected]    Markus
        [email protected]  Someone
________HERE

Isso faz suposições sobre o que você tem nos arquivos que você está usando atualmente, mas você deve ter a idéia. Isso ainda não resolve como definir SENDER2 se você não tiver o remetente arquivado; mas talvez o script simplesmente rejeite esses arquivos por motivos de segurança?

    
por 09.02.2015 / 07:21