Antispam em Shell Script

O funcionamento do esquema proposto neste artigo não pretende ser a melhor forma de bloquear emails indesejáveis, existem melhores opções para isto. Serve para exemplificar o poder do shell script junto com ferramentas do sistema normalmente encontradas na maioria das distribuições Linux.

[ Hits: 20.406 ]

Por: Jorge Alberto Corso em 02/02/2009


Bloqueando automaticamente remetentes dos emails



Preparação dos arquivos emails_bloqueados.txt e emails_permitidos.txt.

Estes arquivos serão lidos pelos shell scripts linha a linha, então para bloquear ou permitir um determinado email edite o arquivo e acrescente em uma linha o email completo ou parte dele para o fim desejado, basta uma parte pois essa informação servirá como fonte de pesquisa para as regras do procmail que funcionam como expressão regulares.

Exemplos:

Arquivo: emails_bloqueados.txt

alice@propaganda.com.br
best@bestsell.com
modelo@modelo.com.au
@viagra
com.jp
microsoft

Com os dados acima o destinatário não receberá os emails enviados pelos remetentes: alice@propaganda.com.br, best@bestsell.com, modelo@modelo.com.au. Também não receberá nenhum email que possua "@viagra", "com.jp" ou "microsoft" em sua composição.

Arquivo: emails_permitidos.txt

vivaolinux.com.br
@brlinux.org.br
amigo@amigo.com.br
familia@uol.com.br

Com os dados acima o destinatário receberá os emails enviados pelos remetentes: amigo@amigo.com.br e familia@uol.com.br, também receberá emails que possuam na sua composição "vivaolinux.com.br" ou "@brlinux.org.br".

Após a execução dos shell scripts estas listas serão ordenadas em ordem alfabética.

O shell script gera_emails_bloqueados.sh (os números no começo das linhas servem apenas como referência):

1  #!/bin/bash
2  #
3  # remover o arquivo atual de emails bloqueados
4  rm -f ./bloqueados.rc
5  #
6  # comando for para ler linha a linha o arquivo emails_bloqueados.txt
7  # e para cada linha lida acrescentar 4 novas linhas no arquivo
8  # bloqueados.rc
9  # Atenção para as crases que envolvem o comando cat
10  # não confundir com aspas simples.
11  for i in `cat ./emails_bloqueados.txt`
12  do
13          echo ":0" >> ./bloqueados.rc
14          echo "* ^FROM.*$i" >> ./bloqueados.rc
15          echo "/dev/null" >> ./bloqueados.rc
16          echo "" >> ./bloqueados.rc
17  done
18  # Apos todas as regras de emails bloqueados se a analise chegar
19  # nas linhas abaixo indica que o destinatário do email não se
20  # encontra nas listas de emails_permitidos e emails_bloqueados
21  # então
22  # um email de aviso de bloqueio para próximos
23  # emails sera enviado para o remetente e o email atual ira para o seu
24  # destino.
25  #
26  # Faz uma copia do email para o arquivo temporário
27  # email_bloqueado.tmp para poder extrair o email do remetente
28  # com o comando formail no shell script gera_emails_bloqueados.sh
29  echo "" >> ./bloqueados.rc
30  echo ":0 wc" >> ./bloqueados.rc
31  echo "*" >> ./bloqueados.rc
32  echo "./email_bloqueado.tmp" >> ./bloqueados.rc
33  echo "" >> ./bloqueados.rc
34  #
35  # Envia o email atual para a caixa postal do seu destino
36  echo ":0 wc" >> ./bloqueados.rc
37  echo "*" >> ./bloqueados.rc
38  echo "/var/mail/destino" >> ./bloqueados.rc
39  echo "" >> ./bloqueados.rc
40  #
41  # Executa o shell script gera_email_retorno.sh para enviar o email
42  # de aviso para o remetente que o email dele esta bloqueado
43  # para este destinatário.
44  echo ":0 fwc" >> ./bloqueados.rc
45  echo "*" >> ./bloqueados.rc
46  echo "|~/gera_email_retorno.sh" >> ./bloqueados.rc
47  echo "" >> ./bloqueados.rc
48  #
49  # Como ultima regra deixa preparado para executar esse próprio
50  # shell script (gera_emails_bloqueados.sh) para o próximo email em
51  # que o remetente não se encontrar nas listas de emails permitidos
52  # e bloqueados.
53  echo ":0 fw" >> ./bloqueados.rc
54  echo "*" >> ./bloqueados.rc
55  echo "|~/gera_emails_bloqueados.sh" >> ./bloqueados.rc

Na linha 38 deve-se trocar o local "/var/mail/destino" para o local e nome de arquivo onde está a caixa postal do destinatário, por exemplo, os emails que recebo ficam armazenados no arquivo de nome "jorge" no diretório "/var/mail", então deveria ficar "/var/mail/jorge".

O shell script gera_email_retorno.sh (os números no começo das linhas servem apenas como referência):

1  #!/bin/bash
2  #
3  # Extrai o remetente do email armazenando na variável DE do arquivo temporário
4  # email_bloqueado.tmp criado pelo shell script gera_emails_bloqueados.sh com o
5  # conteúdo do email enviado. Atenção que o comando formail esta envolvido
6  # com crase e não com aspas simples (apostrofo).
7  DE=`formail -rt -zxTo: < ./email_bloqueado.tmp`
8  #
9  # Faz o mesmo que o comando acima, extraindo o destinatário ao invés do
10  # remetente.
11  PARA=`formail -xTo: < ./email_bloqueado.tmp`
12  #
13  # O mesmo que o comando acima, extraindo o assunto.
14  ASSUNTO=`formail -xSubject: < ./email_bloqueado.tmp`
15  #
16  # Armazena na variável TEXTO o corpo do email que sera enviado
17  TEXTO="O email enviado para $PARA com o assunto $ASSUNTO, foi entregue ao seu destino, porem "
18  #
19  # Continua montando o corpo do email acrescentando o conteúdo do arquivo
20  # msg.txt, para isto utilizo o comando cat. Atenção são crases que envolvem
21  # o comando cat e não ha espaço apos $TEXTO.
22  TEXTO=$TEXTO`cat msg.txt`
23  #
24  # O & (e comercial) eh a preparação para a formatação da URL que estará como
25  # link no corpo do email. A mensagem deste email solicita o acesso a um site
26  # que ao ser acessado envia automaticamente solicitando o desbloqueio deste
27  # remetente do arquivo de emails_bloqueados.txt
28  TEXTO=$TEXTO$DE'&i_dest=seu_email@dominio'
29  #
30  # O comando abaixo inclui o email do remetente no arquivo de emails_bloqueados.txt
31  echo $DE >> ./emails_bloqueados.txt
32  #
33  # Envia o email para o remetente.
34  echo $TEXTO | mail -s "Email bloqueado !" $DE
35  #
36  # Exclui o arquivo temporário.
37  rm -f ./email_bloqueado.tmp

Na linha 28 deve-se trocar para o seu email após o sinal de igual, esta informação é básica para o programa PHP enviar novo email para você decidir se irá desbloquear o remetente do email bloqueado ou não.

O conteúdo do arquivo "msg.txt" citado na linha 22 é:

Seu email foi bloqueado para as próximas mensagens.
Favor acessar o link indicado e siga as Instruções para desbloqueá-lo em definitivo.
http://www.seusite.com.br/email_desbloqueio.php?i_email=

A URL na última linha do arquivo msg.txt será completada dentro do shell script gera_email_retorno.sh, por isto ela termina com o sinal de igual. O programa em PHP que estará na site utilizará das variáveis i_email e i_dest para enviar o email.

O programa PHP (os números no começo das linhas servem apenas como referência):

1  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2  <html>
3  <head>
4  <title>Desbloqueio de Emails</title>
5  </head>
6  
7  <?php
8  $form["dest"] = $HTTP_GET_VARS["i_dest"];
9  $form["novo_email"] = $HTTP_GET_VARS["i_email"];
10  ?>
11       <table align='center'>
12                          <tr>
13                                  <td colspan=2>Para evitar os emails indesejaveis criamos uma lista com os emails permitidos e outra com os emails bloqueados.
14                                  </td>
15                          </tr>
16                          <tr colspan=2>
17                                  <td>Os emails que nao estao nas listas sao enviados aos seus respectivos destinatarios, porem sao incluidos na lista de emails bloqueados.
18                                  </td>
19                          </tr>
20                          <tr>
21                                  <td>Com o acesso a esta pagina foi solicitado que o email <?=$form["novo_email"]?> seja incluido na lista de emails permitidos.
22                                  </td>
23                          </tr>
24                          <tr>
25                                  <td>Cabera ao destinatario que receber essa solicitacao incluir o remetente na lista de emails permitidos,
26                                  </td>
27                          </tr>
28                          <tr>
29                                  <td>enquanto isto nao for feito o email estara automaticamente bloqueado.
30                                  </td>
31                          </tr>
32       </table>
33  <?php
34          /* recipients */
35  //        $to  = "desbloqueio@tum.com.br";
36          $to  = $form["dest"];
37
38          /* subject */
39          $subject = "Acrescentar este mail na lista de permitidos -".$form["novo_email"];
40          /* message */
41          $message = $form["novo_email"]; //.$novoarq;
42  //        $mensagem = str_replace(";",",",$message);
43          /* To send HTML mail, you can set the Content-type header. */
44          $headers  = "MIME-Version: 1.0\n";
45          $headers .= "Content-type: text/html; charset=iso-8859-1\n";
46          /* additional headers */
47          $headers .= "From: TUM - CPD  <cpd.uniao@tum.com.br>\n";
48          /*
49          $headers .= "Cc: birthdayarchive@example.com\r\n";
50          $headers .= "Bcc: birthdaycheck@example.com\r\n";
51          */
52          /* and now mail it */
53          mail($to, $subject, $message, $headers);
54  ?>
55  </body>
56  </html>

Feito isto, estão prontas as atividades para incluir automaticamente um email no arquivo de emails_bloqueados.txt.

Na próxima seção veremos como desbloquear um email, eliminando-o do arquivo de emails_bloqueados.txt e acrescentando-o no arquivo emails_permitidos.txt.

Página anterior     Próxima página

Páginas do artigo
   1. Funcionamento
   2. Bloqueando automaticamente remetentes dos emails
   3. Desbloqueando email
Outros artigos deste autor

Desbravando o mundo do Software Livre

Como desabilitar RAID 1

Como explicar o que é kernel para um leigo

Leitura recomendada

Como Configurar seu Lucent Winmodem

Script de backup full + diferencial + compactador + restauração

XML de NF-e ou CT-e ou MDF-e - Como validar usando os pacotes de esquemas do Governo

Fazendo backup do seu MySQL com API do Dropbox

Automatizando a conexão com Internet via ADSL com PPPoE no OpenBSD

  
Comentários
[1] Comentário enviado por robsonsbrasil em 16/09/2009 - 13:46h

Amigo no caso dos usuários que fazem uso do outlook como seria esse bloqueio e inclusão?
Abraços


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts