# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Exim: retry time not reached for any host after a long failure period

En caso de encontrar este error en los logs de exim hay que conocer que son debidos a que el host al que hace referencia el error ha estado fallando gran cantidad de veces (normalmente 4 ó 5 días seguidos), y ha superado el límite de reintentos (retry).

En las FAQ de exim podéis ver la explicación:

This message means that all hosts to which the message could be sent have been failing for so long that the end of the retry period (typically 4 or 5 days) has been reached. In this situation, Exim still computes a next time to retry, but any messages that arrive in the meantime are bounced straight away. You can alter this behavior by unsetting the delay_after_cutoff option on the smtp transport. Then Exim will try most messages for those hosts once before giving up.”

A partir de este momento automáticamente exim rechazará enviar mensajes hacia dicho host. Esto queda guardado en la bd de exim. En caso de conocer que el problema con el servidor destino ha quedado resuelto, podemos vaciar esta base de datos para que exim vuelva a intentar enviar correos al mismo, para ello haced lo siguiente:

exim_tidydb -t 10m /var/spool/exim retry
exim_tidydb -t 10m /var/spool/exim wait-remote_smtp

Ya deberíais poder enviar al host implicado sin problemas.

Exim: User 0 set for local_delivery transport is on the never_users list

Cuando encontréis un error similar a este en los log de exim (exim_mainlog / exim_paniclog):

2009-02-20 05:13:10 15e8aa-4404Bm-Ql User 0 set for local_delivery transport is on the never_users list

Es debido a que se ha tratado de enviar un correo a un usuario añadido en el “never_users =” del fichero de configuración de exim (exim.conf).

Por ejemplo, normalmente root está añadido a never_users, de modo que si alguien intenta enviar un correo a root@maquina (root es el User 0 que sale en el log) ese email automáticamente será rechazado, mostrando la línea indicada anteriormente del log.

Si necesitáis esto activo, simplemente quitad a root del never_users, reiniciad exim y solucionado.

cPanel: Añadir una nueva RBL a Exim

Como ya sabréis, cPanel y su configurador de exim solamente permiten añadir las listas negras (RBL) r spamcop y spamhaus. Pues bien, podemos añadir las RBL que queramos del siguiente modo:

Las RBL y su configuración se guardan en la carpeta /usr/local/cpanel/etc/exim/acls/ACL_RBL_BLOCK:

#cd /usr/local/cpanel/etc/exim/acls/ACL_RBL_BLOCK
#ls -l
-rw-r--r-- 1  500  500  146 Sep  8 01:21 spamcop_rbl
-rw-r--r-- 1  500  500  158 Sep  8 01:21 spamhaus_rbl
-rw-r--r-- 1  500  500  175 Sep  8 01:21 spamhaus_spamcop_rbl

Una vez ahí, simplemente copiad uno de esos ficheros para después renombrarlo con el nombre de la RBL nueva. Posteriormente, editad el fichero y cambiad la dirección de las dnslists por la de la nueva RBL, en el siguiente caso cambiariamos “bl.spamcop.net” por la nueva RBL:

# cat spamcop_rbl

 deny message = JunkMail rejected - $sender_fullhost is in an RBL, see $dnslist_text
     dnslists = bl.spamcop.net
     hosts = +backupmx_hosts 

 warn
     dnslists = bl.spamcop.net
     set acl_m8 = 1
     set acl_m9 = "JunkMail rejected - $sender_fullhost is in an RBL, see $dnslist_text"
     [% ACL_RBL_WHITELIST %]

 warn
     condition = ${if eq {${acl_m8}}{1}{1}{0}}
     ratelimit = 0 / 1h / strict / per_conn
     log_message = "Increment Connection Ratelimit - $sender_fullhost because of RBL match"

 drop
     condition = ${if eq {${acl_m8}}{1}{1}{0}}
     message = ${acl_m9}

Finalmente ejecuta:

/scripts/buildeximconf

Exim: Limitar número de destinatarios por email

Es conveniente fijar un límite de destinatarios Bcc / cc por correo en cualquier MTA, en el caso de Exim, hay que añadir los siguientes parámetros en el fichero de configuración /etc/exim.conf:

recipients_max = 20
recipients_max_reject = true

Cabe decir que de este modo limitas de forma global, para limitar de forma individual para cada dominio es necesario configurar las ACLs, es una configuración específica que por el momento veo demasiado extensa para explicar, si alguien lo necesita puede añadir un comentario y lo tratamos.

Ah, un apunte final, si utilizáis listas de correo con Mailman, esta regla os afectará, y las listas solamente podrán tener 20 destinatarios (o los que configuréis en exim), para saltar esta restricción añadimos lo siguiente en el fichero de configuración de Mailman mm_cfg.py:

# Max recipients for each message
SMTP_MAX_RCPTS = 10

# Max messages sent in each SMTP connection
SMTP_MAX_SESSIONS_PER_CONNECTION = 10

De este modo Mailman sabrá como administrar el envío de mensajes para evitar la restricción de exim.

Exim: Comandos básicos

Exim es un agente de transporte de correo (Mail Transport Agent, MTA) que puede ser utilizado en la mayoría de sistemas Unix, siendo una de las opciones más comunes, junto con Qmail o Postfix para servicio de correo servidores Unix.

Partiendo de la base de que conocemos el funcionamiento de Exim, los comandos básicos que un administrador de sistemas que utilice este MTA son:

Lista por pantalla los correos en cola:

exim -bp

Sacar por pantalla el nº de correos en cola:

exim -bpc

Muestra un resumen de los correos en cola (dominio, nº de correos, tiempo en cola y peso):

exim -bp | exiqsumm

Eliminar un correo en concreto:

exim -Mrm '<id correo>'

Congelar un correo:

exim -Mf '<id correo>'

Procesar un correo:

exim -M '<id correo>'

Eliminar todos los correos congelados:

exiqgrep -z -i | xargs exim -Mrm

Sacar por pantalla que está haciendo exim en este momento:

exiwhat

Hacer un traceroute a una dirección de correo:

exim -bt '<id correo>'

Ver las cabeceras de un correo:

exim -Mvh '<id correo>'

Ver el cuerpo de un correo:

exim -Mvb '<id correo>'

Ver los logs de un correo:

exim -Mvl '<id correo>'

Forzar cola de correo:

exim -qff

Buscar correos en cola de un determinado emisor:

exiqgrep -f [usuario]@dominio

Buscar correos en cola de un determinado receptor:

exiqgrep -r [usuario]@dominio

Respecto a estos dos últimos comandos, exigrep es un comando extremadamente útil, dispone de muchas otras opciones que pueden ser revisadas en su respectiva ayuda.

Eliminar la cola de correo completa (dos formas):

exim -bp | awk '/^ *[0-9]+[mhd]/{print "exim -Mrm " $3}' | sh
rm /var/spool/exim/input/*

Conociendo estos comandos (o teniendolos a mano) uno ya puede moverse con soltura en exim.