[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Procesando correo con Procmail, comando incorrecto



Maria Garcia Suarez, a las 15:30 del miércoles 16 abr 2003, comentó:
> Hola!
> 
> Siguiendo la recomendacion de la gente de la lista
> (gracias!) me he mirado (e he instalado) procmail.

Estoy seguro que los consejos acerca de instalar procmail tenía la mejor
intención, pero vistos los resultados dudo mucho que fueran acertados.

Procmail es una potente herramienta para filtrar y clasificar correo,
pero en manos inexpertas es la forma más fácil de que éste se pierda (o
que se acumule sin control). Es el doble filo de cualquier herramienta.

Vamos por partes:

> He creado el directorio ~HOME/.procmail
> 
> Alli he creado el fichero ~HOME/.procmail/.procmailrc
> con el siguiente contenido:

Primer punto; yo no lo llamaría .procmailrc, para evitar confusiones con
el ~/.procmailrc y evitar problemas, ya que aunque esté en otro
directorio, si se mueve al $HOME sin pensar y el sistema está
configurado para usar cualquier ~/.procmailrc que encuentre entonces si
puedes perder correo. Llamémosle pues "filtro.rc".

Ahora es evidente lo que ocurre: al ejecutar "formail -s procmail <mbox",
procmail intenta leer el ~/.procmailrc, que no existe, y envía otra vez
el correo al spool...

> VERBOSE=on
> MAILDIR=$HOME
> PMDIR=$HOME/.procmail
> DEFAULT=/var/spool/mail/maria
> LOGFILE=$PMDIR/procmail.log
> INCLUDERC=$PMDIR/general.rc

Con esto en filtro.rc, después de procesar las recetas en general.rc, el
procmail deposita cualquier correo no enviado a un buzón (en este caso
TODOS, puesto que las condiciones de las recetas están mal escritas) en
el buzón por omisión ($DEFAULT), como si existiese la siguiente receta
implícita al final:

  :0:
  $DEFAULT

Esa es otra razón para que el /var/spool/mail/$USER ($DEFAULT) crezca
sin control. Por tanto, y para este caso, al final de tu filtro.rc pon
(repito que únicamente para este caso concreto):

  :0
  /dev/null

Ten en cuenta de que el correo no desaparece del spool (o el fichero de
entrada que leas), sino simplemente es descartado por este filtro.

Otra cosa. Mira el "$PMDIR/procmail.log". Estoy convencido que ahora
mismo te está ocupando bastantes megas inútilmente, debido al
"VERBOSE=on", que es útil para depurar fallos, pero aquí lo único que se
consigue es consumir más espacio de disco, puesto que ni siquiera podrás
entender lo que registra. Así que bórralo sin problemas, y cambia lo
siguiente:

  VERBOSE=no
  LOGABSTRACT=all

Con eso te registrará en $LOGFILE la cabecera de cada correo y el buzón
al que lo envía (o el filtro/comando que lo procesa). Eso será más que
suficiente para ver donde termina el correo que intentas filtrar. El
resto puede quedarse como está para este caso. Aunque yo recomendaría
crear un directorio Mail (ó mail), y poner "MAILDIR=$HOME/Mail", para
no correr el riesgo de que coincida el nombre de un buzón con el de
algún fichero que tengas en tu $HOME.

Vamos con el $PMDIR/general.rc
Dado que ahora en $DEFAULT tienes los correos duplicados, lo primero es
poner una receta que filtre dichos duplicados:

  :0 hW: $MAILDIR/msgid.cache$LOCKEXT
  |formail -D 100000 $MAILDIR/msgid.cache

Esta receta (casi tomada literalmente del man de procmailex) crea una
cache con las cabeceras Message-Id: de cada correo, eliminando aquellos
que coinciden con alguna de las guardadas en la cache. He puesto un
tamaño relativamente alto (100K) para este caso, pero según el número de
correos que tengas en el spool puede que necesites incluso algo más
grande. Calcula que cada msgid ocupa unos 50 bytes, multiplica por el
número de correos (aprox.) y por 2 (para dar margen) y pon esa cifra.

Ahora las recetas. Por cada dirección de correo que quieras separar en
un buzón diferente, pon lo siguiente:

  :0:
  * ^TOlista-de-correoN
  lista-de-correoN

Al final de todas las recetas, pon una que recoja todas las que no
coincidan (si no coincide ninguna, todos los correos irán aquí, salvo
los duplicados):

  :0:
  lista-desconocida

Si te fijas, con esta receta, la de arriba que descartaba el correo
(enviándolo a /dev/null) en ningún caso sería alcanzada... salvo que
cambiemos el nombre a general.rc y no cambiemos el $INCLUDERC, o
viceversa.

Ahora ya puedes ejecutar:

  $ formail -ds procmail ~/.procmail/filtro.rc </var/spool/mail/$USER

Examina el correo en los buzones creados, mira que todo ha funcionado
correctamente ojeando el $LOGFILE, y ya puedes borrar tanto el $LOGFILE
como el spool (usa ">/var/spool/mail/$USER").

Me he referido siempre al spool (/var/mail/spool/$USER) pero esto
también lo puedes aplicar a tu "~/mbox"; eso ya depende de lo que
quieras hacer, de cómo tengas configurada la recogida de correo, etc.

Y no te preocupes en perder correo si algo va mal; este estará siempre
en el spool o en ~/mbox, y en el peor de los casos lo que harías es
duplicarlo, como de echo ya te ha ocurrido.

Si necesitas unas recetas un poco más elaboradas (por ejemplo, filtrar
por fechas, origen, lo que sea) háznoslo saber y te echaré/echaremos una
mano.

Saludos

	MS



Reply to: