Provided by:
manpages-es-extra_0.8a-17_all 
NOMBRE
procmailex - ejemplos de ficheros de recursos
SINOPSIS
Ejemplos de $HOME/.procmailrc
DESCRIPCI'ON
Para un descripcion del formato del fichero de recursos vease
procmailrc(5).
La tecnica de puntuacion de peso se describe en detalle en la pagina de
manual de procmailsc(5).
Esta pagina de manual muestra varios ejemplos de recetas. Por ejemplo
ficheros de recursos completos que puede comprobar en la seccion NOTAS
en procmail(1), o mirar a la parte de ejemplos de ficheros de recursos
de la distribucion fuente de procmail (procmail*/examples/?procmailrc).
EJEMPLOS
Ordena todo el correo procedente de la lista de correo scuba-dive en la
carpeta de correo ficheroscuba (usa el fichero de bloqueo local
scubafile.lock).
:0:
* ^TOscuba
ficheroscuba
Reenvia todo el correo de pedro sobre compiladores a guillermo (y
mantiene una copia aqui en petcompil).
:0
* ^From.*pedro
* ^Subject:.*compiladores
{
:0 c
! guillermo@algunsitio.edu
:0
petcompil
}
Una solucion equivalente que realiza lo mismo:
:0 c
* ^From.*pedro
* ^Subject:.*compiladores
! guillermo@algunsitio.edu
:0 A
petcompil
Una solucion equivalente, pero ligeramente mas lenta que realiza lo
mismo:
:0 c
* ^From.*pedro
* ^Subject:.*compiladores
!guillermo@somewhere.edu
:0
* ^From.*pedro
* ^Subject:.*compiladores
petcompil
Si vd. es completamente nuevo en procmail y quiere experimentar un
poquito, con frecuencia ayuda tener una red segura de algun tipo.
Inserte las dos siguientes recetas sobre todas las otras recetas para
estar seguro de que todo el correo que llega siempre conserva los
ultimos 32 mensajes. Para que funcione como se prentende, tiene que
crear un directorio llamado `backup' en $MAILDIR antes de insertar
estas dos recetas.
:0 c
backup
:0 ic
| cd backup && rm -f dummy `ls -t msg.* | sed -e 1,32d`
Si su sistema no genera o genera lineas `From' iniciales incorrectas en
cada mensaje, puede corregir esto llamando a procmail con la opcion -f-
. Para corregir el mismo problema por medios distintos, podria haber
insertado las dos siguientes recetas sobre todas las otras del fichero
de recursos. Estas filtraran la cabecera de cualquier mensaje mediante
formail que elimina cualquier `From' inicial y lo regenera
automaticamente a continuacion.
:0 fhw
| formail -I "From " -a "From "
Anade las cabeceras de todos los mensajes que no vienen del postmaster
a su coleccion de cabeceras privadas (para uso estadistico o depuracion
de correo); y usa el fichero de bloqueo `headc.lock'. Para estar
seguro de que el fichero de bloqueo no se elimina hasta que la tuberia
ha finalizado, tendra que especificar la opcion `w'; en otro caso el
fichero de bloqueo seria eliminado tan pronto como la tuberia ha
aceptado el correo.
:0 hwc:
* !^FROM_MAILER
| uncompress headc.Z; cat >>headc; compress headc
O, si usara gzip, mas eficiente que compress:
:0 hwc:
* !^FROM_MAILER
| gzip >>headc.gz
Reenvia todos los mensajes de menos de 1000 bytes a mi direccion
personal (no se necesita fichero de bloqueo en esta receta).
:0
* < 1000
! myname@home
Divide las recopilaciones de la lista de correo surfing en mensajes
individuales y los almacena en surfing, usando como fichero de bloqueo
local surfing.lock.
:0:
* ^Subject:.*surfing.*Digest
| formail +1 -ds >>surfing
Almacena todo lo que llega del postmaster o mailer-daemon (como correo
rebotado) en el fichero postm, usando como fichero de bloqueo local
postm.lock.
:0:
* ^FROM_MAILER
postm
Una simple receta de respuesta automatica. Se toma la seguridad que ni
el correo de cualquier demonio (como correo rebotado o correo de una
lista), ni las respuestas automaticas procedentes de usted mismo seran
respondidas automaticamente. Si no se toma esta precaucion, podrian
suceder desastres (correo en anillo). Para que esta receta responda a
todo el correo entrante, desde luego, deberia insertarla antes que
cualquier otra receta en su fichero de recursos. Sin embargo es
aconsejable ponerla tras cualquier receta que procese los correos de
una lista de correo a la que estemos suscritos; generalmente no es
buena idea generar autorespuestas a las lista de correo(si, la
expresion regular !^FROM_DAEMON deberia coger esos, pero si la lista de
correo no sigue las convenciones aceptadas, esto podria no ser
suficiente).
:0 h c
* !^FROM_DAEMON
* !^X-Loop: your@own.mail.address
| (formail -r -I"Precedence: junk" \
-A"X-Loop: su_propia@direccion.de.correo" ; \
echo "Mail recibido.") | $SENDMAIL -t
Una receta de autorespuesta mas complicada que lleva a cabo funciones
equivalentes al bien conocido programa vacation(1) Esta receta esta
basada en los mismos principios que la ultima (previniendo el correo en
`anillo'). Ademas de eso, sin embargo, mantiene una base de datos
vacation extrayendo el nombre del remitente e insertandolo en el
fichero vacation.cache si el nombre es nuevo (el fichero
vacation.cache lo mantiene formail que estara seguro que siempre
contiene los nombres mas recientes, el tamano del fichero esta limitado
a un maximo de aproximadamente 8192 bytes). Si el nombre es nuevo, se
envia una respuesta automatica.
Como puede ver, la siguiente receta tiene comentarios entre las
condiciones. Esto esta permitido. Sin embargo no ponga comentarios en
la misma linea que una condicion.
SHELL=/bin/sh # para otras shells, esto podria necesitar ajustes
:0 Whc: vacation.lock
# Realiza un chequeo rapido para ver si el correo va dirigido a nosotros
* $^To:.*\<$\LOGNAME\>
# No responde a demonios ni a listas de correo
* !^FROM_DAEMON
# Los bucles de correo son un desastre
* !^X-Loop: your@own.mail.address
| formail -rD 8192 vacation.cache
:0 ehc # si el nombre no esta en el cache
| (formail -rI"Precedence: junk" \
-A"X-Loop: your@own.mail.address" ; \
echo "He recibido tu correo,"; \
echo "pero no regresare hasta el lunes."; \
echo "-- "; cat $HOME/.signature \
) | $SENDMAIL -oi -t
Almacena todos los mensajes referentes a TeX en un fichero unico
separado, en un directorio llamado texmail (este directorio tiene que
existir); no hay necesidad de usar ficheros locales de bloqueo en este
caso, por tanto no lo haremos.
:0
* (^TO|^Subject:.*)TeX[^t]
texmail
Lo mismo que arriba, salvo que ahora almacenamos los mensajes en
ficheros numerados (carpeta de correo MH).
:0
* (^TO|^Subject:.*)TeX[^t]
texmail/.
O podria archivar el correo en varios carpetas directorios a la misma
vez. La siguiente receta entregara el correo a carpetas MH y una
carpeta directorio. Actualmente es solo un fichero con dos enlaces
duros extras.
:0
* (^TO|^Subject:.*)TeX[^t]
texmail/. wordprocessing dtp/.
Almacena todos los mensajes sobre encuentros en una carpeta que esta en
un directorio que cambia cada mes. V. g. si fuera Enero de 1994, la
carpeta tendria el nombre `94-01/encuentros' y le fichero de bloqueo
local seria `94-01/encuentros.lock'.
:0:
* meeting
`date +%y-%m`/encuentros
Lo mismo que arriba, pero si el directorio `94-01' no existiera, se
crearia automaticamente
CARPETAMESUAL=`date +%y-%m`
:0 Wic
* ? test ! -d $CARPETAMESUAL
| mkdir $CARPETAMESUAL
:0:
* encuentro
${CARPETAMESUAL}/encuentro
Lo mismo que arriba, pero con medios ligeramente diferentes:
CARPETAMESUAL=`date +%y-%m`
DUMMY=`test -d $CARPETAMESUAL || mkdir $CARPETAMESUAL`
:0:
* encuentros
${CARPETAMESUAL}/meeting
Si esta suscrito a varias listas de correo y la gente envia mesajes
cruzados a varias de ellas, normalmente recibe varios correos
duplicados (uno de cada lista). La siguiente receta simple elimina
mensajes duplicados. Le dice a formail que mantenga un fichero cache de
8Kb en el cual se almacenan los identificadores de mensaje de los
correos mas reciente que ha recibido. Como se garantiza que los
identificadores de mensaje son unicos para cada mensaje, son ideales
para descartar los mensajes duplicados. Simplemente ponga la siguiente
receta al comienzo de su fichero de recursos y ningun mensaje duplicado
lograta pasarla.
:0 Wh: msgid.lock
| formail -D 8192 msgid.cache
Tenga cuidado si tiene problemas de entrega en las recetas debajo de
esto y procmail intenta reencolar el correo, entonces en la proxima
ejecucion de la cola, este mensaje se considerara duplicado y
seraeliminado. Para quienes quieren seguridad pueden usar la siguiente
receta en su lugar. Esta pone los duplicados en una carpeta separada en
lugar de eliminarlos. Esto le obliga a vaciar periodicamente la
carpeta, por supuesto.
:0 Whc: msgid.lock
| formail -D 8192 msgid.cache
:0 a:
duplicates
Procmail puede entregar a carpetas MH directamente, pero no actualiza
las secuencias no vistas que el MH real gestiona. Si quiere que
procmail actualice estas tambien , use una receta como la siguiente que
almacena todo lo que tenga la palabra spam en el cuerpo del mensaje en
una carpeta MH llamada spamfold. Observe que el fichero de bloqueo
local, que es necesario porque los progamas MH no bloquean el ficher de
secuencias. Las llamadas asincronas de los progamas MH que cambian el
fichero de secuencias pueden corromper el fichero o simplemente perder
los cambios. Por desgracia, el fichero de bloqueo no resuelve el
problema completamente ya que rcvstore se podria llamar mientras `show'
o `mark' u otro programa MH esta en ejecucion. El problema se epera
corregir en alguna version futura de MH, pero hasta entonces tendra que
valorar el riesgo de perder o corromper las secuencias contra lo
beneficios de las secuencias no vistas.
:0 :spamfold/$LOCKEXT
* B ?? spam
| rcvstore +spamfold
Cuando entregue a carpetas emacs (i.e. carpetas de correo gestionadas
por cualquier paquete de correo de emacs, v.g. RMAIL o VM)
directamente, deberia usar ficheros de bloqueo compatibles con emacs.
Los programas de correo de emacs son un poco descerebrados en ese
respecto, se molestan mucho si alguien entrega a carpetas de correo que
ellos ya tienen en sus bufferes internos. La siguiente receta supone
que $HOME es igual a /home/john.
MAILDIR=Mail
:0:/usr/local/lib/emacs/lock/!home!john!Mail!mailbox
* ^Subject:.*loquesea
mailbox
De forma alternativa, puede hacer que procmail entrega en su propio
conjunto de carpetas, las cuales se pueden vaciar periodicamente yu
copiarlas sobre sus porpios ficheros emacs usando movemail. Movemail
usa ficheros de bloqueo locales buzon.lock por buzon. Actualmente este
es el modo de operacion preferido en conjuncion con procmail.
Para extraer ciertas cabeceras de un correo y pponerlas en variables de
entorno puede usar cualquiera de las siguientes construcciones:
SUBJECT=`formail -xSubject:` # campo regular
FROM=`formail -rt -xTo:` # caso especial
:0 h # metodo alternativo
KEYWORDS=| formail -xKeywords:
Si usa ficheros temporales en un fichero procmailrc, y quieres estar
seguro de que se eliminan antes de que procmail termine, podria usar
algo como las lineas de:
TEMPORARY=$HOME/tmp/pmail.$$
TRAP="/bin/rm -f $TEMPORARY"
TRAP se puede usar para modificar el codigo de salida de procmail.
I.e. si quiere que procmail devuelva un codigo de salida de `1' en
lugar de sus codigos de salida regulares, podria usar:
EXITCODE=""
TRAP="exit 1;" # El punto y coma final es importante.
# ya que exit no es un programa standalone
O, si el codigo de salida no necesita depender de la ejecucion de
programas de TRAP, puede usar un simple:
EXITCODE=1
La siguiente receta imprime cada correo de entrada que se parezca a un
fichero postscript.
:0 Bb
* ^^%!
| lpr
La siguiente receta hace lo mismo, pero un poco mas selectiva. Solo
imprime el fichero postscript si viene del servidor de impresion. La
primera condicion concuerda solo si se encuentra en la cabecera. La
segunda condicion solo concuerda al comienzo del cuerpo.
:0 b
* ^From[ :].*print-server
* B ?? ^^%!
| lpr
Lo mismo que arriba, pero por unos medios ligeramente diferentes:
:0
* ^From[ :].*print-server
{
:0 B b
* ^^%!
| lpr
}
Igualmente:
:0 HB b
* ^^(.+$)*From[ :].*print-server
* ^^(.+$)*^%!
| lpr
Supongamos que tiene dos cuentas y usa esas dos cuentas regularmente,
pero estan en lugares distintos (i.e. solo podria leer el correo que
llega a una de las cuentas). Le gustaria reenviar el correo que llega a
la cuenta uno a la cuenta dos y al contrario. Lo primero que se viene a
la mente es usar ficheros .forward en ambos sitios; esto no funcionara,
desde luego, ya que estara creando un bucle de correo. Este bucle se
puede evitar insertando la siguiente receta frente a todas las otras
recetas en los ficheros$HOME/.procmailrc de ambos sitios. Si esta
seguro que anade el mismo campo X-Loop: en ambos sitios, el correo se
puede reenviar de una cuenta a otra con garantias.
:0 c
* !^X-Loop: yourname@your.main.mail.address
| formail -A "X-Loop: yourname@your.main.mail.address" | \
$SENDMAIL -oi yourname@the.other.account
Si alguien le envia un correo con la palabra `retrieve' en el campo
`subject', lo siguiente devolvera automaticamente el contenido del
fichero info_file al remitente. Como en todas las recetas donde
enviamos correo, tenemos que vigilar los bucles de correo.
:0
* !^From +YOUR_USERNAME
* !^Subject:.*Re:
* !^FROM_DAEMON
* ^Subject:.*retrieve
| (formail -r ; cat info_file) | $SENDMAIL -oi -t
A continuacion un ejemplo para un simple servidor de ficheros accesible
por correo. Para aplicaciones con mayores exigencias, le sugiero que le
eche un vistazo a SmartList (disponible en el mismo lugar que la
distribucion de procmail). Como se indica, este servidor de ficheros
devuelve solamente un fichero por peticion, ignora el cuerpo del
mensaje recibido, la linea Subject: tiene que parecerse a "Subject:
envia fichero el_fichero_que_quiere" (los espacios en blanco son
significativos), no devuelve ficheros que empiezan por punto ni permite
recuperar ficheros que esten fuera del arbol de directorios del
servidor de ficheros (si decide usar este ejemplo, este seguro de
perder esta ultima restriccion por descuido).
:0
* ^Subject: send file [0-9a-z]
* !^X-Loop: yourname@your.main.mail.address
* !^Subject:.*Re:
* !^FROM_DAEMON
* !^Subject: send file .*[/.]\.
{
MAILDIR=$HOME/fileserver # cambiar al directorio del servidor de ficheros
:0 fhw # invierte las cabeceras y extrae el nombre
* ^Subject: send file \/[^ ]*
| formail -rA "X-Loop: yourname@your.main.mail.address"
FILE="$MATCH" # el fichero soliciatado
:0 ah
| cat - ./$FILE 2>&1 | $SENDMAIL -oi -t
}
El siguiente ejemplo pre-convierte todos los correos que llegan en
texto simple en cierto formato codificado MIME en otro formato de 8
bits mas compacto que se puede usar y mostrar con mas facilidad por la
mayoria de los programas. El programa mimencode(1) es parte del paquete
metamail de Nathaniel Borenstein.
:0
* ^Content-Type: *text/plain
{
:0 fbw
* ^Content-Transfer-Encoding: *quoted-printable
| mimencode -u -q
:0 Afhw
| formail -I "Content-Transfer-Encoding: 8bit"
:0 fbw
* ^Content-Transfer-Encoding: *base64
| mimencode -u -b
:0 Afhw
| formail -I "Content-Transfer-Encoding: 8bit"
}
El siguiente es mas bien exotico, pero solo sirve para demostrar una
caracteristica. Suponga que tiene un fichero en su directorio HOME
llamado ".urgent", y la unica persona incluida en ese fichero es el
remitente de un correo entrante, y le gustaria que el correo se
almacenara en $MAILDIR/urgent en lugar de cualesquiera de las otras
carpetas de correo normales en las que lo habria puesto. Esto es lo que
podria hacer (tenga cuidado con la longitud del fichero de
$HOME/.urgent que deberia estar por debajo de $LINEBUF, incremente
LINEBUF si es necesario):
URGMATCH=`cat $HOME/.urgent`
:0:
* $^From.*${URGMATCH}
urgent
Una aplicacion completamente diferente a procmail aplicaria
condicionalmente filtros a ciertos textos o mensajes (salientes). Un
ejemplo tipico seria un filtreo a traves del cual encauza todo su
correo saliente, para estar seguro que se codificara con MIME solo si
se necesita.
cat newtext | procmail ./mimeconvert | mail chris@where.ever
El fichero de recursos mimeconvert podria contener algo como ( =0x80= y
=0xff= se deberian sustituir por caracteres reales de 8 bits):
DEFAULT=| # tuberia a la salida estandar
# de entrega de correo como es normal
:0 Bfbw
* [=0x80=-=0xff=]
| mimencode -q
:0 Afhw
| formail -I 'MIME-Version: 1.0' \
-I 'Content-Type: text/plain; charset=ISO-8859-1' \
-I 'Content-Transfer-Encoding: quoted-printable'
V'EASE TAMBI'EN
procmail(1), procmailrc(5), procmailsc(5), sh(1), csh(1), mail(1),
mailx(1), binmail(1), uucp(1), aliases(5), sendmail(8), egrep(1),
grep(1), biff(1), comsat(8), mimencode(1), lockfile(1), formail(1)
AUTOR
Stephen R. van den Berg
<srb@cuci.nl>