En una primera lectura de este tutorial sugiero evitar todo este material puesto que no es esencial para la gran mayor�a de administradores de Sendmail.
Las reglas son especificaciones de configuraci�n que sirven para modificar las direcciones electr�nicas y detectar errores en las mismas. Hay diversos motivos por los que una direccion electr�nica debe ser modificada; por ejemplo, si se desea que todos los mensajes luzcan como si hubieran sido enviados desde cierto computador aunque en realidad se han enviados desde diversos computadores de distinto nombre.
Los conjuntos de reglas se agrupan en los llamados "Rulesets" que funcionan a modo de "subrutina" de cualquier lenguaje de programaci�n. Los "Rulesets" se identifican con un n�mero, aunque en las �ltimas versiones de Sendmail es posible identificarlos con una palabra (que internamente es traducida a un n�mero por Sendmail.)
Algunos rulesets son definidos internamente (como los rulesets 0, 1, 2, 3, 4, y 5) mientras que otros se definen manualente en el archivo "cf".
Los rulesets se definen mediante el comando "S" y las reglas mediante el comando "R". A continuaci�n un extracto del archivo "cf" que viene con RedHat 8.0 en el que se ilustra el ruleset "0" o tambi�n denominado "parse". Obs�rvese que el ruleset termina donde empieza uno nuevo:
###################################### ### Ruleset 0 -- Parse Address ### ###################################### Sparse=0 R$* $: $>Parse0 $1 initial parsing R<@> $#local $: <@> special case error msgs R$* $: $>ParseLocal $1 handle local hacks R$* $: $>Parse1 $1 final parsing
Esta salida puede ser muy distinta en otros sistemas Unix/Linux, pero por el momento eso no importa.
El ruleset 0 se pudo definir mediante "S0" en lugar de "Sparse", pero como "parse" es m�s "comprensible" que "0", entonces se prefiere esta �ltima forma (Sparse=0.)
Para verificar c�mo ha cargado Sendmail las reglas, se puede usar el modo de test de Sendmail con el comando "=S" y el n�mero del ruleset:
# sendmail -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > =S 0 R$* $: $> Parse0 $1 R< @ > $# local $: < @ > R$* $: $> ParseLocal $1 R$* $: $> Parse1 $1N�tese que esto coincide con la definici�n del archivo de configuraci�n. De igual modo puede consultarse con el nombre del ruleset:
# sendmail -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > =S parse R$* $: $> Parse0 $1 R< @ > $# local $: < @ > R$* $: $> ParseLocal $1 R$* $: $> Parse1 $1
Como es f�cil de apreciar, cada ruleset consiste de varias "reglas" definidas con el comando "R".
Cada regla consiste de dos partes separadas por un tabulador, posiblemente seguidas de un comentario (separado tambi�n por un tabulador.)
Para esta secci�n haremos algunas modificaciones al archivo de configuraci�n "cf". Sin embargo, a fin de evitar alterar la configuraci�n actual, trabajaremos sobre un archivo "cf" alternativo. Empecemos haciendo una copia del archivo "cf":
# cp /etc/mail/sendmail.cf prueba.cfAhora podremos hacer nuestros cambios en "prueba.cf". A�adiremos a �ste �ltimo las siguientes l�neas en la parte final:
D{MAILHUB}mail.peru.com.pe Sprueba R$+@$+ $1*${MAILHUB} convierte user@hostComo se ve, hemos definido la macro "MAILHUB", el ruleset "prueba" y una �nica regla. Para que la regla est� adecuadamente definida, es imprescindible que sus tres partes est�n separadas por al menos un tabulador (no espacios):
R$+@$+ <TAB> $1*${MAILHUB} <TAB> convierte user@hostPara probar nuestra regla, ejecutaremos Sendmail en modo de prueba pero especificando el nuevo archivo "cf":
# sendmail -Cprueba.cf -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > prueba [email protected] prueba input: diego @ hotmail . com prueba returns: diego *mail . peru . com . pe #Como se aprecia, el modo de prueba permite especificar el nombre de cualquier ruleset seguido por una direcci�n electr�nica a procesar.
Cada regla tiene hasta tres partes (el comentario es opcional) separadas por tabuladores (puede haber espacios dentro de cada parte.)
Recu�rdese que las reglas alteran las direcciones de correo electr�nico.
La primera parte (que sigue inmediatamente al comando "R") es la "left hand side" (lado izquierdo o LHS) mientras que la segunda es la "right hand side" (lado derecho o RHS.) La LHS especifica un patr�n de b�squeda. De haber coincidencia con el patr�n de b�squeda, la direcci�n de correo electr�nico que se est� procesando es convertida en el RHS.
A fin de comprender las reglas, es necesario conocer el concepto de "token".
Las direcciones electr�nicas procesadas en los rulesets por las reglas son internamente fraccionadas en varias unidades independientes denominadas "token". As�, la direcci�n proporcionada en el ejemplo de arriba: "[email protected]" es internamente dividida en los siguientes cinco tokens:
diego @ hotmail . comLos siguientes caracteres normalmente delimitan los tokens (y act�an ellos mismos como tokens adicionales):
.:@[] ()<>,;\"\r\n
En el ejemplo de arriba, la LHS est� conformada por dos "expresi�n de b�squeda" (comodines o wildcards) de tipo "$+". Estos sirven para buscar coincidencias de uno o m�s "tokens". M�s adelante veremos m�s de estos comodines.
En nuestro ejemplo, la direcci�n proporcionada hizo coincidir el primer "$+" con el token "diego" y el segundo "$+" con los tokens "hotmail", ".", "com".
Por el lado de la RHS, el contenido de cada "expresi�n de b�squeda" es accesible mediante los operadores $1, $2, ... respectivamente. Para nuestro caso, tendremos:
$1 = diego $2 = hotmail . comEn nuestro ejemplo, el RHS es "$1*${MAILHUB}", lo que equivale a "diego*mail.peru.com.pe", cosa que se aprecia en la respuesta.
El modificador de debug 21.12 permite obtener m�s informaci�n acerca del procesamiento de cada regla.
# sendmail -d21.12 -bt -Cprueba.cf ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > prueba [email protected] prueba input: diego @ hotmail . com -----trying rule: $+ @ $+ -----rule matches: $1 *mail . peru . com . pe rewritten as: diego *mail . peru . com . pe -----trying rule: $+ @ $+ ----- rule fails prueba returns: diego *mail . peru . com . pe
Los rulesets 0, 1, 2, 3, 4, 5 est�n reservados para usos espec�ficos de Sendmail. A futuro Sendmail puede definir los rulesets 6, 7, 8, 9. En general, es conveniente que el usuario defina - si lo requiere - rulesets con textos identificatorios (para que Sendmail autom�ticamente los numere) con lo que se evitan conflictos innecesarios.
Es conveniente conocer el uso que da Sendmail a los rulesets internos. La siguiente figura intenta ilustrar este punto.
En general, todas las direcciones electr�nicas pasan por el ruleset 3 apenas se inicia el procesamiento de las mismas. Entre otras cosas, el ruleset 3 extrae la direcci�n electr�nica "apta para procesamiento" a partir de la direcci�n electr�nica entregada por los clientes.
Por ejemplo, es usual que las direcciones electr�nicas luzcan as� (tal como las genera el programa cliente):
Pedro Escobedo <[email protected]>Obviamente, para efectos de la transferencia del mensaje, el nombre real no es importante. Probemos esto:
# sendmail -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > 3 Pedro Escobedo <[email protected]> canonify input: Pedro Escobedo < pescobedo @ noskhon . com . pe > Canonify2 input: pescobedo < @ noskhon . com . pe > Canonify2 returns: pescobedo < @ noskhon . com . pe . > canonify returns: pescobedo < @ noskhon . com . pe . >Lo que hemos hecho es transformar la direcci�n electr�nica mediante el ruleset 3, el cual se encarga de "preprocesar" todas las direcciones electr�nicas. N�tese que la respuesta consiste de la direcci�n electr�nica en un formato especial usado internamente.
Es sencillo imprimir el ruleset 3 (o cualquier otro) desde Sendmail. Para esto, simplemente entrar en modo debug (con -bt) y tipear el comando "=S":
> =S 3 R$@ $@ < @ > R$* $: $1 < @ > R$* < $* > $* < @ > $: $1 < $2 > $3 ...
Finalmente, todav�a en modo test, pru�bese el comando "/parse" que permite simular el procesamiento de una direcci�n de correo electr�nico (por ejemplo, pruebe "/parse user@localhost".)
Para explicar esto, copiar� una parte del archivo "cf" que se vi� anteriormente (en la secci�n del delivery local.)
Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=EnvFromL/HdrFromL, R=EnvToL/HdrToL, T=DNS/RFC822/X-Unix, A=procmail -t -Y -a $h -d $uComo se aprecia, aqu� se emplearon las construcciones "$h" y "$n". Como ya sospechar� el lector, esto corresponde a la expansi�n de dos "macros".
En particular, la macro "h" (cuyo valor se obtiene con "$h") corresponde al host destinatario del mensaje, mientras que la macro "n" corresponde al usuario destinatario del mensaje. En este caso el valor de la macro es ajustado por Sendmail autom�ticamente para cada mensaje.
Las macros se pueden definir con el comando "D" en cualquier parte del archivo "cf". Por ejemplo, esto redefine la macro "w" al valor "jibaros":
DwjibarosLas macros cuyos nombres tienen m�s de un caracter deben usar llaves en su definici�n y su expansi�n:
D{PRUEBA}amazonas.com.pe ... ${PRUEBA} ...La opci�n de debug -d35.9 permite obtener un extenso listado de macros definidas por Sendmail y v�a el archivo "cf".
Ciertas macros son asignadas internamente por el programa Sendmail (como la macro "w" que es inicializada al nombre del host "sin dominio") y otras son creadas expl�citamente en el archivo "cf" con diversos prop�sitos.
Las "clases" son una suerte de variables tipo "array", es decir, que pueden contener un conjunto de valores.
Las clases no se solapan con las macros. Por ejemplo, existe la clase "w" que no tiene relaci�n alguna con la macro "w". Los elementos de la clase se a�aden con el comando "C". Por ejemplo, los siguientes dos comandos a�aden los elementos "localhost" y "localhost.localdomain" a la clase "w" del archivo "cf":
[root@edithpiaf tmp]# grep '^Cw' /etc/mail/sendmail.cf Cwlocalhost.localdomain CwlocalhostTal como se mencion� anteriormente, la clase "w" corresponde a los "nombres de host" que Sendmail considera "locales" y que permiten que un mensaje sea dirigido al mailbox en lugar de ser redirigido hacia otro destino.
Como se recordar�, esa configuraci�n la hac�amos mediante el archivo /etc/mail/local-host-names. En otras palabras, las l�neas de este archivo pasan a conformar la clase "w". Esto se define en el archivo "cf" mediante el comando "F":
[root@edithpiaf tmp]# grep '/etc/mail/local-host-names' /etc/mail/sendmail.cf Fw/etc/mail/local-host-namesEvidentemente, esto tambi�n se pudo configurar a�adiendo directamente directivas "Cw..." al archivo "cf", pero es un m�todo menos flexible.
Como se ve, esta clase es especial. A tal efecto si usamos el m�todo M4 y se desea generar un archivo "cf" que incluya la configuraci�n via el archivo local-host-names deber� usarse:
FEATURE(use_cw_file)dnl