você está aqui: Home  → Colunistas  →  Cantinho do Shell

 

Mala direta por email

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.

Banco de dados: Arquivo lista.txt

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

O programa

#!/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 Almeida 
To: $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.

Error: No site found with the domain 'moodle.idph.com.br' (Learn more)