Mie Ene 02, 2008 7:41 pm
|
|
|
| Envío de emails con Perl |
|
|
Normalmente al enviar un email desde un CGI se utiliza el /usr/bin/sendmail que es siempre referenciado al servidor local. Pero yo quiero utilizar un servidor SMTP externo para esta tarea.
El código que estoy manejando es el siguiente:
| Perl: | sub sendmail {
my ( $mday, $mon, $year ) = ltime ();
my ( $to, $subject, $message, $path, $name, $idx, $username, $html_flag ) =
@_;
my ($email) = $to;
#$username =~ /^\s*([a-zA-ZáéíóúÁÉÍÓÚ\S]{1,20})\s*([a-zA-ZáéíóúÁÉÍÓÚ\S]{0,20}).*$/;
$username =~ /^\ s* ([a-zA-ZáéíóúÁÉÍÓÚüÜ\S ]* )\ s* ([a-zA-ZáéíóúÁÉÍÓÚüÜ\S ]* ).*$/;
$secname = $ 2;
$secname =~ tr/A-Z/a-z/;
$secname =~ tr/ÁÉÍÓÚ/áéíóú/;
$secname = "\u$secname";
$username = $ 1;
$username =~ tr/A-Z/a-z/;
$username =~ tr/ÁÉÍÓÚ/áéíóú/;
$username = "\u$username";
my ( $fromars, $namears, $unlink ) = ( getarlist ("$path/$path.cfg") );
$fromaddr = "$namears<$fromars>";
if ( $unlink == 1 && $html_flag == 1 ) {
$unlink =
"\r\n\r\n <br><p><a href='"
. $scripturl
. "?mode=r&a="
. $path . "&e="
. $to
. "'>Click Aquí para "
. "dejar de recibir mensajes</a></p>\n";
}
elsif ( $unlink == 1 && $html_flag == 0 ) {
$unlink =
"\r\nClick en el link para dejar de recibir "
. "mensajes:\r\n"
. $scripturl
. "?mode=r&a="
. $path . "&e="
. $to;
}
$to =~ s/@/\@/;
if ( $secname ne "" ) { $secname = " " . $secname }
if ( open( IN, "$path/users.txt" ) ) {
while (<IN>) {
~/^ (.+ )\| (.+ )\| (.+ )\| (.+ )\| (.+ )\| (.+ )\| (.+ )\| (.+ )\| (.+ )/;
chomp($_);
if ( $to eq $ 2 ) {
$ip = $ 5;
$adminname = $ 6;
$adminmail = $ 7;
$adminid = $ 8;
$adminsub = $ 9;
}
}
}
close(IN );
$to = '"' . $username . $secname . '" <' . $to . ">";
$name =~ /.*\. (.* )/;
my ($real) = "upfile" . $idx . "." . $ 1;
$path = $path . "/" . $real;
my ($current) = $mday . "/" . $mon . "/" . $year;
#if($fromaddr !~ m/^\"/){
# $formaddr = '"' . $formaddr . '"';
#}
# Parse the DATEXY where Y is an int (days in the future) ABA
while ( $message =~ m/\ [DATEX (\d+ )\ ]/i ) {
my $dayTmp = $ 1;
my @tmpDate = ltime ($dayTmp);
my $thisdate = $tmpDate[0] . "/" . $tmpDate[1] . "/" . $tmpDate[2];
$message =~ s/\ [DATEX (\d+ )?\ ]/ $thisdate/i;
# this is just a debug
## print STDERR "futuredate: $thisdate\n";
}
while ( $subject =~ m/\ [DATEX (\d+ )\ ]/i ) {
my $dayTmp = $ 1;
my @tmpDate = ltime ($dayTmp);
my $thisdate = $tmpDate[0] . "/" . $tmpDate[1] . "/" . $tmpDate[2];
$subject =~ s/\ [DATEX (\d+ )\ ]/ $thisdate/i;
}
$message =~ s/\ [FIRSTNAME\ ]/ $username/gie;
$message =~ s/\ [EMAIL\ ]/ $email/gie;
$message =~ s/\ [DATE\ ]/ $current/gie; # ABA
$message =~ s/\ [FULLNAME\ ]/ $username. $secname/gie;
$message =~ s/\ [IP\ ]/ $ip/gie;
$message =~ s/\ [ADMINNAME\ ]/ $adminname/gie;
$message =~ s/\ [ADMINMAIL\ ]/ $adminmail/gie;
$message =~ s/\ [ADMINID\ ]/ $adminid/gie;
$message =~ s/\ [ADMINSUB\ ]/ $adminsub/gie;
$message .= "\n\n$unlink\n\n";
$subject =~ s/\ [FIRSTNAME\ ]/ $username/gie;
$subject =~ s/\ [EMAIL\ ]/ $email/gie;
$subject =~ s/\ [DATE\ ]/ $current/gie;
$subject =~ s/\ [FULLNAME\ ]/ $username. $secname/gie;
$subject =~ s/\ [IP\ ]/ $ip/gie;
$subject =~ s/\ [ADMINNAME\ ]/ $adminname/gie;
$subject =~ s/\ [ADMINMAIL\ ]/ $adminmail/gie;
$subject =~ s/\ [ADMINID\ ]/ $adminid/gie;
$subject =~ s/\ [ADMINSUB\ ]/ $adminsub/gie;
my ($mime) = &mimeformat ($name);
my $typeHelper = "";
if ( $html_flag eq "1" ) {
$send_type = "text/html";
$typeHelper = "Content-Type: text/html; charset=ISO-8859-15";
}
else {
$send_type = "TEXT";
$typeHelper = "Content-Type: text/plain; charset=ISO-8859-15";
}
require ParseSpecial;
# Here I fix the addresses
$fromaddr = FixAddr ($fromaddr);
$to = FixAddr ($to);
print STDERR "-------------------\n";
print STDERR "FROMADDR" . ParseSpecial (FixAddr ($fromaddr)) . "\n";
print STDERR "-------------------\n";
my $msg = MIME:: Lite-> new(
Type => 'multipart/mixed' ,
From => ParseSpecial (FixAddr ($fromaddr)),
To => ParseSpecial ($to) ,
Content-Type => $typeHelper ,
Subject => ParseSpecial ($subject) ,
Type => $send_type,
Encoding => "quoted-printable",
Data => $message
);
$msg-> attr( "content-type.charset" => "ISO-8859-15" );
#$msg->build(Subject => ParseSpecial($subject) ,
# Data => $message ,
# From => ParseSpecial($fromaddr),
# To => ParseSpecial($to) ,
# Encoding => "quoted-printable" ,
# Content-Type => $typeHelper ,
# #Type => 'multipart/mixed'
# );
## print STDERR "Pasé por acá ABACO\n"; # debug
if ( $name ne "" ) {
$msg-> attach(
Type => $mime-> [0],
Encoding => $mime-> [1],
Filename => $name,
Path => $path,
);
$msg-> attr( "content-type.charset" => "ISO-8859-15" );
## print STDERR "Pasé por aquí ABA934\n"; # debug
}
MIME:: Lite-> send( 'sendmail', $mailprog );
$msg-> send;
} |
He encontrado esta función para hacer el envio mediante Net::SMTP pero no sé cómo adaptarlo al código anterior para poder enviar mails desde mi proveedor de email hosting o SMTP externo. SI ALGUIEN PUEDE AYUDARME, SE LO AGRADECERÉ.
| Perl: | =pod
Send message via SMTP, using Net::SMTP.
The optional ARGS are sent into Net::SMTP::new(): usually, these are
MAILHOST, OPTION=>VALUE, ...
Note that the list of recipients is taken from the
"To", "Cc" and "Bcc" fields.
Returns true on success, false or exception on error.
=cut
### Provided by Andrew McRae. Version 0.2 anm 09Sep97
### Copyright 1997 Optimation New Zealand Ltd.
### May be modified/redistributed under the same terms as Perl.
#
sub send_by_smtp {
my ($self, @args) = @_;
### We need the "From:" and "To:" headers to pass to the SMTP mailer:
my $hdr = $self-> fields();
my $from = $self-> get('From');
my $to = $self-> get('To');
### Sanity check:
defined($to) or croak "send_by_smtp: missing 'To:' address\n";
### Get the destinations as a simple array of addresses:
my @to_all = extract_addrs ($to);
if ($AUTO_CC) {
foreach my $field (qw(Cc Bcc )) {
my $value = $self-> get($field);
push @to_all, extract_addrs ($value) if defined($value);
}
}
### Create SMTP client:
require Net:: SMTP;
my $smtp = MIME:: Lite:: SMTP-> new(@args)
or croak "Failed to connect to mail server: $!\n";
$smtp-> mail($from)
or croak "SMTP MAIL command failed: $!\n";
$smtp-> to(@to_all)
or croak "SMTP RCPT command failed: $!\n";
$smtp-> data()
or croak "SMTP DATA command failed: $!\n";
### MIME::Lite can print() to anything with a print() method:
$self-> print_for_smtp($smtp);
$smtp-> dataend();
$smtp-> quit;
1;
} |
No soy bueno programando en Perl, ¿alguien me puede ayudar con esto?
Espero haber publicado este mensaje en el lugar indicado, sino es así ofrezco una disculpa. |
|
|
|

Mie Ene 02, 2008 8:25 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
|
|
|
|
|
Bienvenido a los foros de Perl en Español, teamvipconnectz.
La última función que muestras está sacada del código del módulo de MIME::Lite, así que es mejor usar el módulo y no una parte de él.
Si ves la documentación de MIME::Lite, verás que esta es la forma de enviar correo usando un servidor externo: | Perl: | MIME::Lite->send('smtp','mail.servidor.net', AuthUser=>$usuario, AuthPass=>$password); |
Internamente usará Net::SMTP para la conexión (de hecho, llamará a la función que has publicado).
En el resto del módulo hay multitud de ejemplos de cómo enviar correos, desde el correo con solo texto a correos con HTML e imágenes incluidas.
Haz una prueba y si te falla, publica el código que estás probando, para que veamos dónde puede estar el fallo. |
|

Mie Ene 02, 2008 9:49 pm
|
|
|
|
|
|
Hola explorer muchas gracias por responder, he modificado el código de esta manera y al probar NO me funcionó. No me marca ningún error solamente no envía el email.
¿Hay alguna manera de saber si el email se envía desde el SMTP externo y no de nuevo desde el SMTP interno de mi dominio? Eso es lo que no me queda claro, y tengo que asegurarme de ello porque mi servidor de hosting me suspende el servicio si intento enviar más emails de los que me permite por hora desde el SMTP interno, y se supone que el SMTP externo que contraté es para uso ilimitado es por eso que intento hacer este cambio al script.
Solamente modifiqué la parte final del código en donde esta la función MIME::Lite
El código que probé es este:
| Perl: | sub sendmail {
my ( $mday, $mon, $year ) = ltime ();
my ( $to, $subject, $message, $path, $name, $idx, $username, $html_flag ) =
@_;
my ($email) = $to;
#$username =~ /^\s*([a-zA-ZáéíóúÁÉÍÓÚ\S]{1,20})\s*([a-zA-ZáéíóúÁÉÍÓÚ\S]{0,20}).*$/;
$username =~ /^\ s* ([a-zA-ZáéíóúÁÉÍÓÚüÜ\S ]* )\ s* ([a-zA-ZáéíóúÁÉÍÓÚüÜ\S ]* ).*$/;
$secname = $ 2;
$secname =~ tr/A-Z/a-z/;
$secname =~ tr/ÁÉÍÓÚ/áéíóú/;
$secname = "\u$secname";
$username = $ 1;
$username =~ tr/A-Z/a-z/;
$username =~ tr/ÁÉÍÓÚ/áéíóú/;
$username = "\u$username";
my ( $fromars, $namears, $unlink ) = ( getarlist ("$path/$path.cfg") );
$fromaddr = "$namears<$fromars>";
if ( $unlink == 1 && $html_flag == 1 ) {
$unlink =
"\r\n\r\n <br><p><a href='"
. $scripturl
. "?mode=r&a="
. $path . "&e="
. $to
. "'>Click Aquí para "
. "dejar de recibir mensajes</a></p>\n";
}
elsif ( $unlink == 1 && $html_flag == 0 ) {
$unlink =
"\r\nClick en el link para dejar de recibir "
. "mensajes:\r\n"
. $scripturl
. "?mode=r&a="
. $path . "&e="
. $to;
}
$to =~ s/@/\@/;
if ( $secname ne "" ) { $secname = " " . $secname }
if ( open( IN, "$path/users.txt" ) ) {
while (<IN>) {
~/^ (.+ )\| (.+ )\| (.+ )\| (.+ )\| (.+ )\| (.+ )\| (.+ )\| (.+ )\| (.+ )/;
chomp($_);
if ( $to eq $ 2 ) {
$ip = $ 5;
$adminname = $ 6;
$adminmail = $ 7;
$adminid = $ 8;
$adminsub = $ 9;
}
}
}
close(IN );
$to = '"' . $username . $secname . '" <' . $to . ">";
$name =~ /.*\. (.* )/;
my ($real) = "upfile" . $idx . "." . $ 1;
$path = $path . "/" . $real;
my ($current) = $mday . "/" . $mon . "/" . $year;
#if($fromaddr !~ m/^\"/){
# $formaddr = '"' . $formaddr . '"';
#}
# Parse the DATEXY where Y is an int (days in the future) ABA
while ( $message =~ m/\ [DATEX (\d+ )\ ]/i ) {
my $dayTmp = $ 1;
my @tmpDate = ltime ($dayTmp);
my $thisdate = $tmpDate[0] . "/" . $tmpDate[1] . "/" . $tmpDate[2];
$message =~ s/\ [DATEX (\d+ )?\ ]/ $thisdate/i;
# this is just a debug
## print STDERR "futuredate: $thisdate\n";
}
while ( $subject =~ m/\ [DATEX (\d+ )\ ]/i ) {
my $dayTmp = $ 1;
my @tmpDate = ltime ($dayTmp);
my $thisdate = $tmpDate[0] . "/" . $tmpDate[1] . "/" . $tmpDate[2];
$subject =~ s/\ [DATEX (\d+ )\ ]/ $thisdate/i;
}
$message =~ s/\ [FIRSTNAME\ ]/ $username/gie;
$message =~ s/\ [EMAIL\ ]/ $email/gie;
$message =~ s/\ [DATE\ ]/ $current/gie; # ABA
$message =~ s/\ [FULLNAME\ ]/ $username. $secname/gie;
$message =~ s/\ [IP\ ]/ $ip/gie;
$message =~ s/\ [ADMINNAME\ ]/ $adminname/gie;
$message =~ s/\ [ADMINMAIL\ ]/ $adminmail/gie;
$message =~ s/\ [ADMINID\ ]/ $adminid/gie;
$message =~ s/\ [ADMINSUB\ ]/ $adminsub/gie;
$message .= "\n\n$unlink\n\n";
$subject =~ s/\ [FIRSTNAME\ ]/ $username/gie;
$subject =~ s/\ [EMAIL\ ]/ $email/gie;
$subject =~ s/\ [DATE\ ]/ $current/gie;
$subject =~ s/\ [FULLNAME\ ]/ $username. $secname/gie;
$subject =~ s/\ [IP\ ]/ $ip/gie;
$subject =~ s/\ [ADMINNAME\ ]/ $adminname/gie;
$subject =~ s/\ [ADMINMAIL\ ]/ $adminmail/gie;
$subject =~ s/\ [ADMINID\ ]/ $adminid/gie;
$subject =~ s/\ [ADMINSUB\ ]/ $adminsub/gie;
my ($mime) = &mimeformat ($name);
my $typeHelper = "";
if ( $html_flag eq "1" ) {
$send_type = "text/html";
$typeHelper = "Content-Type: text/html; charset=ISO-8859-15";
}
else {
$send_type = "TEXT";
$typeHelper = "Content-Type: text/plain; charset=ISO-8859-15";
}
require ParseSpecial;
# Here I fix the addresses
$fromaddr = FixAddr ($fromaddr);
$to = FixAddr ($to);
print STDERR "-------------------\n";
print STDERR "FROMADDR" . ParseSpecial (FixAddr ($fromaddr)) . "\n";
print STDERR "-------------------\n";
use MIME:: Lite;
my $msg = MIME:: Lite-> new(
Type => 'multipart/mixed' ,
From => ParseSpecial (FixAddr ($fromaddr)),
To => ParseSpecial ($to) ,
Content-Type => $typeHelper ,
Subject => ParseSpecial ($subject) ,
Type => $send_type,
Encoding => "quoted-printable",
Data => $message
);
$msg-> attr( "content-type.charset" => "ISO-8859-15" );
#$msg->build(Subject => ParseSpecial($subject) ,
# Data => $message ,
# From => ParseSpecial($fromaddr),
# To => ParseSpecial($to) ,
# Encoding => "quoted-printable" ,
# Content-Type => $typeHelper ,
# #Type => 'multipart/mixed'
# );
## print STDERR "Pasé por acá ABACO\n"; # debug
if ( $name ne "" ) {
$msg-> attach(
Type => $mime-> [0],
Encoding => $mime-> [1],
Filename => $name,
Path => $path,
);
$msg-> attr( "content-type.charset" => "ISO-8859-15" );
## print STDERR "Pasé por aquí ABA934\n"; # debug
}
MIME:: Lite-> send('smtp', '12325618.mail.midominio.com', AuthUser=> "admin@midominio.com", AuthPass=> "mipass");
$msg-> send;
} |
¿Estoy usando bien el modulo MIME::Lite?
¿En AuthUser=> tengo que poner el email desde el cual quiero enviar el correo?
| Perl: | MIME::Lite->send('smtp','12325618.mail.midominio.com', AuthUser=>"admin@midominio.com", AuthPass=>"mipass"); |
Muchas gracias de antemano... |
|

Jue Ene 03, 2008 6:04 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
|
|
|
|
|
Sí, lo estás usando bien. ¿Has instalado los módulos que MIME::Lite necesita? Yo he tenido que instalar MIME::Base64 y Authen::SASL para hacer la parte de autenticación.
En AuthUser debes poner el usuario que el administrador te ha indicado para autentificarte en el sistema.
Ojo, tienes que entrecomillarlo simple, no doble, porque veo que tiene una '@' dentro.
Pregunta al administrador si tienes que autentificarte. Si te dice que no es necesario, no hace falta que hagas esa parte (poner AuthUser ni poner AuthPass). |
|
Jue Ene 03, 2008 9:52 am
|
|
|
|
|
|
Perdón por la ignorancia, pero de Perl no sé casi nada, no tengo claro cómo se instalan los módulos o cómo saber si ya están instalados.
¿Puedo nada más agregarlos de esta manera?
| Perl: | use MIME::Lite;
use MIME::Base64;
use Authen::SASL; |
|
|


Jue Ene 03, 2008 3:15 pm
|
 |
Jenda
Perlero Frecuente

|
Registrado: 29 Oct 2007
Mensajes: 108
Ubicación: Praga, Republica Checa
|
|
|
|
|
Este
| Perl: |
$secname = $ 2;
$secname =~ tr/A-Z/a-z/;
$secname =~ tr/ÁÉÍÓÚ/áéíóú/;
$secname = "\u$secname";
$username = $ 1;
$username =~ tr/A-Z/a-z/;
$username =~ tr/ÁÉÍÓÚ/áéíóú/;
$username = "\u$username";
|
se puede escribir más sencillo como
| Perl: |
for ( ($username, $secname) = ($ 1, $ 2)) {
tr/A-Z/a-z/;
tr/ÁÉÍÓÚ/áéíóú/;
$_ = uc($_);
}
|
Siempre cuando necesitas hacer lo mismo con mas variables puedes usar for(). Es más fácil cambiar o añadir algo así.
Lo mismo con
| Perl: |
$message =~ s/\ [FIRSTNAME\ ]/ $username/gie;
$message =~ s/\ [EMAIL\ ]/ $email/gie;
...
|
| Perl: |
for ($message, $subject) {
s/\ [FIRSTNAME\ ]/ $username/gie;
s/\ [EMAIL\ ]/ $email/gie;
s/\ [DATE\ ]/ $current/gie; # ABA
s/\ [FULLNAME\ ]/ $username. $secname/gie;
s/\ [IP\ ]/ $ip/gie;
s/\ [ADMINNAME\ ]/ $adminname/gie;
s/\ [ADMINMAIL\ ]/ $adminmail/gie;
s/\ [ADMINID\ ]/ $adminid/gie;
s/\ [ADMINSUB\ ]/ $adminsub/gie;
}
|
Actualmente si no usas tantas variables, pero tienes todos estos datos en un hash ($data{FIRSTNAME} en lugar de $username, $data{EMAIL} en lugar de $email, ...) puedes cambiar todo esto a
| Perl: |
for ($message, $subject) {
s/\ [(\w+ )\ ]/ $data{uc $ 1}/gi;
}
|
y si quieres añadir un [VARIABLE] más, lo único que necesitas es poner los datos en el hash %data.
(En tu código original, no necesitas /gie, solo /gi en todos los casos excepto en
| Perl: |
$message =~ s/\ [FULLNAME\ ]/ $username. $secname/gie;
|
y éste se escribe mejor como
| Perl: |
$message =~ s/\ [FULLNAME\ ]/ $username$secname/gi;
|
Cada vez si quieres ayuntar dos strings puedes usar
| Perl: |
$var = $uno . $dos;
|
o
y sin /e en un s/regexp/replacement/ el reemplazo funciona como un string entre "...", con /e el reemplazo funciona como un código.
Así que
| Perl: |
while ( $subject =~ m/\ [DATEX (\d+ )\ ]/i ) {
my $dayTmp = $ 1;
my @tmpDate = ltime ($dayTmp);
my $thisdate = $tmpDate[0] . "/" . $tmpDate[1] . "/" . $tmpDate[2];
$subject =~ s/\ [DATEX (\d+ )\ ]/ $thisdate/i;
}
|
puede ser escrito
| Perl: |
$subject =~ s{\ [DATEX (\d+ )\ ]}{
my @tmpDate = ltime ($ 1);
$tmpDate[0] . "/" . $tmpDate[1] . "/" . $tmpDate[2]
}gie;
|
Es mucho más eficiente.
Jenda
P.S.: Disculpa mi Español, por favor. |
|

Jue Ene 03, 2008 5:48 pm
|
 |
Rene Serrano
Perlero Nuevo

|
Registrado: 27 Nov 2006
Mensajes: 82
Ubicación: El salvador CA
|
|
|
|
|
Jenda, siempre que leo tus post me doy cuenta que
te gustan las REGEX, lo simplifican todo
Saludos, y sigue así. |
|

Vie Ene 04, 2008 12:15 pm
|
|
|
|
|
|
Muchas gracias Jenda por la simplificación.
Explorer he probado esta línea, y no me marcó ningún error pero apareció la página totalmente en blanco, y cuando la página se queda totalmente en blanco normalmente sucede porque hay algún error en el código.
| Perl: | perl -MMIME::Lite -e 1 |
He observado que sucede lo mismo (la página se queda en blanco) cuando agrego esto:
También probé el CGI mínimo y me marcó este error en todos los intentos:
| Código: |
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request. |
El script tal como está sí me funciona perfectamente al enviar los emails mediante SENDMAIL, pero el problema es al intentar hacer este cambio para que los envíe mediante un servidor SMTP externo. |
|

Vie Ene 04, 2008 5:36 pm
|
|
|
|
|
|
explorer, he probado de nuevo el CGI MÍNIMO cambiando desde el servidor los permisos del archivo y me ha funcionado correctamente para estos módulos:
use MIME::Lite;
use MIME::Base64;
Pero cuando agrego este otro use Authen::SASL; me marca el siguiente error:
| Código: |
Software error:
Can't locate Authen/SASL.pm in @INC (@INC contains: /usr/lib/perl5/5.8.8/i686-linux /usr/lib/perl5/5.8.8 /usr/lib/perl5/site_perl/5.8.8/i686-linux /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl .) at prueba.cgi line 10.
BEGIN failed--compilation aborted at prueba.cgi line 10. |
¿Alguna sugerencia?
Ultima edición por teamvipconnectz el Sab Ene 05, 2008 3:49 pm, editado 1 vez |
|
Vie Ene 04, 2008 5:47 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
|
|
|
|
|
| Pues eso es que no está instalado... |
|


Sab Ene 05, 2008 3:47 pm
|
|
|
|
|
|
Estoy intentando con este script básico para enviar el email con el SMTP externo, pero sigo sin hacerlo funcionar, con sendmail si me funciona, pero para enviarlo con el SMTP remoto no. ¿Qué estaré haciendo mal?
| Perl: | #!/usr/bin/perl
use strict;
use MIME:: Lite;
use MIME:: Base64;
my($user)= 'admin@dominio.com';
my($pass)= 'mipass';
my($host)= '13861950.mail.dominio.com';
my $msg = MIME:: Lite-> new(
From => 'admin@dominio.com',
To => 'prueba@hotmail.com',
Subject => 'CGI email',
Data => "FUNCIONA"
);
MIME:: Lite-> send('smtp', $host, AuthUser=> $user, AuthPass=> $pass);
$msg-> send; |
Al correr el script no me marca algún error específico, solo esto:
| Código: |
500 Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request. |
No se me ocurre que más intentar para que funcione. AYUDA |
|

Sab Ene 05, 2008 5:31 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
|
|
|
|
|
El error estará seguramente en el registro de actividad (.log) Mira a ver qué es lo que dice.
Agrega
| Perl: | use CGI:: Carp qw(fatalsToBrowser ); |
al principio del programa para que los errores te los muestre en el cliente web, ya que veo que lo ejecutas como un cgi.
Actualización: He probado tu programa y sí me funciona. Incluso me sobra el módulo MIME::Base64; |
|

Dom Ene 06, 2008 12:10 am
|
|
|
|
|
|
explorer, descargué algunos módulos que no están instalados en mi hosting, para usarlos sin necesidad de tenerlos instalados. Me faltaba principalmente Authen::SASL pero ya he solucionado eso.
Estoy probando con este script:
| Perl: | #!/usr/bin/perl
use lib ('lib');
use CGI:: Carp qw(fatalsToBrowser );
use strict;
use MIME:: Lite;
use Authen:: SASL;
my($usuario)= 'admin@dominio.com';
my($password)= 'mipass';
my($host)= '00.00.00.000';
my $msg = MIME:: Lite-> new(
From => 'admin@dominio.com',
To => 'prueba@hotmail.com',
Subject => 'CGI email',
Data => "FUNCIONA"
);
MIME:: Lite-> send('smtp', $host, AuthUser=> $usuario, AuthPass=> $password);
$msg-> send; |
Pero me está marcando ahora este error:
| Código: |
| Cannot find a SASL Connection library at lib/Net/SMTP.pm line 143 |
¿Sabes a qué se debe? |
|
|