Enviando e-mails simples, com autenticação, com anexos e em massa em Perl


Autor/fonte: Felipe
E-mail/Url: http://www.vivaolinux.com.br/artigo/Enviando-emails-em-Perl
Tags: [ e-mail ]



Digg del.icio.us

Básico: Net::SMTP

Enviando um simples e-mail com o Net::SMTP:

#!/usr/bin/perl
use Net::SMTP;
$smtp = Net::SMTP->new('mailhost'); #esse comando vai abrir a conexão com servidor

No lugar de "mailhost" você põe o servidor de email, exemplos:

Hotmail:

$smtp = Net::SMTP->new('smtp.hotmail.com');

Yahoo!:

$smtp = Net::SMTP->new('smtp.yahoo.com');

Cabeçalho:

Nome:

$smtp->mail("user"); #aqui você vai entrar com seu nome/apelido etc

Usando "Dr4k3":

$smtp->mail("Dr4k3");

Autenticação (opcional):

$smtp->auth("user","senha"); #aqui você vai autenticar seu email

Vamos supor que meu email seja "dr4k3@hotmail.com" e a minha senha "123456":

$smtp->auth("dr4k3","123456");

Destinatário:

$smtp->to('user@hotmail.com'); #aqui você vai por o destinatário, ou seja, quem vai receber o email

Vamos supor que o email do c00l3r seja "c00l3r@hotmail.com", nosso código ficaria assim:

$smtp->to('c00l3r@hotmail.com');

Data:

$smtp->data();
$smtp->datasend("To: user@hotmail.com"); #o data é o que vai imprimir a quem foi enviado e o remetente, caso dê algum erro ou o email esteja programado para mandar mensagens automáticas

Remetente:

$smtp->datasend("From: você@hotmail.com"); # este é o remetente e o fim do cabeçalho

Um exemplo do data completo:

$smtp->data();
$smtp->datasend("To: c00l3r@hotmail.com");
$smtp->datasend("From: dr4k3@hotmail.com");

Corpo:

$smtp->datasend("Artigo trabalhando com e-mails em Perl BotecoUnix"); #Aqui vem o conteúdo do email

Final:

$smtp->quit; #aqui encerramos a conexão com servidor

Exemplo de uma source completa:

#!/usr/bin/perl
use Net::SMTP;
print q{
##############################
# Trabalhando com Emails
# usando o Net::SMTP
##############################
};
# DADOS
print 'Qual é o email Host?'; #pergunta para o usuário qual o emailhost que ele vai usar
chomp($eh = <STDIN>); #salva na memória
print 'Nome:'; #entra com o nick
chomp($name = <STDIN>);
print 'email:'; #entra com o user
chomp($mail = <STDIN>);
print 'senha:'; #entra com a senha
chomp($pass = <STDIN>);
print 'enviar para quem?:'; #entra com o destinatário
chomp($dest = <STDIN>);
print 'remetente:'; #entra com o remetente
chomp($remt = <STDIN>);
print 'Mensagem:'; #entra com o conteúdo
chomp($msg = <STDIN>);

# CONEXÃO
$smtp = Net::SMTP->new('smtp.$eh'); #abre a conexão
$smtp->mail("$name");
$smtp->auth("$mail","$pass");
$smtp->to('$dest');
$smtp->data();
$smtp->datasend("To:$dest ");
$smtp->datasend("From: remt");
$smtp->datasend("$msg");
$smtp->quit;
# FIM DA CONEXÃO
print "email enviado";
<STDIN>;
exit;

Nova lib: /usr/lib/sendmail

Agora para nós podermos "brincar" mais com os e-mails em Perl, vamos usar um lib local dos sistemas Gnu/Linux: /usr/lib/sendmail.

Obs.: As 3 sources que vou usar não são minhas, porém vou modificá-las na explicação e deixarei igual a original na source completa.

Enviar email com anexo

Interpretador & módulos:

#!/usr/bin/perl
use MIME::Entity; #este é um módulo de codificação que neste script será usado com base 64

Cabeçalho:

$top = build MIME::Entity From => 'Root <root>',
To => 'user@host', #aqui é o destinatário
Subject => "título/assunto", #o título/assunto do email
Data => $txt1; #aqui é a mensagem, que neste caso está na variável txt1

Variável:

$txt1 = &#8220;esta não é a mensagem original”; #aqui no caso seria a mensagem que o programa vai mandar

Anexo:

#Aqui começa o anexo
$top->attach(
   Name => “nome.extensão”, #aqui você vai por o nome e a extensão do arquivo
   Path => “/diretório/nome.extensão”, #caminho do arquivo
   # Se o anexo for compactado
   #Type => “application/x-gtar”, #se o arquivo for compactado usará /x-gtar, perceba que o type está com um "#" antes. É porque o arquivo não está compactado, o "#" torna o comando inútil
   Encoding => “base64&#8243; #a codificação do arquivo
);

Enviando:

# Agente MTA do seu servidor
open(MAIL,&#8221;| /usr/lib/sendmail -t”); #chama a lib citada no começo
$top->print(\*MAIL);
close(MAIL);

Código completo:

#!/usr/bin/perl
use MIME::Entity;

$txt1 = &#8220;O servidor de backup realizou o backup com sucesso,em anexo o script de backup !”;

$top = build MIME::Entity From => &#8216;Root <root>’,
To => &#8217;suporte@domain’,
Subject => &#8220;[Backup-Empresa] Confirmação do Backup “,
Data => $txt1;

$top->attach(
   Name => &#8220;algumacoisaExemplo.sh”,
   Path => &#8220;/diretório/algumacoisaExemplo.sh”,
   # Se o anexo for compactado
   #Type => “application/x-gtar”,
   Encoding => &#8220;base64&#8243;
);

open(MAIL,”| /usr/lib/sendmail -t”);
$top->print(\*MAIL);
close(MAIL);

No caso ele simulou o backup dos arquivos de uma empresa, o que é uma ótima função para este script.

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 e-mails 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);

Enviando e-mails anonimamente com Perl

Começando e definindo:

#! /usr/bin/perl
use IO::Socket;
if (!$ARGV[2]) { #este programa funciona com o mesmo mecanismo do de cima
   print "Program intended to send mail anonymously\n";
   print "Usage: perl anonsend.pl [server] [sender] [recepient]\n";
   exit;
}

Supondo que meu servidor seja @hotmail.com, que eu vá enviar um email para c00l3r@hotmail.com, que o assunto seja "Trabalhando com emails" e que o programa esteja localizado em /home/dr4k3/sendanony.pl, nossa requisição ficaria assim:

$ cd /home/dr4k3
$ perl sendanony.pl @hotmail.com c00l3r@hotmail.com "Trabalhando com emails"

Variáveis:

#Aqui ele define as variáveis
$server = $ARGV[0];
$sender = $ARGV[1];
$recpt = $ARGV[2];

Mensagem:

print "Type message to send: ";
$message = <STDIN>; #aqui você digita sua mensagem, ela será armazenada na variável message

Abrindo conexão:

$remote = IO::Socket::INET->new( PeerAddr => "$server", Proto => "tcp", PeerPort => "25"); #aqui ele abre a conexão

Enviando:

#aqui ele usa os dados obtidos acima para enviar o email e da os "prints" do programa
print "Connecting...\n";
sleep(1);
print $remote "HELO computer\n";
sleep(1);
print "Sending E-Mail Header Information\n";
print $remote "MAIL FROM: $sender\r\n";
sleep(1);
print $remote "RCPT TO: $recpt\n";
sleep(1);
print $remote "DATA\n";
sleep(1);
print "Sending Message\n";
print $remote "$message\n";
sleep(1);
print $remote ".\n";
sleep(1);
print "Anonymous E-Mail Sent!\n";
exit; #fim do programa:

Código original:

#! /usr/bin/perl
# Program to connect to mail server
# and send mail to a specified user
# Pray to god this works
use IO::Socket; #tell perl to use IO *Input Output) Internet Socket
if (!$ARGV[2]) { #if nothign is entered, start this routine
   print "Program intended to send mail anonymously\n"; #message to user
   print "Usage: perl anonsend.pl [server] [sender] [recepient]\n"; #more message =)
   exit; # finish this routine
} #end this routine
# Time to define some variables!
$server = $ARGV[0]; # what server to use to send the mail
$sender = $ARGV[1]; # who the e-mail is from
$recpt = $ARGV[2]; # who the e-mail is to
{ # start new routine
   print"Type message to send: "; #asks user for message
   $message = <STDIN>; # saves the input as string message
   $remote = IO::Socket::INET->new( PeerAddr => "$server", Proto => "tcp", PeerPort => "25");
   print "Connecting...\n"; # update user with status
   sleep(1);# tells program to stop and wait
   print $remote "HELO computer\n"; # telling mailserver hello
   sleep(1);
   print "Sending E-Mail Header Information\n"; # update user with status again
   print $remote "MAIL FROM: $sender\r\n"; # Tells server who mail is spoofed from
   sleep(1);
   print $remote "RCPT TO: $recpt\n"; # Tells server who to send the email to
   sleep(1);
   print $remote "DATA\n"; # Tells server to start process off receiving our email message
   sleep(1);
   print "Sending Message\n"; # Update user of status again
   print $remote "$message\n"; # Sends the string we entered earlier into the server
   sleep(1);
   print $remote ".\n"; # Tells SMTP server to stop receiving data, and send message
   sleep(1);
   print "Anonymous E-Mail Sent!\n"; # tells user program is finished
   exit; # stop this subroutine
}

Agradecimentos:

  • Web Dropz (source).
  • Ninja Spy (source).
  • C00L3R (pela idéia).


Bom, como foi meu primeiro artigo, espero que vocês entendam e gostem, desculpem pelos erros de português e obrigado pela oportunidade.




Enviado por xKuRt em 03/11/2008 às 12:06


Avaliação

Esta publicação ainda não foi avaliada!


Avaliar:


A avaliação de publicações é restrita a membros cadastrados e logados no nosso site.



Comentários

Este artigo ainda não foi comentado ou o(s) comentário(s) que foi(ram) enviado(s) a ele ainda não foi(ram) publicado(s).


Envio de comentário:




  

Quinta, 21 de Agosto de 2014




Top 5 membros

Últimos membros online

Últimos membros cadastrados



Capa do livro
Padrões Javascript: Construa Aplicações mais Robustas usando Padrões de Projeto e Programação


Capa do livro
Sistema de Banco de Dados


Capa do livro
Microsoft Exchange Server 2010





Hostnet

IMD