você está aqui: Home → Colunistas → Cantinho do Shell
Por Rubens Queiroz de Almeida
Data de Publicação: 12 de Outubro de 2006
O exemplo de hoje mostra como montar um programa para envio de mala direta, por email, para diversos destinatários. Utiliza-se, para montar a lista de destinatários, um banco de dados em modo texto. A mensagem está embutida dentro da própria shell, utilizando um recurso chamado in here documents, ou, traduzindo, documento embutido.
O banco de dados para este exemplo consiste de linhas em que os campos são separados pelo caractere ":".
O objetivo do shell script é enviar, para uma lista de assinantes, o novo número de seu telefone celular. As mensagens devem ser personalizadas, com o nome do destinatário.
Rubens Queiroz de Almeida:queiroz@dicas-l.com.br:98761234 José Amâncio Bueno:amancio@example.com.br:99998888 Maria Aparecida Antunes:aparecida@example.com:81772976
#!/bin/bash IFS=: while read nome email telefone do echo $nome ... $email ... $telefone /usr/sbin/sendmail $email << EOF Subject: [EXAMPLE] Mudança do número de telefone From: Rubens Queiroz de AlmeidaTo: $nome <$email> A/C $nome Gostariamos de lhe comunicar que o novo número de seu telefone celular é $telefone. Atenciosamente, Serviço de Atendimento ao Cliente Example.Com EOF done < lista.txt
Passemos agora à explicação dos campos.
IFS=:
IFS significa INPUT FIELD SEPARATOR. No nosso banco de dados em modo texto, o caractere que separa os campos é ":".
while read nome email telefone
Esta diretiva sinaliza o início de um laço que irá ler, linha a linha, todo o conteúdo do arquivo lista.txt. O primeiro campo será atribuído à variável nome, o segundo à variável email e o terceiro à variável email.
echo $nome ... $email ... $telefone
Esta diretiva não faz nada de útil, apenas ecoa para a tela o valor das três variáveis à medida em que são lidas. Apenas para acompanhamento da execução do programa.
/usr/sbin/sendmail $email << EOF
Esta linha invoca o sendmail para o envio da mensagem. Aqui usamos o
IN HERE DOCUMENT. O texto que será processado pelo programa
sendmail vai da linha seguinte até encontrar, no começo da linha, os
caracteres EOF.
Uma mensagem eletrônica consiste do cabeçalho, seguida de uma linha
em branco e em seguida do corpo da mensagem. Podemos colocar quantas
linhas de cabeçalho desejarmos, dependendo do que necessitarmos. Neste
caso, identificamos o assunto da mensagem e o remetente (Subject
e From). Importante colocar também o campo To:, especificando,
como fizemos, o nome completo do destinatário e o email. Fazemos isto
para evitar que apareça na mensagem o texto undisclosed recipients,
que sinaliza que a mensagem foi enviada em lote, para dezenas ou centenas
de pessoas. Poderíamos colocar outros campos, como por exemplo
Reply-To, quando desejarmos que a resposta seja enviado para uma
pessoa que não seja o remetente.
O que vem em seguida é a mensagem. Note bem os pontos em que foram inseridas
as variáveis. Utilizamos aqui as variáveis $nome e $telefone.
IMPORTANTE: Como você está enviando mensagens para diversas pessoas,
antes de fazer o envio real, faça um teste para certificar-se de que
tudo está funcionando corretamente. A não ser que você seja realmente
um programador genial, a chance de cometer erros é grande. Para fazer
o teste, substitua a chamada ao sendmail por
/usr/sbin/sendmail queiroz@dicas-l.com.br << EOF
Observe que eu retirei a variável $email desta linha. As mensagens serão
enviadas apenas para meu endereço, para que eu possa verificar se tudo está
realmente correto. É claro que você não precisa enviar a mensagem de teste
para milhares de endereços. Para testar, crie um novo arquivo lista.txt
contendo apenas uns cinco ou dez endereços. É mais do que suficiente.
As aplicações desta receita são inúmeras e podem ser usadas em diversos contextos. Aqui vale a imaginação do programador.
Meus agradecimentos, mais uma vez, ao Papai do Shell, Júlio Neves, que foi quem me ensinou este truque.
Você conhece outra forma de fazer esta tarefa? Envie-nos suas idéias utilizando o campo de comentário a seguir.