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: 35.966 ]

Por: Felipe em 02/11/2008


E-mails em massa com Perl



Interpretador e variáveis:

#!/usr/local/bin/perl

$ARGC=@ARGV;
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 dr4k3@hotmail.com, 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 dr4k3@hotmail.com "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 dr4k3@hotmail.com "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

$ARGC=@ARGV;
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

Programando em Perl (parte 2)

Manipulação de sockets em Perl usando o IO::Socket::INET

Configurando OTRS com PSGI/Plack e executando com Starman

Phperl, minha gambiarra para usar Perl como se fosse PHP

Executando os principais frameworks Perl no cPanel com CGI

  
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 => 'seuemail@gmail.com',
Password => 'sua senha aki',
Timeout => 30,
Debug => 1,
);
#dados de envio do e-mail
$smtp->mail('remetente@dominio.com');
$smtp->to('destinatario@dominio.com');
#assunto e corpo da mensagem
$smtp->data();
$smtp->datasend ('From: tepego_na_curva@hotmail.com');
$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('c00l3r@hotmail.com');------) 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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts