8. Administración de la cola de Sendmail

8.1. Conceptos

Los mensajes que procesa Sendmail muchas veces no pueden ser enviados a su destino en forma inmediata. Por ejemplo, la línea que conecta nuestra organización a Internet puede estar detenida, o el mail server remoto puede haberse tornado inaccesible.

En estos casos Sendmail "encolará" el mensaje a fin de intentar hacer posteriores reintentos a intervalos predefinidos. Cumplido cierto tiempo, Sendmail desistirá de reintentar y el envío se considera fallido (el usuario que envía recibe una notificación.)

En RedHat 8 la cola de Sendmail se localiza en el directorio /var/spool/mqueue. Cada mensaje se compone de dos archivos (con prefijo "qf" y "df") que corresponden, respectivamente, al "archivo de control" y el "archivo de datos". El archivo de control contiene información respecto al envío del mensaje, particularmente el header. El "archivo de datos" contiene el cuerpo del mensaje.

El directorio de cola se configura en el archivo "cf" del siguiente modo:

O QueueDirectory=/var/spool/mqueue
En el método M4 se usará (sólo si se desea modificar el default):
define(`QUEUE_DIR',`/var/spool/mqueue')

8.2. Temporización del queue run

El "queue run" corresponde a un intento repetitivo que hace Sendmail para enviar los mensajes que por algún motivo quedaron encolados. El intervalo entre queue run's es configurable en las opciones de línea de comando de Sendmail. Por ejemplo, "sendmail -bd -q3h" significa que Sendmail se ejecutará en background y que el procesamiento de la cola (queue run) se hará cada tres horas (3h.) Este lapso se configura en RedHat en el archivo que se muestra.

# cat /etc/sysconfig/sendmail
DAEMON=yes
QUEUE=1h
En otros sistemas, el lector deberá indagar por los scripts de inicio del servicio Sendmail para configurar el lapso de queue run.

8.3. Forzar el procesamiento de la cola

Si deseamos forzar el procesamiento de la cola completa (por ejemplo, si de pronto nuestra conexión a Internet se ha restablecido tras un corte), en cualquier momento esto se puede hacer con el comando:

# sendmail -q
Sin embargo, a fin de intentar el envío de sólo un mensaje en particular (o un conjunto de éstos), se puede usar lo siguiente:
# sendmail -qIsubstr
Donde "substr" es un substring del queue ID del mensaje a enviar (o de los mensajes.) Por ejemplo, si tenemos los siguientes mensajes encolados:
# sendmail -bp
                /var/spool/mqueue (4 requests)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
h8RKt4UX001163       16 Sat Sep 27 15:55 <root@edithpiaf.noskhon.com.pe>
                 (Deferred: Name server: kika.noskhon.com.pe.: host name looku)
                                         <diego@kika.noskhon.com.pe>
h8RKt4UZ001163       10 Sat Sep 27 15:55 <root@edithpiaf.noskhon.com.pe>
                 (Deferred: Name server: kika.noskhon.com.pe.: host name looku)
                                         <diego@kika.noskhon.com.pe>
h8PNiopq002785      298 Thu Sep 25 18:44 root
                 (Warning: could not send message for past 4 hours)
                                         diego@kika.noskhon.com.pe
h8PNh4RM002734      298 Thu Sep 25 18:43 root
                 (Warning: could not send message for past 4 hours)
                                         diego@kika.noskhon.com.pe
                Total requests: 4
Y queremos enviar los dos primeros de la lista (que tienen bastante tiempo en la cola), podemos especificar su Q-ID completo o un substring del mismo. Por ejemplo, puesto que sus Q-ID son "h8RKt4UX001163" y "h8RKt4UZ001163", podremos emplear el substring "1163" así:
# sendmail -qI1163
[root@edithpiaf root]# sendmail -bp
                /var/spool/mqueue (2 requests)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
h8PNiopq002785      298 Thu Sep 25 18:44 root
                 (Warning: could not send message for past 4 hours)
                                         diego@kika.noskhon.com.pe
h8PNh4RM002734      298 Thu Sep 25 18:43 root
                 (Warning: could not send message for past 4 hours)
                                         diego@kika.noskhon.com.pe
                Total requests: 2

Nota: Como se indicó anteriormente, en las versiones recientes Sendmail viene dividido en "dos partes", una de las cuales se encarga del procesamiento de los mensajes enviados desde la línea de comando del servidor (sm-client) y otra de los mensajes recibidos desde la red. Ambas tienen su propia cola. A fin de ver la cola del "sm-client" es menester usar:

# sendmail -Ac -bp

8.4. Orden de envío de los mensajes

Normalmente Sendmail ordena los mensajes a ser enviados durante un queue run de acuerdo a la "prioridad" del mensaje. La prioridad se calcula mediante:

PRI=msgsize-(class*ClassFactor)+(nrcpt*RecipientFactor)+(nrun*RetryFactor)
Donde msgsize es el tamaño en bytes del mensaje; "class" significa el valor numérico asignado mendiante a las opciones "Precedence" en el header (por ejemplo, los mensajes para listas deben tener baja precedencia), y "nrcpt" es el número de destinatarios del mensaje. ClassFactor y RecipientFactor son factores de ajuste (modificables) para proporcionar un peso relativo (normalmente 1800 y 3000 respectivamente.) Una valor más elevado de este resultado en realidad significa que el mensaje es tratado con menos prioridad.

Por último, en cada intento de envío (cada queue run) un mensaje que no pudo ser enviado sufre una alteración en su prioridad en "RetryFactor". El default para este parámetro es 90000.

El ordenamiento de la cola en base a la prioridad es la política por omisión de Sendmail; sin embargo, la opción QueueSortOrder permite alterar esto. Por ejemplo,

QueueSortOrder=host
O en M4:
define(`confQUEUE_SORT_ORDER',`host')
Encolará los mensajes por el host de destino, estado de conexión con el host (primero se aprovechan las conexiones abiertas con el host) y luego la prioridad.

Esto es recomendado en conexiones de alta velocidad.