7. El Procesamiento de los mensajes

Los mensajes de correo electrónico tienen principalmente dos tipos de procesamiento:

Estas "rutas" de envío de mensaje se suelen denominar "mailers" y son implementadas por "delivery agents".

7.1. Envíos locales

Sendmail normalmente determina si un mensajes es local cuando la dirección de destino contiene sólo un nombre de usuario (por ejemplo, "diego".) Asimismo, cuando la dirección de destino contiene un host que coincide con el "hostname" del servidor. Por ejemplo, en la dirección "diego@correo.caligula.net" el host especificado (lo que sigue a la @) es "correo.caligula.net"; si este coincide con el hostname del computador, entonces el mensaje debe ser considerado local.

Una excepción (extremadamente común) a lo último consiste en forzar que ciertas direcciones sean tratadas como locales. Para esto, el usuario generalmente configurará el archivo /etc/mail/local-host-names con los nombres de host considerados "locales" o "sinónimos" del host local. Por ejemplo, para que el mensaje con destino "diego@neron.org" sea también considerado local, habría que incluir en el archivo /etc/mail/local-host-names:

neron.org
Esto es muy importante, puesto que típicamente las organizaciones deciden utilizar una dirección de email terminada en "@dominio", donde "dominio" casi nunca coincide exactamente con el hostname del servidor. De no configurarse el archivo local-host-names, todos los mensajes que lleguen al servidor con esta dirección serían considerados no locales, y por tanto serían rechazados.

En otros sistemas el nombre del archivo de configuración local-host-names puede variar. Para averiguar o verificar esto, debemos consultar la documentación o en último caso el archivo "cf":

# grep "^Fw" /etc/mail/sendmail.cf
Fw/etc/mail/local-host-names
En versiones anteriores de Sendmail, este archivo se denominaba /etc/sendmail.cw.

Si se dispone del archivo "M4" que dio origen al "cf", deberíamos buscar allí una línea tal como:

FEATURE(`access_db',`hash -T<TMPF> -o /etc/mail/access.db')dnl
En algunos casos (no en RedHat), esta funcionalidad puede no estar definida y se debe activar.

Sin embargo, esta configuración también puede hacerse en el mismo archivo "cf" con el comando "class-macro-w" (clase w.) Por ejemplo, las siguientes líneas muestran que las direcciones terminadas en "@localhost" y "@localhost.localdomain" también son consideradas locales.

# grep "^Cw" /etc/mail/sendmail.cf
Cwlocalhost.localdomain
Cwlocalhost
En otras palabras, la "clase w" se puede considerar un "array" que contiene los nombres de las direcciones consideradas "locales". Esta clase se puede configurar en el archivo "cf" mediante el comando "C" (seguido por el nombre de la clase, o sea "Cw") o mediante un archivo externo (definido por el comando "F", en nuestro caso "Fw".)

Los envíos locales conllevan a que los mensajes sean almacenados en la "casilla de correo" del usuario destinatario. El usuario deberá extraer estos mensajes con su programa "cliente", posiblemente mediante los protocolos IMAP o POP como se verá después.

La casilla de correo (inbox) es simplemente un archivo cuyo nombre coincide con el del usuario y se ubica en el directorio /var/spool/mail (como siempre, esto puede variar en otros Unix.) Como veremos, Sendmail no escribe directamente en este archivo y por tanto no es parte de su configuración.

7.2. Definición del envío local

Como se indicó, el envío local conlleva a que el mensaje sea guardado en el archivo "inbox" o "casilla de correo". Sin embargo, Sendmail no realiza directamente este trabajo, sino que invoca a un programa auxiliar para esta tarea (aparentemente sencilla.)

Esto se configura en el archivo "cf" con la definición "Mlocal" (mailer local.) En el archivo "cf" de RedHat 8.0, esta sección luce así:

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 $u
Las líneas que se inician con espacios o tabuladores se consideran la continuación de la anterior, por tanto, el extracto mostrado arriba debe considerarse una sola línea.

Como se aprecia, Sendmail utiliza un programa auxliar llamado /usr/bin/procmail para el delivery local. En muchos sistemas Unix el programa usado es /bin/mail. No profundizaremos más sobre esto por ahora, pero en general "procmail" es mucho más flexible y eficiente que las alternativas tradicionales.

7.3. Envíos Remotos

Sendmail tiene la capacidad de hacer envíos remotos usando el protocolo SMTP (que opera usando TCP/IP.) En este caso, Sendmail no emplea un programa auxiliar como en los envíos locales.

Cuando un mensaje no puede ser enviado a uno de los destinatarios, el mensaje es "encolado" para un posterior reintento.

Para efectuar el envío remoto, Sendmail requiere que los destinatarios del mensaje posean una "parte de host" distinta al hostname local (o a sus sinónimos de la clase-w, como se vio en la sección anterior.)

Sendmail normalmente utilizará el DNS a fin de encontrar el servidor remoto que recibirá el mensaje (específicamente, el registro MX y el registro A) y abrirá una conexión SMTP.

El archivo "cf" define este envío con una línea como la que sigue.

Msmtp,	P=[IPC], F=mDFMuX, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP,
	E=\r\n, L=990,
	T=DNS/RFC822/SMTP,
	A=TCP $h

De estos ejemplos se puede apreciar que las definiciones de los "mailers" o "agentes de delivery" siempre empiezan con el comando "M", inmediatamente seguido por el nombre del "mailer".

7.4. "mailers" en M4

Los mailers en el archivo M4 deben aparecer al final del archivo fuente M4. Para generar los dos mailers mencionados arriba, simplemente se requiere:

MAILER(smtp)dnl
MAILER(procmail)dnl
Esto lo puede observar el lector en el archivo "sendmail.mc" proporcionado por RedHat.