"Gaceta de Linux ...haciendo Linux un poco más divertido!"


Administración de Contenidos con Procmail

Por Pradeep Padala and Prakash Bulusu

Traducido al español por Ricardo A. Frydman
el día 07 de Agosto 2002, para La Gaceta de Linux


"Lo pequeño es hermoso" -- Filosofía Unix

Introducción

Alguna vez pensaste qué lleva crear un sitio web que pueda ser administrado completamente por correo? Eres uno de esos fanáticos del e-mail que desea manejar todo por correo? Eres uno de los que desea algo diferente? Si tu respuesta es si a alguna de éstas preguntas, continúa leyendo...

Alguna vez pensaste cómo un corresponsal especial de la CNN, reportando desde el lugar más remoto de la tierra, puede hacer que la página web modifique su contenido basado en sus últimos reportes? O cómo los diarios puntocoms manejan cientos de páginas HTML por día? Lo logran mediante un concepto llamado Sistema de Administración de Contenidos (Content Management System - CMS).  

La Administración de Contenidos es uno de los tópicos más prominentes con los que un sitio web debe lidiar, desde los sitios con poca carga hasta los de contenido intensivo. Un CMS básico debe, como mínimo, proveer una interfase amigable con el usuario para modificar el contenido web. Uno sofisticado hace mucho más que eso; no sólo provee administración de creaciones, modificaciones y borrado del contenido, sino también servicios como control de revisiones, jerarquías, adm.de contenidos multicanal y envío, etc. En éste artículo hablaremos acerca de un canal relativamente nuevo para la Administración de Contenidos muy conocido por los lectores: el e-mail! Aunque éste canal en particular ha sido utilizado por CMS comerciales como Vignette, son bastante caros y se venden en base a su particularidad. 

Si el párrafo anterior te suena a Griego entonces eres un candidato para leer éste artículo. Aguarde y aprenderá la implementación más simple de CMS basado en e-mail, con Procmail.

Aquí le mostraremos como una página web puede ser actualizada con sólo enviar un correo. Usaremos ésta página de prueba (para ver apropiadamente ésta página, deberías tener Javascript habilitado). Todo lo que contiene es un titular. Actualizaremos el texto del titular al recibir un e-mail con el título apropiado!!!

procmail

Cuál es la conexión con Procmail? Procmail sigue la filosofía Unix de que un programa efectúa una tarea, eficientemente . Procmail es un utilitario de filtrado de correo extremadamente poderoso. Todo lo que hay que hacer es escribir recetas que se ejecutarán cuando determinada clase de correo llegue. Generalmente es utilizado para filtrar correos entrantes en directorios separados. Todo lo que hay que hacer es escribir una receta que será ejecutada al recibir determinado tipo de correo. Generalmente es utilizado para filtrar el correo entrante en diferentes directorios. En palabras del desarrollador de Procmail,
Procmail puede ser utilizado para crear servidores de correo, listas de correo, clasificar tu correo en diferentes carpetas/archivos (muy conveniente cuando estás suscripto a una o más listas o para otorgar prioridad a tu correo), preprocesar el correo, ejecutar determinado programa al llegar tal correo (p.ej. generar diferentes sonidos en tu estación de trabajo para distintos tipos de correo) o reenviar selectivamente cierto correo automáticamente a alguien.

Si no entiendes alguno de los términos anteriores, no te asustes. sólo siéntate y relájate. Te mostraremos algunos ejemplos básicos de cómo funciona y te explicaremos un lindo método para actualizar el titular en tu página web.

El blues inicial

Procmail es una utilidad de filtrado de correo. Puede ser ejecutado por cada correo enviado hacia ti y procesarlo. Digamos, que quieres guardar cada correo con asunto discuss a un directorio llamado discuss. Entonces tienes que escribir las siguientes líneas en los archivos especificados

En tu directorio home creas un archivo llamado .forward y pones las siguientes líneas
	"|IFS=' ';exec /usr/local/bin/procmail USER=<username>"
Reemplaza username con tu nombre de usuario y asegúrate que el camino (path) al binario Procmail esté correctamente configurado. No te preocupes por los detalles. Los veremos en profundidad en la próxima sección.

Crea un archivo llamado .procmailrc en tu directorio home y agrega las siguientes líneas

	:0
	* ^Subject:.*discuss
	discuss

Crea un directorio llamado discuss en tu directorio home para agregar los correos con el asunto discuss.

Ahora envíate a ti mismo un correo que contenga al menos la palabra "discuss" en el asunto. Automáticamente será guardado en el directorio discuss.

Tratemos de comprender qué pasó aquí. Cuando un correo es enviado a un servidor smtp, se envía al correspondiente usuario por un MDA (Mail Delivery Agent = Agente de Despacho de Correo) como sendmail.Éste programa mira en un archivo llamado .forward; si éste existe trata de ejecutar las reglas especificadas en éste archivo. Usualmente, contiene la dirección de correo adonde será destinado el correo. Además podemos escribir comandos para ser ejecutados por programas como procmail. Esto es exactamente lo que las líneas de arriba en .forward, hacen. Para una explicación detallada de lo que podemos poner en .forward mira aquí. Una vez ejecutado Procmail, mira en el archivo .procmailrc, el cual contiene directivas de procesamiento de correo (qué acciones tomar para los diferentes tipos de correo).

El archivo .procmailrc

El archivo .procmailrc contiene las reglas de cómo se filtrará el correo. En el ejemplo, la regla indica que para todos los correos con el asunto discuss, redirigirlo al directorio de ese nombre. La sintaxis general para escribir reglas (llamadas recetas en la jerga Procmail) es

	:0 [símbolos] [ : [locallockfile] ]
	<ninguna o más condiciones (una por línea)>
	<exactamente una acción por línea>

Podemos ignorar la primer línea por ahora. Desde la segunda línea, puedes empezar a escribir condiciones. Una condición que comienza con '*' especifica que se debe compara una expresión regular. Si concuerda, entonces se ejecuta la línea correspondiente a la acción. Si la acción comienza con un '|' entonces se ejecuta el programa que sigue al símbolo. Puedes utilizar el carácter '!'para redirigir el correo a otra dirección. Si la línea de acción no comienza con ninguno de éstos caracteres o con un '{', entonces se asume que es un directorio o un archivo al cual se debe despachar el correo, como en el ejemplo de arriba.

Otro ejemplo nos aclarará el panorama.

	
	:0 c
	* ^Subject:.*discuss
	discuss

	:0
	* ^Subject:.*discuss
	! tunombre@algunlugar.com
Esta receta redirige el correo a la dirección tunombre@algunlugar.com y mantiene una copia en el directorio discuss. El símbolo 'c' en la primer línea le dice a Procmail que debe continuar leyendo recetas aunque concuerde la comparación. Normalmente, se detiene después de la primer coincidencia. La página man de procmailrc dice que 'c' genera una copia del mensaje, pero es más sencillo pensar en la 'c' como "continúa". Cualquiera de las dos tiene el mismo resultado. Otro de mucha utilidad es 'D', que hace que las comparaciones sean sensibles a mayúsculas o minúsculas.

El siguiente ejemplo muestra el uso de '|'

	:0
	* ^Subject:.*discuss
	| formail -I "" >> index.html
Si llega un correo con asunto discuss, se ejecuta formail. Formail es una pequeña utilidad que se puede utilizar para dar formato al correo. La acción anterior, extrae el cuerpo del correo y lo agrega al archivo index.html.

Listo para la acción?

Hemos visto algunos ejemplos básicos. Existe mucha información acerca de Procmail y recetas en la web. Refiérete a la sección de recursos para los enlaces. En las siguientes secciones, mostraremos cómo Procmail se puede usar para actualizar el titular en una página web.

Agregamos las siguientes líneas en .procmailrc. Mi procmailc queda ahora así
	
	SHELL=/bin/sh
	PATH=/bin:/usr/bin:/usr/local/bin
	
	:0
	* ^Subject:.*announce
	| formail -s parse.pl announce;

	:0
	* ^Subject:.*notice
	| formail -s parse.pl notice;

Las primeras líneas establecen algunas variables, de manera que Procmail funcione adecuadamente. Mira la página man de procmailrc para más detalles.

Aquí, los correos que contengan un asunto "announce" o "notice" se redirigen a formail. formail analiza el correo y cada uno es mandado a un script perl llamado parse.pl. El script actualiza el titular con el contenido del cuerpo del mensaje. La versión del texto del script está aquí

#!/bin/perl

$option = $ARGV[0];                                 # Toma la opción
$my_html_dir = "/cise/homes/ppadala/public_html";   # Mi directorio web
$tmp_file = "/tmp/tmp.out";
$start = 0;     #start será falso(0) hasta que encontremos el comienzo del mensaje 
$line = "";     #La línea del titular

if($option eq "announce") {
    $line = "ANNOUNCEMENTS:";
}
elsif($option eq "notice") {
    $line = "NOTICE:";
}
else {
    exit(1);
}

#Lee el ingreso. En este caso los correos
#Analiza el cuerpo y lo agrega a line

while()
{	chomp;

	if(/From.*/) {
		$start = 0;
	}	
	if($start == 1) {
		chomp;
		$line = $line . $_;
	}
	if($_ eq "") {
		$start = 1;
	}
}

#Abre la página web que contiene el titular 
#y lo actualiza

$my_homepage_file = $my_html_dir . "/procmail.html";
open(MY_FILE, "<$my_homepage_file") || die("No se puede abrir el archivo de ingreso");
open(TMP, ">$tmp_file");

$replace = 0;

#El reemplazo se realiza justo después de la línea
# //Replace strStreamer .....

while()
{	if($replace == 1) {
		print TMP "var strStreamer = '${line}';\n";
		$replace = 0;
		next;
	}
		
	if(/\/\/Replace str.*/) {
		$replace = 1;
		print TMP $_;
	}
	else  {
		print TMP $_;
	}
}
	
close(TMP);
close(MY_FILE);
system("mv $tmp_file $my_homepage_file");
system("chmod go+r $my_homepage_file");

Todo lo que el script hace es actualizar la variable strStreamer en la página web. Esta contiene un titular escrito en javascript. Puedes probarlo enviándolo a mail Puede ser el titular en http://www.cise.ufl.edu/~ppadala/procmail.html. Se actualiza mágicamente cuando envías el correo a mi dirección con el asunto "announce" o "notice". El texto del cuerpo va al titular.

Conclusión

Este es un pequeño ejemplo de Administración de Contenidos. Éste es un campo amplio con muchas ramificaciones. Requiere procedimientos bien planeados para actualizar páginas web, mantener su estilo intacto, etc. Hemos mostrado un pequeño ejemplo de cuán fácil es crear un CMS básico con Procmail. Las combinaciones son ilimitadas. Como dijo Descartes "No es suficiente con tener una buena mente. Lo principal es usarla bien".

Recursos

Pradeep Padala

Soy estudiante de maestría en la Universidad de Florida. Me gusta programar y adoro Linux. Mis intereses incluyen resolver crucigramas y jugar juegos de tablero. Me puedes contactar en p_padala@yahoo.com o mi sitio web.

Prakash Bulusu

Soy estudiante de maestría en la Universidad de Florida.


Copyright © 2001, Pradeep Padala and Prakash Bulusu.
Licencia de Copia http://www.linuxgazette.com/copying.html
Publicado en el Número 73 de la Gaceta de Linux, Diciembre de 2001