Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Envío de emails con Perl
Ir a página 1, 2, 3  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mie Ene 02, 2008 7:41 pm
teamvipconnectz
Perlero Nuevo
Perlero Nuevo
Registrado: 02 Ene 2008
Mensajes: 20
Envío de emails con Perl Responder citando

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&iacute; 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.
Mensaje Mie Ene 02, 2008 8:25 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Mie Ene 02, 2008 9:49 pm
teamvipconnectz
Perlero Nuevo
Perlero Nuevo
Registrado: 02 Ene 2008
Mensajes: 20
Responder citando

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&iacute; 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...
Mensaje Jue Ene 03, 2008 6:04 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
Responder citando

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).
Mensaje Jue Ene 03, 2008 9:52 am
teamvipconnectz
Perlero Nuevo
Perlero Nuevo
Registrado: 02 Ene 2008
Mensajes: 20
Responder citando

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;
Mensaje Jue Ene 03, 2008 10:28 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
Responder citando

Pues no, hay que instalarlos en el sistema. En el sistema donde va a correr la aplicación, naturalmente.

Para saber si están instalados lo normal es ejecutar desde la línea de comandos algo como

Perl:
perl -MMIME::Lite -e 1


Si no da ningún error, es que está instalado.

Pero claro, para hacer eso tienes que tener acceso a la línea de comandos del ordenador servidor.

Si es a través de CGI, puedes usar mi CGI mínimo, para hacer pruebas, añadiendo las líneas use anteriores.
Mensaje Jue Ene 03, 2008 3:15 pm
Jenda
Perlero Frecuente
Perlero Frecuente
Registrado: 29 Oct 2007
Mensajes: 108
Ubicación: Praga, Republica Checa
Responder citando

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

Perl:

   $var = "$uno$dos".


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.
Mensaje Jue Ene 03, 2008 5:48 pm
Rene Serrano
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Nov 2006
Mensajes: 82
Ubicación: El salvador CA
Responder citando

Jenda, siempre que leo tus post me doy cuenta que
te gustan las REGEX, lo simplifican todo

Saludos, y sigue así.
Mensaje Vie Ene 04, 2008 12:15 pm
teamvipconnectz
Perlero Nuevo
Perlero Nuevo
Registrado: 02 Ene 2008
Mensajes: 20
Responder citando

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:

Perl:
use Authen::SASL;


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.
Mensaje Vie Ene 04, 2008 5:36 pm
teamvipconnectz
Perlero Nuevo
Perlero Nuevo
Registrado: 02 Ene 2008
Mensajes: 20
Responder citando

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
Mensaje Vie Ene 04, 2008 5:47 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
Responder citando

Pues eso es que no está instalado...
Mensaje Vie Ene 04, 2008 6:53 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
Responder citando

Perl:
perl -MMIME::Lite -e 1


es para ejecutarlo en la línea de comandos, no como un CGI.
Mensaje Sab Ene 05, 2008 3:47 pm
teamvipconnectz
Perlero Nuevo
Perlero Nuevo
Registrado: 02 Ene 2008
Mensajes: 20
Responder citando

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
Mensaje Sab Ene 05, 2008 5:31 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
Responder citando

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;
Mensaje Dom Ene 06, 2008 12:10 am
teamvipconnectz
Perlero Nuevo
Perlero Nuevo
Registrado: 02 Ene 2008
Mensajes: 20
Responder citando

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?
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio