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.