19.6. Encaminamiento y envío de mensajes

Exim divide el envío de correo en tres tareas diferentes: el encaminado, el direccionamiento y el transporte. Hay un número de módulos de código para para cada tarea, siendo cada uno configurable por separado. En el fichero de configuración normalmente se instalan un número de diferentes encaminadores, direccionadores y transportes.

Los encaminadores resuelven direcciones remotas, determinando a qué anfitrión debería enviarse un mensaje y qué transporte debería usarse. En los anfitriones conectados a Internet a menudo hay un solo encaminador, que lleva a cabo la resolución buscando el dominio en el DNS. De forma alternativa, puede haber un encaminador que se encargue de las direcciones destinadas a los anfitriones de una LAN local, y un segundo para enviar cualquier otra dirección a un anfitrión inteligente ; por ejemplo, el servidor de correo de un PSI.

Las direcciones locales se envían a los direccionadores, de los que suele haber una gran cantidad, que se encargan de la gestión de los "alias" y de los reenvíos así como de la identificación de los buzones locales. Las listas de correo pueden gestionarse mediante direccionadores de "aliasing" o de reenvío. Si una dirección se renombra o se reenvía, cada dirección generada la gestionan los encaminadores o los direccionadores, según sea necesario, de manera independiente. El caso más común, de lejos, será el envío a un buzón, pero los mensajes también pueden enviarse a una orden o adjuntarse a un fichero diferente al buzón predeterminado.

Un transporte es responsable de implementar un método de envío; por ejemplo, enviar el mensaje mediante una conexión SMTP o añadirlo a un buzón específico. Los encaminadores y los direccionadores eligen qué transporte usar para cada dirección receptoras. Si un transporte falla, Exim genera un mensaje de rebote o pospone el envío para intentar realizarlo más tarde.

Con Exim goza de una gran libertad para configurar estas tareas. Hay disponibles controladores para cada una de ellas, entre los que puede escoger aquellos que necesite. Sólo tiene que describírselos a Exim en diferentes secciones de su fichero de configuración. Primero se definen los transportes, seguidos de los direccionadores y después los encaminadores. No hay nada integrado de manera predeterminada, aunque Exim se distribuye con un fichero de configuración predeterminada que cubre casos sencillos. Si quiere cambiar la política de encaminado de Exim o modificar un transporte, lo más sencillo será partir del fichero de configuración predeterminada para realizar los cambios en vez de intentar crear una configuración completa desde cero.

19.6.1. Mensajes de Encaminamiento

Cuando se da una dirección de envío, Exim comprueba primero si el dominio es uno de los que se maneja en el anfitrión con una lista en la opción de configuración local_domains. Si no se ha configurado esta opción, se usa el nombre del anfitrión local como el único dominio local. Si el dominio es local, la dirección la manejan los direccionadores. De otro modo, se pasa a los encaminadores para que averigüen a qué anfitrión reenviar el mensaje.[1]

19.6.2. Enviar mensajes a direcciones locales

De manera más común, una dirección local es simplemente el nombre de "login" de un usuario, en cuyo caso el mensaje se envía al buzón del usuario, /var/spool/mail/nombre-de-usuario. Otros casos incluyen los alias, los nombres de listas de correo y los reenvíos del usuario. En estos casos, la dirección local se expande en una nueva lista de direcciones que pueden ser a su vez locales o remotas.

Aparte de estas direcciones “normales”, Exim puede manejar otro tipo de destinos para los mensajes locales, como nombres de ficheros y órdenes de "pipe". Cuando se envía a un fichero, Exim adjunta el mensaje creando ese fichero si es necesario. Los destinos de fichero y "pipe" no son direcciones propiamente dichas por lo que no puede enviar correo a, pongamos por caso, /etc/passwd@vbrew.com y esperar que se sobreescriba el fichero de las contraseñas; los envíos a un fichero específico sólo son válidos si vienen de fichero de reenvío o de alias. Tenga en cuenta, no obstante, que /etc/passwd@vbrew.com es una dirección de correo sintácticamente válida, pero si Exim la recibe buscaría (típicamente) un usuario cuyo "login" fuese /etc/passwd, y al no encontrar ninguno el mensaje rebotaría.

En una lista de alias o en un fichero de reenvío, un nombre de fichero es cualquier cosa que comience con una barra (/ )y que no pueda entenderse como una dirección de correo plenamente cualificada. Por ejemplo, /tmp/junk en un fichero de reenvío o de alias es interpreta como un nombre de fichero, pero /tmp/junk@vbrew.com es una dirección de correo, aunque no parece muy útil. De todas maneras, pueden verse direcciones válidas de este tipo cuando se envía correo por medio de pasarelas X.400 porque las direcciones X.400 comienzan con una barra.

De manera similar, una orden de "pipe" puede ser una orden de Unix precedida por el símbolo (|), a menos que esta cadena pueda entenderse como una dirección de correo con dominio válida. A menos que haya cambiado la configuración, Exim no usa consola alguna para ejecutar la orden; sino que la divide en un nombre de orden y en sus variables y las ejecuta directamente. El mensaje se emplea como entrada estándar para esa orden.

Por ejemplo, para conducir una lista de correo a un grupo de noticias local, puede usar un guión de shell de nombre gateit, e instalar un alias local que envíe todos los mensajes de esta lista al guión usando |gateit. Si la línea de órdenes contiene una coma, ella y el símbolo de "pipe" precedente deben entrecomillarse.

19.6.2.1. Usuarios locales

Una dirección local denota comúnmente un buzón de usuario. Éste normalmente se encuentra en /var/spool/mail y tiene el nombre del usuario, quien también es el propietario del fichero. Si no existe, Exim lo crea.

En algunas configuraciones, el grupo se cambia al grupo del usuario y el modo es 0600. En estos casos, los procesos de envío se ejecutan como un usuario, y el usuario puede borrar el buzón completamente. En otras configuraciones, el grupo del buzón es mail, y tiene el modo 660; los procesos de envío se ejecutan bajo un uid y un grupo del sistema mail, y los usuarios no pueden borrar sus buzones, aunque sí pueden vaciarlos.

Tenga en cuenta que aunque /var/spool/mail es habitualmente el lugar estándar en el que colocar los ficheros de los buzones, algunos programas de correo pueden compilarse para usar rutas diferentes, por ejemplo, /usr/spool/mail. Si el envío a los usuarios de su anfitrión falla de manera consistente, debería ver si le sirve de algo crear un enlace simbólico a /var/spool/mail.

Las direcciones MAILER-DAEMON y postmaster deberían aparecer normalmente en su fichero de alias, expandiéndose en la dirección de correo del administrador del sistema. MAILER-DAEMON lo usa Exim como dirección del remitente en los mensajes de rebote. También se recomienda que root se instale como un alias para el administrador, especialmente cuando los envíos se ejecutan bajo permisos de los usuarios receptores para evitar que no se ejecute ningún envío como root.

19.6.2.2. Reenvío

Los usuarios pueden redirigir su correo a direcciones alternativas creando un fichero .forward en sus directorios home. Éste contiene una lista de receptores separados por comas y/o nuevas líneas. Se leen e interpetan todas las líneas del fichero. Puede usarse cualquier tipo de dirección. Un ejemplo práctico de un fichero .forward para las vacaciones podría ser:
    janet, "|vacation"
En otras descripciones de ficheros .forward, puede ver el nombre de usuario al comienzo precedido por una barra invertida. Esto era necesarios en algunos MTAs antiguos para detener la búsqueda de .forward para un nombre nuevo, lo que podía conducir a un bucle infinito. La barra invertida no es necesaria en Exim, que evita automáticamente bucles de este tipo.
[2] De todos modos, se permite una barra invertida y, de hecho, supone una diferencia en configuraciones en las que se manejan muchos dominios de una vez. Sin la barra invertida, un nombre de usuario no cualificado se cualifica con un dominio predeterminado; con una barra invertida se preserva el dominio entrante.

La primera dirección del fichero .forward envía el mensaje entrante al buzón de janet, mientras que la orden vacation devuelve una breve notificación al remitente. [3]

Además de soportar ficheros de reenvío “tradicionales”, Exim puede configurarse para que soporte ficheros más complejos conocidos como filtros. En vez de ser simplemente una lista con direcciones de reenvío, un fichero de filtro puede contener pruebas sobre el contenido de los mensajes entrantes de manera que, por ejemplo, pueda hacerse que se reenvíen únicamente aquellos mensajes cuyo título contenga la palabra “urgente.” Los administradores de sistemas deben decidir si permitirán o no esta flexibilidad a los usuarios.

19.6.3. Ficheros de alias

Exim es capaz de gestionar ficheros de alias compatibles con los ficheros de alias del sendmail de Berkeley. Las entradas del fichero de alias pueden tener la siguiente forma:
    alias: receptores

receptores es una lista de direcciones separadas por comas que se sustituirán por el alias. La lista de receptores puede continuarse en nuevas líneas si la línea siguiente comienza con un espacio en blanco.

Una propiedad especial permite a Exim gestionar listas de correo que se hayan especificado separadamente en el fichero de alias: si especifica :include:nombre de fichero como un receptor, Exim lee el fichero especificado y sustituye su contenido como una lista de receptores. Más adelante en este capítulo en Sección 19.6.4se muestra una manera alternativa de gestionar listas de correo.”

El principal fichero de alias es /etc/aliases. Si hace que cualquiera o que cualquier grupo pueda modificar este fichero, Exim rechazará usarlo y pospondrá los envíos locales. Puede controlar la prueba que realiza con los permisos del fichero poniendo modemask en el direccionador system_aliases.

Esto es un fichero aliases de ejemplo:
    # vbrew.com fichero /etc/aliases 
    hostmaster: janet
    postmaster: janet
    usenet: phil
    # La lista de correo de desarrollo.
    development: joe, sue, mark, biff,
            /var/mail/log/development
    owner-development: joe
    # Los anuncios de interés general se envían a todo
    # el equipo
    announce: :include: /etc/Exim/staff,
            /var/mail/log/announce
    owner-announce: root
    # la lista de correo ppp se traslada a un grupo local de noticias
    ppp-list: "|/usr/local/bin/gateit local.lists.ppp"

Cuando hay nombres de ficheros y órdenes por "pipe" en un fichero de alias, como aquí, Exim necesita que le digan bajo qué usuario ha de ejecutar los envíos. La opción user (y posiblemente group, también debe proporcionarse en el fichero de configuración de Exim, ya sea en el direccionador que maneja los alias o en los transportes a los que dirige estos elementos.

Si ocurre un error al enviarse a una dirección generada a partir del fichero aliases, Exim enviará un mensaje de rebote al remitente del mensaje, como es habitual, pero esto quizá no resulte apropiado. Puede usar la opción errors_to para especificar que los mensajes de rebote se envíen a otro usuario: por ejemplo, al administrador del correo.

19.6.4. Listas de correo

En vez de con el fichero aliases, las listas de correo también pueden gestionarse mediante un direccionador forwardfile. Las listas se mantienen en un único directorio como /etc/exim/lists/, y un fichero lists/nag-bugs describe una lista de correo llamada nag-bugs. Esto debería contener las direcciones de los miembros separadas por comas o por nuevas líneas. Las líneas que comienzan con una almohadilla (#) se tratan como comentarios. Un sencillo direccionador para usar esos datos sería como sigue:
    lists:
      driver = forwardfile
      file = /etc/exim/lists/${local_part}
      no_check_local_user
      errors_to = ${local_part}-request
Cuando se ejecuta este direccionador, los valores de las opciones file y errors_to se expanden. La expansión hace que ciertas partes de las cadenas que comienzan con un símbolo del dólar se sustituyan cada vez que se usa la cadena. El tipo de expansión más sencillo es la inserción del valor de una de las variables de Exim, y esto es lo que está sucediendo aquí. La subcadena ${local_ part} sustituye el valor de $local_ part, que es la parte local de las direcciones que se estén procesando.

Para cada lista de correo, debería existir un usuario (o un alias o una lista de correo) llamado listname-request; se informa a esta dirección de cualquier error al resolver una dirección o al enviar un mensaje a un miembro de la lista.

Notas

[1]

Esto es una simplificación. Los direccionadores son capaces de pasar direcciones a los transportes para que las envíen a anfitriones remotos, y de manera similar, los encaminadores son capaces de pasar direcciones a los transportes locales para que escriban el mensaje en un fichero o en un "pipe". Los encaminadores también pueden pasar direcciones a los direccionadores en algunas circunstancias.

[2]

Un direccionador se salta si la dirección que se va a procesar es una que ya haya procesado previamente durante la generación de la dirección actual.

[3]

Por favor, si elige usar un programa para sus ausencias, ¡asegúrese de que no responde a los mensaje enviados desde listas de correo! Resulta muy molesto descubrir que alguien se ha ido de vacaciones y encontrar un mensaje de ausencia por cada mensaje que hayan recibido. Para los administradores de listas de correo: esto es un buen ejemplo de por qué es una mala práctica forzar el campo Responder a: de los mensajes de una lista de correo para que contenga la dirección de envío a esa misma lista de correo.