você está aqui: Home  → Arquivo de Mensagens

Envio de mensagens para múltiplos destinatários

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 20 de fevereiro de 2018

O envio de mensagens de email para múltiplos destinatários pode ser automatizado por meio de um programa em Shell muito simples.

O primeiro passo é montar o cabeçalho da mensagem, que deve conter, no mínimo, o nome do destinatário (To:), o nome do remetente (From:) e o assunto da mensagem (Subject:). Como exemplo, vamos utilizar uma versão resumida da primeira mensagem da Dicas-L, enviada no dia 3 de março de 1997 (já faz um tempinho, né?)

while read nome email
do
/usr/sbin/sendmail $email << EOF
From: Rubens Queiroz de Almeida <queiroz@dicas-l.com.br>
To: user@gmail.com
Subject: Receitas de uso do comando find

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 03 de Março de 1997

O comando find é extremamente poderoso e flexível
para descobrir arquivos que atendem a determinadas
especificações.

Por exemplo, suponhamos que queiramos descobrir todos os
arquivos que não possuem dono em nosso sistema. Esta
situação é extremamente comum, visto que usuários
são criados e apagados diariamente e ficam vagando
pelo sistema e podem eventualmente vir a comprometer a
segurança. O comando

find / -nouser -print

—-----------------------------------------------------------------------
As mensagens da Dicas-L são enviadas diariamente para
`wc -l lista.txt` assinantes.

EOF

done < lista.txt

Esta Shell usa um recurso muito útil, o Here Document. Com este recurso nós podemos fornecer ao programa um trecho de texto, que serão os dados entregues ao programa especificado, em nosso caso, o programa sendmail. O programa sendmail irá interpretar como entrada todos os caracteres que encontrar até que os caracteres EOF sejam encontrados na primeira posição da linha.

Observe também a seguinte frase:

As mensagens da Dicas-L são enviadas diariamente para
`wc -l lista.txt` assinantes.

Uma prática que tenho seguido há vários anos, é sempre inserir no rodapé das mensagens o número de assinantes da minha lista. No texto, este valor é inserido como um resultado do comando wc (word count), com a diretiva -l, que me fornece o número de linhas do arquivo que contém a lista dos assinantes.

Note que o comando é delimitado por aspas invertidas (que costumam chamar de crase, apesar de ser um acento grave e não uma crase), o que faz com que no texto seja inserido o resultado do comando wc -l, pois as crases, servem para dar prioridade de execução, por exemplo:

Arqs=ls 

Dessa forma eu estaria atribuindo o literal ls à variável $Arqs. Se eu quiser atribuir a saída do comando ls, eu deveria fazer:

Arqs=`ls` 

Como em qualquer interpretador as operações são feitas de cima para baixo e da esquerda para a direita, precisamos dizer ao Shell para ele priorizar o comando ls e isso se consegue de duas maneiras:

  1. Usando as crases como vimos;
  2. Usando construções do tipo $(CMDs) onde CMDs é a linha de comds que desejamos priorizar.

Eu poderia fazer algo semelhante com qualquer comando disponível no sistema. Nesta mesma linha, supondo que este seja um e-mail que eu mande diariamente, eu poderia substituir:

Data de Publicação: 03 de Março de 1997

Por:

 Data de Publicação: $(date "+%d de %B de %Y") 

No comando date, se houver um sinal de adição (+), tudo que for precedido por um porcento (%) é considerado um caractere de formatação de tempo, senão, será considerado um literal e:

%d Dia (01-31)
%B Mês por extenso
%Y Ano com século (4 algarismos)

Uma coisa muito pouco conhecida e que é provável que até você desconheça: 90% das vezes que usamos Here Document, prejudicamos a indentação porque o label utilizado (em nosso exemplo usei EOF) não pode ter espaços antes nem depois, mas o que é segredo de estado é que pode ter <TAB>s antes, desde que você use um hifen após os sinais de maior (<<-). Experimente fazer:

if ....
then
    ....
    cat <<- Fim
        No dia $(date)
        meu diretório tinha:
        $(ls -l)
    Fim
fi

IMPORTANTE: Antes da palavra Fim tem um <TAB>.



Veja a relação completa dos artigos de Rubens Queiroz de Almeida