Enviando emails em Perl

A forma mais comum de se enviar emails em Perl é usando o Net::SMTP, mas este não tem muitos recursos. Já em plataformas UNIX/Linux podemos enviar emails em massa, com anexo e até anonimamente, neste artigo mostrarei como.

[ Hits: 33.427 ]

Por: Felipe em 02/11/2008


E-mails em massa com Perl



Interpretador e variáveis:

#!/usr/local/bin/perl

[email protected];
if ($ARGC !=4) { #este programa requer que os dados sejam todos postos na variável $ARGC
printf "Você deve ter digitado os comandos de forma errada\n";
printf "Veja como usar corretamente...\n";
printf "perl $0 <mailist> <remetente\@mail.com> <assunto> <corpo.html>\n";
printf "Exemplo: perl $0 lista01.txt peu\@msn.com Ola index.html\n";
exit(1);

Vamos supor que minha lista de emails esteja em /home/dr4k3/list.txt, que meu email seja [email protected], que o assunto seja "Trabalhando com emails", que o conteúdo da mensagem esteja em /home/dr4k3/msg.html e que o programa se chame "esend" e esteja em /home/dr4k3/esend.pl.

Nossa requisição seria a seguinte:

cd /home/dr4k3
$ perl esend.pl /home/dr4k3/list.txt [email protected] "Trabalhando com emails" /home/dr4k3/msg.html


Obs.: Caso ocorra de todos os dados estarem no mesmo local do programa, não precisa por o caminho, exemplo:

cd /home/dr4k3
$ perl esend.pl listemails.txt [email protected] "Trabalhando com emails" msg.html


Definindo:

$mailtype = "content-type: text/html";
$sendmail = '/usr/sbin/sendmail'; #chama a lib
# aqui ele vai definir o que cada ARGV é
$sender = $ARGV[1];
$subject = $ARGV[2];
$efile = $ARGV[0];
$emar = $ARGV[0];

Abrindo mensagem & lista:

open(FOO, $ARGV[3]); #aí ele vai abrir nossa mensagem que estava .html e a nossa lista de emails
@foo = <FOO>;
$corpo = join("\n", @foo);
open (BANDFIT, "$emar") || die "Can't Open $emar";
$cont=0;
while(<BANDFIT>) {
   ($ID,$options) = split(/\|/,$_);
   chop($options);
   foreach ($ID) {
      $recipient = $ID;

      #Enviando:
      open (SENDMAIL, "| $sendmail -t"); #vai abrir a lib
      print SENDMAIL "$mailtype\n";
      print SENDMAIL "Subject: $subject\n";
      print SENDMAIL "From: $sender\n"; # aí o programa vai usar os dados para enviar
      print SENDMAIL "To: $recipient\n\n";
      print SENDMAIL "$corpo\n\n";
      close (SENDMAIL); #aqui vai fechar a conexão
      $cont=$cont+1;
      
      #Final:
      
      printf "$cont Enviado para $recipient";
   }
}
close(BANDFIT) #fim do programa

Código original:

#!/usr/local/bin/perl

[email protected];
if ($ARGC !=4) {
   printf "Você deve ter digitado os comandos de forma errada\n";
   printf "Veja como usar corretamente...\n";
   printf "perl $0 <mailist> <remetente\@mail.com> <assunto> <corpo.html>\n";
   printf "Exemplo: perl $0 lista01.txt peu\@msn.com Ola index.html\n";
   exit(1);
}

$mailtype = "content-type: text/html";
$sendmail = '/usr/sbin/sendmail';
$sender = $ARGV[1];
$subject = $ARGV[2];
$efile = $ARGV[0];
$emar = $ARGV[0];
open(FOO, $ARGV[3]);
@foo = <FOO>;
$corpo = join("\n", @foo);
open (BANDFIT, "$emar") || die "Can't Open $emar";
$cont=0;

while(<BANDFIT>) {
   ($ID,$options) = split(/\|/,$_);
   chop($options);
   foreach ($ID) {
      $recipient = $ID;
      open (SENDMAIL, "| $sendmail -t");
      print SENDMAIL "$mailtype\n";
      print SENDMAIL "Subject: $subject\n";
      print SENDMAIL "From: $sender\n";
      print SENDMAIL "To: $recipient\n\n";
      print SENDMAIL "$corpo\n\n";
      close (SENDMAIL);
      $cont=$cont+1;
      printf "$cont Enviado para $recipient";
   }
}
close(BANDFIT);

Página anterior     Próxima página

Páginas do artigo
   1. Básico: Net::SMTP
   2. Nova lib: /usr/lib/sendmail
   3. E-mails em massa com Perl
   4. Enviando emails anonimamente com Perl
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Gerenciando redes com Perl e SNMP

Programando em Perl (parte 2)

Comparação entre Tcl e Perl

Módulos CPAN no Debian e distros GNU/Linux em geral

Twittando com o Perl (parte 1)

  
Comentários
[1] Comentário enviado por QuestLoder em 03/11/2008 - 08:35h

Show de bola,
Estava procurando um artigo assim, parabens...


vou testar
Abraço.

[2] Comentário enviado por dailson em 04/11/2008 - 16:45h

Amigo. Já uso o perl para enviar emails via linha de comando, porém tenho uma dificuldade e gostaria de saber se você pode me ajudar.
Toda vez que acentuo um caracter no Subject, chega errado em alguns clientes de email como o hotmail.
No corpo da mensagem ocorre tudo bem. Como faço para colocar acentuação no subject ??

[3] Comentário enviado por Cooler_ em 04/11/2008 - 16:51h

meus parabens Brother
cada dia melhor em
um salve ai

[4] Comentário enviado por perserktor em 04/05/2009 - 18:48h

apenas acrescentando, caso queria utilizar outro servidor SMTP, pois hotmail por exemplo barra envio se o seu smtp não for um SMTP valido.

O grande x da questão é que servidores de e-mail como o do G-Mail usam autenticação "SSL" ou "TLS" para usa-los vc deve utilizar modulos específicos.

Segue o exemplo de envio utilizando o smtp do Ggmail,

use Net::SMTP::TLS;
use IO::Socket::INET;

# Pega o domain host
use Net::SMTP;
my $domain = Net::SMTP->new('smtp.gmail.com', Timeout => 30);
my $domainhost = $domain->domain;
#configuração para conexão TSL
my $smtp = Net::SMTP::TLS->new('smtp.gmail.com',
Hello => $domainhost,
Port => 587,
User => '[email protected]',
Password => 'sua senha aki',
Timeout => 30,
Debug => 1,
);
#dados de envio do e-mail
$smtp->mail('[email protected]');
$smtp->to('[email protected]');
#assunto e corpo da mensagem
$smtp->data();
$smtp->datasend ('From: [email protected]');
$smtp->datasend("\n");
$smtp->datasend('Subject: -----Seu Assunto Aki-------');
$smtp->datasend("\n");
$smtp->datasend("-----PENSE MUITO ANTES DE FAZER O MAL, POIS ELE VOLTARA PRA VOCÊ ----");
$smtp->dataend();
$smtp->quit;

Espero ter contribuido com o post de nosso amigo, e lembrem-se de usar este scrip de forma adequada. rs

[5] Comentário enviado por poetah em 10/10/2009 - 00:15h

pena que no gmail mesmo autenticando ele envia
com o nome de email padrao, sem ser fake!!!

bom artigo

[]'s

[6] Comentário enviado por BarbaNegra em 15/09/2010 - 19:04h

show de bola os tutoriais do Drake e do C00l3r salvam a pátria diariamente xD

[7] Comentário enviado por barao2011 em 09/01/2012 - 21:34h

como faz pra configurar esse envio com io ou dns reverso ????

[8] Comentário enviado por swit em 24/01/2012 - 12:59h

Ola eu estou tentando envia emails anonymos com a opção que vc descreveu porem ele nao envia gostaria de saber oque vc preciso configura pra consegui envia emails anonymos em massa?

[9] Comentário enviado por joaorubens em 03/03/2013 - 20:58h

cara com o pouco que já consegui entender sobre o assunto, esse seu post ta otimo e vou testar, mas se puder me responder antecipadamente quero saber se posso substituir isso (------$smtp->to('[email protected]');------) por um arquivo com uma lista como vi em um video no youtube http://www.youtube.com/watch?v=A7Ye1sHjLRE

e a mensagem tambem posso substituir por um arquivo?
se quiser visitar meu poste, tem um script que fiz mas não conseui usar
vivaolinux.com.br/topico/vivaolinux/Como-enviar-email-via-SSH

valeu, abraço.

[10] Comentário enviado por mauriliovilela em 17/01/2015 - 14:04h

Não estou conseguindo mais enviar emails através deste script, o script roda legal, faz tudo certinho, mas o email não chega.


Contribuir com comentário