Envio de email (SMTP)

Iniciado por Minato, 12 de Julho , 2011, 05:52:33 PM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

Minato

Preciso enviar um email através de Perl. Porém ele não funciona, haha. Eis o código que usei para testar:

#!/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;


O que eu digitei:
$eh: yahoo.com
$name: Minato
$mail: algo@yahoo.com (não vou digitar o email que usei :D )
$pass: minhasenha (contém o caractere '=', pode ser que isso seja o erro, mas sei lá)
$dest: algo@yahoo.com (usei o mesmo, só tenho uma conta no yahoo...)
$remt: algo@yahoo.com
$msg: mensagemteste

EDIT: mudei o $mail de 'algo@yahoo.com' para somente 'algo'. Também não deu certo.

Olhei a caixa de entrada, lixo, spam do meu email e não tem nada. Qual poderia ser o problema?

Valeu!

Fvox

Hi.

Com o concat na string $eh, o resultado final foi smtp.yahoo.com.
O SMTP do yahoo é smtp.mail.yahoo.com.br. Faltou o .mail e o .br. =P

Se ainda sim não funcionar, eu testo o script aqui e vejo pra ti. :-)

[]'s
"Achas que estás caindo na insanidade? Mergulhe."


Minato

Citação de: Fvox online 14 de Julho , 2011, 03:36:17 PM
Hi.

Com o concat na string $eh, o resultado final foi smtp.yahoo.com.
O SMTP do yahoo é smtp.mail.yahoo.com.br. Faltou o .mail e o .br. =P

Se ainda sim não funcionar, eu testo o script aqui e vejo pra ti. :-)

[]'s

Pra falar a verdade, eu já consegui e fiz de outra forma. O smtp do yahoo é smtp.yahoo.com mesmo, que é o que eu uso no Thunderbird.
Só pra constar, aqui vai o que deu certo:

#!usr/bin/perl

use warnings;
use strict;
use Net::SMTP::SSL;
use MIME::Lite;
use FindBin;

use lib ("$FindBin::Bin/CPAN");

my $message = "From: suaconta\@gmail.com\nTo:
outraconta\@yahoo.com\nSubject: Assunto\n\nCorpo da mensagem\n\n";
print "Message:\n";
print $message;
print "\n";

my $DEBUG = 1;

my $ServerName = "smtp.gmail.com";
my $ServerAccount = "suaconta"; #não é suaconta@gmail.com, é só suaconta mesmo
my $ServerPwd = "senha";
my $MailFrom = "suaconta\@gmail.com";
my $MailTo = "outraconta\@yahoo.com";

print "Variáveis prontas\n";

my $smtp = Net::SMTP::SSL->new($ServerName,
                               Port => 465,
                               DEBUG => 1,
                               ) or warn "$!\n";
   
print "Conexão estabelecida\n";

if ( !$smtp->auth($ServerAccount, $ServerPwd) ) {
print "Falha na autenticacao\n";
}

if ( !$smtp->mail( $MailFrom ) ) {
print "Sender recusado\n";
exit 1;
}

if (!$smtp->to( $MailTo ) ) {
print "Endereco recusado\n";
exit 1;
}

my $maildata = $message;
$smtp->data();
$smtp->datasend( $maildata );
$smtp->dataend();
$smtp->quit();
$smtp->quit;

print "Email enviado\n";


Eu fui usar o módulo MIME pra poder enviar com anexo, porém recebi um erro sobre ARRAY. Não lembro direito o que era, mas só sei que dava erro no cmd.pl (acho que era esse, ou era cmd.pm). Se alguém souber o motivo e responder, ficaria agradecido! :D

Usando o MIME:
use strict;
use warnings;

use FindBin;
use Net::SMTP::TLS; 
use MIME::Lite;

use lib ("$FindBin::Bin/CPAN");


my $msg = MIME::Lite->new(
        From    => 'email\@gmail.com',
        To      => 'email\@yahoo.com',       
        Subject => 'Assunto',
        Type    =>'multipart/signed',
);

### Add the text message part
$msg->attach (
Type => 'TEXT',
Data => 'Mensagem do corpo'
) or die "Error adding the text message part: $!\n";
   
    $msg->attach(
        Type     => 'application/notepad',
        Path     => 'C:\novo\dentro\output.txt',
        Filename => 'output.txt',
        Disposition => 'attachment',
    );

my $mailer = new Net::SMTP::TLS( 
    'smtp.gmail.com', 
    Port    => 587, 
    User    => 'email\@gmail.com', 
    Password=> 'senha'); 
$mailer->mail(email\@gmail.com'); 
$mailer->to('email\@yahoo.com'); 
$mailer->data; 
$mailer->datasend($msg->as_string); 
$mailer->dataend; 
$mailer->quit; 

Fvox

Citação de: Minato online 17 de Julho , 2011, 01:07:08 AM
Eu fui usar o módulo MIME pra poder enviar com anexo, porém recebi um erro sobre ARRAY. Não lembro direito o que era, mas só sei que dava erro no cmd.pl (acho que era esse, ou era cmd.pm). Se alguém souber o motivo e responder, ficaria agradecido! :D

Hi.
Seu erro está aqui na linha 38:
$mailer->mail(email\@gmail.com'); 

A string termina mas não começa (faltou as aspas).

Outra coisa importante: com quotes (aspas simples), você não precisa escapar os arrays (\@), pois eles não tentarão ser lidos como variáveis dentro de uma string.
Isso provavelmente vai te causar um erro de autenticação, ainda que o email seja válido. Portanto, só coloque \@ quando houver aspas duplas!

[]'s
"Achas que estás caindo na insanidade? Mergulhe."


Minato

Citação de: Fvox online 18 de Julho , 2011, 01:36:40 PM
Citação de: Minato online 17 de Julho , 2011, 01:07:08 AM
Eu fui usar o módulo MIME pra poder enviar com anexo, porém recebi um erro sobre ARRAY. Não lembro direito o que era, mas só sei que dava erro no cmd.pl (acho que era esse, ou era cmd.pm). Se alguém souber o motivo e responder, ficaria agradecido! :D

Hi.
Seu erro está aqui na linha 38:
$mailer->mail(email\@gmail.com'); 

A string termina mas não começa (faltou as aspas).

Outra coisa importante: com quotes (aspas simples), você não precisa escapar os arrays (\@), pois eles não tentarão ser lidos como variáveis dentro de uma string.
Isso provavelmente vai te causar um erro de autenticação, ainda que o email seja válido. Portanto, só coloque \@ quando houver aspas duplas!

[]'s

Ah sim, agora entendi isso de quotes e talz. Valeu.

Eu arrumei o erro na linha 38 e mesmo assim deu erro. Olha só como ficou:

use strict;
use warnings;

use FindBin;
use Net::SMTP::TLS; 
use MIME::Lite;

use lib ("$FindBin::Bin/CPAN");


my $msg = MIME::Lite->new(
        From    => 'email@gmail.com',
        To      => 'email@yahoo.com',       
        Subject => 'Assunto',
        Type    =>'multipart/signed',
);

### Add the text message part
$msg->attach (
Type => 'TEXT',
Data => 'Mensagem do corpo'
) or die "Error adding the text message part: $!\n";
   
    $msg->attach(
        Type     => 'application/notepad',
        Path     => 'C:\novo\dentro\output.txt',
        Filename => 'output.txt',
        Disposition => 'attachment',
    );

my $mailer = new Net::SMTP::TLS( 
    'smtp.gmail.com', 
    Port    => 587, 
    User    => 'email@gmail.com', 
    Password=> 'senha'); 
$mailer->mail('email@gmail.com'); 
$mailer->to('email@yahoo.com'); 
$mailer->data; 
$mailer->datasend($msg->as_string); 
$mailer->dataend; 
$mailer->quit; 


E esse foi o erro que retornou no console: Not an ARRAY reference at C:/perl64/site/lib/Net/SMTP/TLS.pm line 324, <GEN0> line 7.
Não faço a menor ideia de como resolver. Abri o TLS.pm mas não sei mexer nisso, haha.

[ ]s

Fvox

Hi.

Provavelmente é alguma incompatibilidade do módulo com Windowzz.
Testei aqui no Linux e o email chegou perfeitamente usando o smtp do gmail.

[]'s
"Achas que estás caindo na insanidade? Mergulhe."


Minato

Hm, deve ser isso mesmo... Mas o anexo chegou certinho? :D

[ ]s