Eu tenho um cron job que busca novos emails de vários servidores de email a cada 20 minutos. O e-mail é classificado automaticamente nas caixas de correio Maildir em uma hierarquia sob ~/Mail
.
Quero ser notificado no shell se uma nova mensagem chegar em qualquer caixa de correio local nos últimos 20 minutos.
Estou usando o zsh
shell.
Como as caixas de correio Maildir são usadas, novos e-mails podem ser encontrados procurando por qualquer arquivo regular em qualquer diretório
new
chamado~/Mail
. Ignoramos o fato de que para um diretório ser uma caixa de correio Maildir legal , ele deve conter os três subdiretórioscur
,new
etmp
; assumimos ingenuamente que qualquer diretório chamadonew
faz parte de uma caixa de correio Maildir válida.Se o comando a seguir retornar algum resultado, teremos pelo menos uma nova mensagem:
... ou, se quisermos evitar procurar em
cur
diretórios (onde os e-mails já lidos são armazenados),... ou poderíamos observar a expansão de algum
zsh
padrão globbing de shell, como~/Mail/**/new/*(.[1])
(expande para o nome do caminho do primeiro arquivo regular em qualquernew
diretório abaixo~/Mail
). Se a expansão não corresponder a nada, não haverá novos e-mails.Podemos criar uma função shell que use o acima para imprimir uma notificação amigável se houver novo e-mail:
O
grep -q .
comando gera uma condição verdadeiraif
para a instrução se houver alguma saída defind
.Associando nossa função ao
periodic
"hook", ozsh
shell pode chamar a função periodicamente antes de imprimir o próximo prompt primário. Usamos isso para chamar a função automaticamente se mais de$PERIOD
um número de segundos se passaram desde a última vez que ela foi chamada (aPERIOD
variável é específica doperiodic
gancho usado abaixo).Agora, sempre que um novo arquivo for criado em um
new
diretório em algum lugar abaixo de~/Mail
, o textoYou have new mail
será exibido em algum momento dentro de 20 minutos, assumindo que o shell seja feito para redesenhar o prompt. Se o e-mail não for lido, a mensagem será exibida novamente em 20 minutos, antes que o shell redesenhe o prompt.Veja também:
zshmisc(1)
manual sobre funções de gancho .zshcontrib(1)
manual sobre como manipular funções de gancho (oadd-zsh-hook
comando).Criar uma função de gancho personalizada não é a única abordagem possível. Uma abordagem alternativa é usar a funcionalidade integrada do shell para notificações por email. Observando a página de manual do zsh , as notificações por email são controladas pelas seguintes variáveis de ambiente (semelhantes a outros shells, por exemplo, bash, ksh):
No entanto, como MAIL e MAILPATH são voltados para arquivos mbox , esta abordagem alternativa requer a execução de um script para manter um resumo atualizado sobre se há mensagens não vistas no arquivo
~/Mail
, por exemplo, no arquivo~/.maildir_unseen
, de uma forma que imite um arquivo mbox . As notificações podem então ser habilitadas definindo as variáveis de ambiente relevantes, por exemploPara manutenção
~/.maildir_unseen
, as opções são:~/Mail/new
, por exemplo, através de um cronjob~/Mail/new
para determinar quando atualizar~/.maildir_unseen
. Isso pode ser feito usando inotify-tools ou fwa . Por exemplo, usando fwa: