Gerenciamento com select
Ele pode ser útil na linha de comando ou em scripts. Possivelmente você já enfrentou
o problema de ter de excluir
um e-mail da fila antes que ele seja enviado ou manipular rapidamente as filas de impressão. Veremos
como lidar com essas situações usando o select.
Sua sintaxe é similar à sintaxe do for:
select VAR in <LISTA>;
do
comando 1;
comando 2;
done
O select gera uma lista de itens numerada como um menu de opções. Exemplo 1:
# select VAR in UM DOIS TRES; do echo $VAR ; done
1) UM
2) DOIS
3) TRES
#?
Você pode selecionar um item da lista pelo número que lhe foi atribuído.
1) UM
2) DOIS
3) TRES
#? 2
DOIS
Para criar um script de manipulação de e-mail é preciso conhecer um pouco o modo pelo qual os e-mails são armazenados quando estão na fila de saída. São criados dois arquivos no diretório /var/spool/mqueue, um contendo todo o cabeçalho e o outro a mensagem.
O nome do arquivo que possui o cabeçalho começa com os caracteres "qf" e seu conteúdo começa com "df" e ambos possuem o mesmo final. Exemplo 2:
qfff4KGnNw00773 = Arquivo de cabeçalho
dfff4KGnNw00773 = Arquivo de conteúdo
Você pode extrair o assunto de uma mensagem pesquisando a palavra chave "Subject" da seguinte forma Exemplo 3:
# grep Subject: /var/spool/mqueue/qfff4KGnNw00773
H??Subject: Outro teste de email
É possível extrair o autor da mensagem. Exemplo 4:
# grep From: /var/spool/mqueue/qfff4KGnNw00773
H?F?From: Edison Figueira <efigueira@brc.com.br>
Outra informação importante, nesse caso, é o tamanho do e-mail, que é exatamente o tamanho do arquivo "df" e pode ser extraído com um simples ls. Exemplo 5:
# ls /var/spool/mqueue/dff4KGnNw00773 |
awk {print $5}
30
Agora que sabemos como são armazenados os e-mails que estão na fila de saída, você já pode fazer seu script para dar manutenção neles. Vamos escrever este script totalmente na linha de comando, mas você poderá salvá-lo em um arquivo para não ter de escrevê-lo toda vez. Vamos criar uma lista de e-mails que estão na fila. Exemplo 6:
# for i in qf* ;do echo "$i:$(grep From: $i | awk {print $3})" ; done
qff4KGmHT00767:<efigueira@brc.com.br>
qff4KGnNw00773:<neto@brc.com.br>
qff4KJG4k01649:<mnegrao@brc.com.br>
Se substituirmos o parâmetro <LISTA> do comando
select pelo comando acima, aparece esta saída. Exemplo 7:
#select n in for i in qf* ;do echo "$i:$(grep From: $i | awk {print $3})" ; done;
do echo $n; done
1) qff4KGmHT00767:<efigueira@brc.com.br>
2) qff4KGnNw00773:<neto@brc.com.br>
3) qff4KJG4k01649:<mnegrao@brc.com.br>
#?
Desse modo você já tem um menu com a lista de e-mails na fila de saída. Agora crie uma lista de comandos para serem usados com essa lista de e-mails. Exemplo 8:
#select y in rm stat more ; do echo $y ; done
1) rm
2) stat
3) more
#?
Agora pegue o Exemplo 7 e substitua o comando echo $n no Exemplo 8. Assim:
#select n in for i in qf* ;do echo "$i:$(grep From: $i | awk {print $3})" ; done; do select y in rm stat more ; do echo $y $n ; done; done
1) qff4KGmHT00767:<efigueira@brc.com.br>
2) qff4KGnNw00773:<neto@brc.com.br>
3) qff4KJG4k01649:<mnegrao@brc.com.br>
#? 2
1) rm
2) stat
3) more
#? 1
rm qff4KGnNw00773:<neto@brc.com.br>
Use o CRTL+D para sair do select.
Agora existem duas variáveis importantes: em $y há o comando que escolhemos e em $n o QID+<FROM>. É preciso testar qual comando foi escolhido e executá-lo, de duas maneiras: if e case. Com o if:
#if [ "$y" -eq "rm" ]; then <executa o comando rm>; fi
Exemplo 9:
# select n in for i in qf* ;do echo "$i:$(grep From: $i | awk {print $3})" ; done; do select y in rm stat more ; do ID=echo $n|awk -F":" {print $1}|awk -F"qf" {print $2};if [ "$y" == "rm" ]; then rm -i ?f$ID ; elif [ "$y" == "stat" ]; then stat df$ID ;else more df$ID;fi ; done; done
No segundo select (o que tem os comandos), troque
a lista de comandos por outras mensagens: rm = Apagar o e-mail. stat = Ver tamanho e data. more = Ler o e-mail.
O exemplo anterior foi feito utilizando o sendmail como servidor de e-mail. Caso você use outro servidor de e-mail, terá de saber como seus e-mails são guardados. Outro detalhe que deve ser observado é que o sendmail tenta enviar
a mensagem diretamente sem criar fila, a fila só é criada quando a mensagem é um pouco grande ou quando
não foi possível enviar a mensagem em determinado
momento. Mas podemos forçar o sendmail a colocar as mensagens na fila sempre. Basta alterar o parâmetro DeliveryMode=background para DeliveryMode=q, que está no arquivo /etc/sendmail.cf. Como esse comando será utilizado várias vezes, você terá de salvá-lo em um arquivo. Segue abaixo a versão script:
#!/bin/bash
cd /var/spool/mqueue
select n in for i in qf* ;do echo "$i:$(grep From: $i | awk {print $3})" ; done; do
select y in rm stat more ;
do
ID=echo $n|awk -F":" {print $1}|awk -F"qf" {print $2};
if [ "$y" == "rm" ];
then
rm -i ?f$ID ;
elif [ "$y" == "stat" ];
then
stat df$ID ;
else
more df$ID;
fi ;
done;
done
Agora que você já conhece o potencial do select, poderá fazer um gerenciador de impressão.
Até a próxima!