Como pegar a mensagem não lida mais antiga de 'mail' em um script?

5

Em um script que estou tentando terminar de escrever agora, preciso obter a mensagem não lida mais antiga da caixa de correio do usuário atual (especificamente, preciso da linha de assunto para este projeto).

Depois de extrair a mensagem mais antiga, também preciso encaminhá-la para um usuário diferente para fins de arquivamento.

Como posso extrair apenas essa informação no bash ou no Python?

Seria melhor usar as para extrair a linha de assunto um arquivo e depois encaminhar a mensagem, exigindo apenas processamento de arquivos pelo script? Se sim, como eu poderia fazer isso?

    
por warren 28.04.2014 / 19:04

3 respostas

2

Em sistemas mbox convencionais, a primeira mensagem em /var/mail/you é - por definição - não lida e a mais antiga disponível.

formail -zxSubject: -1 -s </var/mail/you

Para extrair a mensagem para um arquivo (para que você possa encaminhar convenientemente apenas essa mensagem) e extrair o cabeçalho Subject: , tente algo como

tmp=$(maketemp -t findoldestunread.XXXXXXXX) || exit 127
trap 'rm -f $tmp' EXIT   # remove temp file when done
trap 'exit 1' 1 2 3 5 15 # remove also in case of error / interruption
formail -1 -s </var/mail/you >"$tmp"
formail -zxSubject: <"$tmp"
sendmail -oi [email protected] <"$tmp"

No Maildir, a situação é um pouco mais complexa. Novas mensagens são temporariamente armazenadas em tmp e depois movidas para cur . O nome do arquivo indica sinalizadores; em tantas palavras , procure um nome de arquivo que contenha uma vírgula perto do final, em que S não está entre os caracteres após a vírgula.

find path/to/Maildir/cur -maxdepth 1 -type f \
    -regex '.*,[^S,]*$' -printf '%C@ %p\n' |
sort | sed '1s/^[^ ]* //;q' | xargs formail -zxSubject:

O especificador de formato printf imprime o registro de data e hora primeiro para facilitar a classificação. Classificamos, pegamos a primeira linha, cortamos o registro de data e hora e o alimentamos para formail para extrair o cabeçalho Subject: . (Isso obviamente irá quebrar se você tiver nomes de arquivos com novas linhas ou algo assim; há maneiras de contornar isso, mas eu sou preguiçoso e prático aqui.)

Refatorar apenas para imprimir o nome do arquivo deve ser trivial neste caso - basta remover o canal para xargs e capturar a saída em uma variável.

Algumas implementações do Maildir também terão um índice de algum tipo que pode tornar essa tarefa muito mais fácil e rápida do que percorrer toda a caixa de correio no sistema de arquivos, mas novamente, sem mais conhecimento sobre qual implementação você está usando, uma nota especulativa neste momento.

Se a sua caixa de correio não estiver em nenhum desses dois formatos (você é estranho e), será necessário atualizar sua pergunta com mais detalhes.

Sua referência a mail implica que você provavelmente está usando um sistema tradicional de Berkeley mbox , mas existem muitas versões, algumas das quais são um pouco esotéricas.

    
por 29.04.2014 / 09:40
1

O comando mail pode ser usado de forma não interativa para imprimir a lista de e-mails na caixa de entrada:

mail -H | head -1
>U     1  [email protected] Tue Apr 29 14 08:13 18/774    "Subject of mail"
    
por 29.04.2014 / 09:51
-1

Existem pelo menos três formatos de entrega de email. Ajudaria saber qual você está usando.

formail lerá um arquivo de mensagens e poderá enviar cabeçalhos de uma determinada mensagem através das opções skip e total. Isso pressupõe que as mensagens foram entregues em um arquivo conhecido. Se você quiser arquivar todas as mensagens, isso seria uma ferramenta adequada.

procmail é mais adequado para arquivar as mensagens à medida que elas chegam. Pode ser facilmente configurado para enviar uma cópia para outro endereço durante a entrega. Existem métodos padrão para evitar bloqueios de correio e ignorar determinados tipos de mensagens.

    
por 29.04.2014 / 05:28