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 <[email protected]>
                 (Deferred: Name server: kika.noskhon.com.pe.: host name looku)
                                         <[email protected]>
h8RKt4UZ001163       10 Sat Sep 27 15:55 <[email protected]>
                 (Deferred: Name server: kika.noskhon.com.pe.: host name looku)
                                         <[email protected]>
h8PNiopq002785      298 Thu Sep 25 18:44 root
                 (Warning: could not send message for past 4 hours)
                                         [email protected]
h8PNh4RM002734      298 Thu Sep 25 18:43 root
                 (Warning: could not send message for past 4 hours)
                                         [email protected]
                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)
                                         [email protected]
h8PNh4RM002734      298 Thu Sep 25 18:43 root
                 (Warning: could not send message for past 4 hours)
                                         [email protected]
                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.