Página 1 de 5

Envío de emails con Perl

NotaPublicado: 2008-01-02 20:41 @903
por teamvipconnectz
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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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;
}
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


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É.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
=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;
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



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.

NotaPublicado: 2008-01-02 21:25 @934
por explorer
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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
MIME::Lite->send('smtp','mail.servidor.net', AuthUser=>$usuario, AuthPass=>$password);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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.

NotaPublicado: 2008-01-02 22:49 @992
por teamvipconnectz
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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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=>"[email protected]", AuthPass=>"mipass");
    $msg->send;
}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


¿Estoy usando bien el modulo MIME::Lite?

¿En AuthUser=> tengo que poner el email desde el cual quiero enviar el correo?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    MIME::Lite->send('smtp','12325618.mail.midominio.com', AuthUser=>"[email protected]", AuthPass=>"mipass");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Muchas gracias de antemano...

NotaPublicado: 2008-01-03 07:04 @336
por explorer
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).

NotaPublicado: 2008-01-03 10:52 @495
por teamvipconnectz
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?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use MIME::Lite;
use MIME::Base64;
use Authen::SASL;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

NotaPublicado: 2008-01-03 11:28 @520
por explorer
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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
perl -MMIME::Lite -e 1
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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.

NotaPublicado: 2008-01-03 16:15 @718
por Jenda
Este

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    $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";
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


se puede escribir más sencillo como

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    for ( ($username, $secname) = ($1, $2)) {
      tr/A-Z/a-z/;
      tr/ÁÉÍÓÚ/áéíóú/;
      $_ = uc($_);
    }
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    $message =~ s/\[FIRSTNAME\]/$username/gie;
    $message =~ s/\[EMAIL\]/$email/gie;
    ...
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    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;
    }
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    for ($message, $subject) {
      s/\[(\w+)\]/$data{uc $1}/gi;
    }
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    $message =~ s/\[FULLNAME\]/$username.$secname/gie;
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y éste se escribe mejor como

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    $message =~ s/\[FULLNAME\]/$username$secname/gi;
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Cada vez si quieres ayuntar dos strings puedes usar

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
   $var = $uno . $dos;
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


o

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
   $var = "$uno$dos".
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    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;
    }
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


puede ser escrito

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    $subject =~ s{\[DATEX(\d+)\]}{
        my @tmpDate = ltime($1);
        $tmpDate[0] . "/" . $tmpDate[1] . "/" . $tmpDate[2]
    }gie;
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es mucho más eficiente.

Jenda
P.S.: Disculpa mi Español, por favor.

NotaPublicado: 2008-01-03 18:48 @825
por Rene Serrano
Jenda, siempre que leo tus post me doy cuenta que
te gustan las REGEX, lo simplifican todo

Saludos, y sigue así.

NotaPublicado: 2008-01-04 13:15 @594
por teamvipconnectz
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.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
perl -MMIME::Lite -e 1
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


He observado que sucede lo mismo (la página se queda en blanco) cuando agrego esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Authen::SASL;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


También probé el CGI mínimo y me marcó este error en todos los intentos:

Código: Seleccionar todo
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.

NotaPublicado: 2008-01-04 18:36 @816
por teamvipconnectz
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: Seleccionar todo
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?