De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Rubens Queiroz de Almeida
Data de Publicação: 11 de novembro de 2020
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 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 enviada 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.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários