Herramienta para Mass-Mailing en Perl

Ernesto Hernandez-Novich emhn at telcel.net.ve
Fri Apr 20 10:13:56 CDT 2001


On Tue, 17 Apr 2001, Alfredo Rahn wrote:
> Si bien existen varios manejadores de listas que tienen esta opcion
> (EzMLM, Majordomo, etc.), el servidor que me presta sus servicios no me
> provee con ninguno de ellos. Instalarlos no es una opcion, como tampoco
> lo es cambiarme de servidor.

Puedes instalarte majordomo en tu directorio personal. Puedes pedir a
los administradores que te hagan un alias de correo para asociarlo
a majordomo.

> Originalmente lo hacia con un sistema llamado PostLister (algo que baje
> de FreshMeat), pero hace tiempo que se quedo corto y debo encontrar
> algo mas
> serio.

Majordomo.

> Luego, preciso hacer un programa que dada la lista de direcciones (por
> ejemplo
> en un archivo de texto plano) y el contenido del correo lo envie a
> todos 
> los subscritos, de manera, por supuesto, que en el campo "To:" del
> correo 
> no se vean las 100.000 direcciones sino solo aquella de quien esta 
> recibiendo.

Hay un programa en perl que dada la lista de direcciones en un archivo
plano y el contenido del correo, lo envía a los suscritos y te permite
todo tipo de "header munging" que se te ocurra. Puedes obtenerlo
en http://www.greatcircle.com/majordomo

> 
> Cuento con el Sendmail para enviar los correos.
> 
> Otra restriccion es que no poseo acceso via Telnet, por lo cual
> compilar 
> algo en C alla arriba me resulta complicado.

¿Qué tipo de hosting es ese? ¿Son Nazis, Fascistas o Cobardes?

> Por lo tanto, mi idea es desarrollar un script en Perl que ejecute la
> tarea, 
> pero la unica forma que tengo de llamarlo es a traves de CGI.
> 
> Venga entonces la amabilidad de los expertos en aclararme lo siguiente:
> 
> 1. Como hago para que un script de Perl se clone (via fork() supongo?),
> 
> y que el proceso hijo siga corriendo al tiempo que el padre (el CGI)
> muere?
> Podria alguien enviarme, si fuera posible, un snippet de codigo para 
> hacer tal cosa?

Usas fork como se describe en man perlfunc. El proceso padre no debe
esperar por sus hijos.

La manera "a prueba de balas" de hacer fork con reintento es más o
menos así.

FORK: {
    if ($pid = fork) {
        # Aquí va el código del padre.
        # $pid tiene el PID del _hijo_
    } elsif (defined $pid) { # $pid is zero here if defined
        # Aquí va el código del hijo.
        # Si quieres el PID del padre usa getppid()
    } elsif ($! =~ /No more process/) {     
        # EAGAIN, reintentar el fork
        sleep 5;
        redo FORK;
    } else {
        # Error fatal
        die "Can't fork: $!\n";
    }
}

En el padre, no esperas (no uses wait). En el hijo debes ignorar la
señal de HUP para que cuando el padre muera, el hijo continúe. Los
detalles en man perlfunc.

> 2. Que forma es mas eficiente (y por ende, menos voraz contra los
> recursos 
> del sistema) de invocar el sendmail? Via sockets (al puerto 25) o con
> un 
> 'open(OUT, "|/bin/sendmail -t" )'?

Si vas a usar el sendmail _local_, el open() es la forma "correcta".
Ahora, no tiene ninguna gracia que implementes SMTP y el RFC-822 en tu
programa para componer los mensajes. Usa los módulos Mail disponibles
en CPAN para componer el sobre, el cuerpo y hacer alguna manipulación de
los encabezados.

Esto es, sólo aquellos que no conocen CPAN harían,

open(SENDMAIL, "|/usr/lib/sendmail -oi -t -odq")
                    or die "Can't fork for sendmail: $!\n";
print SENDMAIL <<"EOF";
From: E. S. Pammer <muere\@bastar.do>
To: Inocente Lector <hundido\@hue.co>
Subject: Esto no es SPAM, sólo molestamos sin razón previa

Todo el cuerpo del mensaje aquí
EOF
close(SENDMAIL)     or warn "sendmail didn't close nicely";

lo cual es lamentable, porque con bajarse Mail::Mailer pueden hacer,

use Mail::Mailer;

$mailer = Mail::Mailer->new("sendmail");
$mailer->open({ From    => $from_address,
                To      => $to_address,
                Subject => $subject,
              })
    or die "Can't open: $!\n";
print $mailer $body;
$mailer->close();

es tan simple como eso. CPAN (Comprehensive Perl Archive Network) es
accesible en http://www.perl.com

> 3. Hay algun truco para que sendmail sea mas rapido procesando los
> mensajes?
> Ordenarlos por dominio de destino ayudaria en algo? Cuantos recipients
> puedo poner en un mismo mensaje?

Ordenarlos por e-mail es necesario previo a 8.9; majordomo lo hace por
tí hasta cierto punto. La cantidad de destinatarios depende de algunos
parámetros de configuración de sendmail (que en general nadie usa, así
que en la práctica está limitado por la cantidad de memoria disponible).

> 4. Hay algun sistema que ya haga esto que yo quiero? Alguna experiencia

Majordomo. Exempli gratia.
-- 
Ernesto Hernández-Novich - Running Linux 2.4.2 i686 - Unix: Live free or die!
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/E d+(++) s+: a C+++$ UBLAVHIOSC*++++$ P++++$ L+++$ E- W+ N++ o K++ w--- O-
M- V PS+ PE Y+ PGP>++ t+ 5 X+ R* tv+ b++ DI+++$ D++ G++ e++ h r++ y+
-----END GEEK CODE BLOCK-----

------------------------------------------------------------------------
Enviar e-mail a <majordomo at pm.org> colocando en el cuerpo:
"UNSUBSCRIBE caracas-pm-list" para desuscribirse.
"INFO caracas-pm-list" para conocer las reglas de etiqueta.
------------------------------------------------------------------------



More information about the caracas-pm mailing list