• Publicidad

Envío de emails con Perl

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Envío de emails con Perl

Notapor teamvipconnectz » 2008-01-02 20:41 @903

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.
teamvipconnectz
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2008-01-02 20:33 @898

Publicidad

Notapor explorer » 2008-01-02 21:25 @934

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor teamvipconnectz » 2008-01-02 22:49 @992

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...
teamvipconnectz
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2008-01-02 20:33 @898

Notapor explorer » 2008-01-03 07:04 @336

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).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor teamvipconnectz » 2008-01-03 10:52 @495

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
teamvipconnectz
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2008-01-02 20:33 @898

Notapor explorer » 2008-01-03 11:28 @520

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Jenda » 2008-01-03 16:15 @718

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.
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor Rene Serrano » 2008-01-03 18:48 @825

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

Saludos, y sigue así.
------------
¦23n3
Rene Serrano
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2006-11-27 12:35 @565
Ubicación: El salvador CA

Notapor teamvipconnectz » 2008-01-04 13:15 @594

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.
teamvipconnectz
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2008-01-02 20:33 @898

Notapor teamvipconnectz » 2008-01-04 18:36 @816

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?
Última edición por teamvipconnectz el 2008-01-05 16:49 @742, editado 1 vez en total
teamvipconnectz
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2008-01-02 20:33 @898

Siguiente

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 17 invitados

cron