Para empezar, podríamos decir que la gran característica de qmail es su gran modularidad y que el alma de qmail es su cola de mensajes (queue). Por ella pasan todos los mensajes de correo que maneja el servidor. Cuando qmail acepta un mensaje, ya sea enviado vía SMTP o localmente y el destinatario final sea uno remoto o alguno de los usuarios de nuestro servicio, lo primero que hace es introducirlo en su cola. Una vez en ella, averiguará el destinatario y lo procesará en consecuencia. Podríamos dividir los módulos de qmail siguiendo este patrón: módulos encargados de aceptar mensajes, módulos encargados de introducirlos en la cola y módulos encargados de entregarlos.
A continuación se detallarán los módulos que nos interesan conocer para el propósito que nos hemos planteado. Aunque qmail tiene algunos otro, se escapan de la orientación de este documento:
-
qmail-smtp: Acepta los mensajes a través de SMTP y utiliza qmail-queue para introducirlo en la cola.
-
qmail-send: Realiza el primer procesamiento del mensaje en la cola para saber si el destinatario es local o remoto.
-
qmail-lspawn: Es llamado por qmail-send cuando el destinatario es local. Procesa el mensaje en consecuencia y utiliza qmail-local para entregar el mensaje.
-
qmail-local: Entrega un mensaje a un usuario local.
-
qmail-rspawn: Es llamado por qmail-send cuando el destinatario no es local y utiliza qmail-remote para entregar el mensaje.
-
qmail-remote: Entrega un mensaje a un usuario remoto.
-
qmail-clean: Limpia la cola (no utilizar manualmente).
Una visión gráfica de las secuencias que sigue sistema se ilustra en el siguiente esquema:
-
En este caso, se ha introducido un mensaje en el sistema de correo de manera local. Ya hablamos de la existencia de qmail-inject, pero puede sorprender la existencia del programa sendmail. Bajo /usr/sbin en los sistemas Unix existe una programa para enviar mensajes usando el MTA instalado. Ya que sendmail ha sido utilizado durante largos años como MTA por defecto, se ha convertido en un estándar y muchos programas suponen la existencia del mismo. Con qmail se incluye una versión del programa manteniendo la misma interfaz con el fin de preservar la compatibilidad.
-
El mensaje se recibe de manera remota vía SMTP.
-
El módulo qmail-send ha concluido que el destinatario del mensaje se encuentra en el sistema local y cede la gestión del mensaje a los módulos encargados de dichas entregas.
-
Ahora, el mensaje debe ser entregado a otro servidor donde se encuentra el destinatario final.
En qmail se considera al módulo qmail-send el cerebro del sistema. Y como hemos visto, todos los mensajes pasan siempre por la cola. La cola de qmail es un conjunto de directorios y archivos que se encuentran bajo el directorio /var/qmail/queue.
En sistema de encolado de mensajes de qmail garantiza que ningún mensaje se pierda. Esta es una de las grandes garantías de qmail. Sin embargo, para que esa garantía sea cien por cien, deben cumplirse ciertos requisitos en el sistema de ficheros:
-
La cola de qmail debe estar situada siempre en un sistema de ficheros local. No puede encontrarse compartida vía NFS.
-
El sistema de ficheros debe ejecutar llamadas link() síncronamente. Cuando qmail ejecuta una llamada link() asume que los metadatos para el nuevo enlace son escritos de manera segura. Este requerimiento es necesario para evitar que una caída del sistema en un momento inoportuno provoque que se pierdan algunos mensajes. Los sistemas de ficheros que cumplen este requisito son:
Algunos sistemas de correo que no cumplen este requisito:
Para solventar este problema de falta de sincronización en algunos sistemas de ficheros se barajan dos posibilidades principalmente:
- La primera es utilizar una nueva librería para las funciones que modifican los metadatos ( open(), link(), unlink() y rename() ) que proporcionen esa sincronización necesaria. Una vez instalada la librería, cuando se vaya a compilar qmail, se debe modificar el fichero conf-ld para que incluya -lsyncdir, y así utilizar dicha librería.
- Otra posibilidad es utilizar un parche para qmail. Este parche puede encontrarse en http://www.jedi.claranet.fr/qmail-link-sync.patch. La instalación es análoga a la de cualquier otro parche, lo cual se explicará más adelante cuando nos pongamos a instalar qmail.
-
El tercer y último requisito se refiere a la unidad de disco en la cual está albergada la cola de qmail: el disco no debe realizar un caché de escritura. Esta práctica es habitual en unidades IDE y menos en unidades SCSI. Algunos discos IDE, en ciertos sistemas, permiten deshabilitar esta funcionalidad.
El hecho de no cumplir todos los requisitos no implica que vayamos a realizar un mal sistema, sino que no estamos explotando todas las características de seguridad del MTA qmail. Existen muchos sistemas que manejan grandes cantidades de correo sin cumplir estos requisitos y realizan una tarea excelente.