Jugando con mailq

Cuando falla la entrega en un servidor de correo lo lógico es que la cola se vaya llenando hasta reparar el problema. En ese momento las peticiones irán saliendo con cierto orden de prioridad. Hay varios comandos con los que podemos jugar para ayudar al servidor en el proceso de peticiones.

Con un poco de paciencia, conocimientos mínimos de bash y usando tanto mailq como postsuper (Postfix) podremos facilitar el flujo de correos encolados. Vamos a ello. [@MORE@] Primero miramos el número de correos que tenemos en cola. Esta operación se puede hacer de diversos modos:
# mailq | tail -n1
-- 70865 Kbytes in 1654 Requests.
# mailq | grep Requests
-- 70865 Kbytes in 1654 Requests.
Una vez sabemos el número exacto de correos que están esperando a ser procesados podemos hacernos una idea del tiempo que nos puede llevar reestablecer el normal funcionamiento del servicio.

Para ver una descripción algo más detallada de los correos (id, fecha, origen, destino...) podemos usar mailq sin más modificadores, obviamente el resultado será un chorizo tremendo si hay muchos Requests. Probemos a ver las 20 primeras lineas:
# mailq | head -n20
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
9A792414C6B*   30256 Fri Oct 26 11:41:30  tequilasunrise270@liberotta.it
                                         alguien@server

387924150E9*   41997 Fri Oct 26 11:26:53  1784@lavoca.es
                                         mas@server

1AB8D4141C3*    1163 Fri Oct 26 11:29:51  AIMEE-Jenksya@ariastone.com
                                         otrouser@server

D5808414C6F*   22998 Fri Oct 26 11:41:35  sateve@zongati.com
                                         alguien@server

81983414DDC*     518 Fri Oct 26 11:28:13  otrouser@server
                                         alguien@server

274104137A6*  170349 Fri Oct 26 11:28:19  tequilasunrise270@liberotta.it
                                         mas@server

CCC684141CC*   38295 Fri Oct 26 11:29:20  sateve@zongati.com
Nota: He modificado las direcciones de correo por no facilitar datos reales que puedan afectar al ejemplo ni al correcto funcionamiento de dichas cuentas.

Podemos comprobar que algunos de los correos en cola son correctos, otros spam o correo no deseado. Como trataremos de facilitar la tarea del servidor, podemos borrar los que veamos como no deseados.

Pongamos que tequilasunrise270@liberotta.it es uno de los correos a eliminar, nos fijamos en su ID (primer campo): 9A792414C6B y lo referenciamos con postsuper -d:
# postsuper -d 9A792414C6B
postsuper: 9A792414C6B: removed
postsuper: Deleted: 1 message
#
Sencillo -aunque tedioso- si la cola no llega a 50 correos, si jugamos con números más grandes el asunto se complica y el proceso empieza a alargarse notablemente en el tiempo. Es la hora de aplicar un poco de scripting.

Imaginemos que tequilasunrise270@liberotta.it nos ha estado inundando a correos en casi todas las cuentas del servidor, en vez de ir buscando el ID de una en una:
# mailq | grep tequilasunrise270@liberotta.it
Podemos sacar de forma más directa el ID con cut y pasarlo como parámetro a postsuper para que el trabajo sea más rápido (el ejemplo se ejecuta con una cuenta de correo, pero podríamos filtrar todo un dominio de la misma forma):
# for i in `mailq | grep tequilasunrise270@liberotta.it | cut -f1 -d*`; do postsuper -d $i; done
postsuper: 769024147F2: removed
postsuper: Deleted: 1 message
postsuper: 93A4B415197: removed
postsuper: Deleted: 1 message
postsuper: BD9FC414BFB: removed
postsuper: Deleted: 1 message
postsuper: 024EF4150C2: removed
postsuper: Deleted: 1 message
postsuper: 12114414813: removed
postsuper: Deleted: 1 message
...
#
Otra opción que se me ocurre así a bote pronto es generar a partir de mailq una lista negra de direcciones spam y borrar todos los correos estén en cola y hagan referencia a ellas.

Empezamos creando un archivo con la lista de todas las direcciones de correos implicados en cola, por ejemplo:
# mailq | grep : | cut -f3 -d":" | cut -f3 -d" " | sort  > ~/mailq.log
# cat ~/mailq.log
14479TDJAR@rrew.com
1919@intl-error.mail.info
3F2ZB9R@barriage.com
4QC5TBFN4Y@rarnyne.net
5minnews.com@kingofthedirt.com
71V8V5@rarrgoico.net
7AP31N@rarrlolico.com
96ZEXFSXB@rarrisolidp.com
9DTOUY@rarrgoldmine.com
aalguien@server.com
Aprafivo69@abebooks.com
BenaeMilne@meiselania.cc
Boospq@123456.com
bueno@server.com
Casey.Wood@jermanyfromhome.net
DAVEY879@RUBIAZA.DE
dario@server.com
DKG40BZ@chickenstolen.de
...
Observamos que en mailq.log hay direcciones "buenas" y "malas", bien manualmente o con alguna otra operación que se nos ocurra podemos quedarnos solamente con las "malas" para pasarle a postsuper. Podríamos eliminar de una tacada las direcciones propias del servidor, convirtiendo el cribado en algo más sencillo:
# cat mailq.log | grep -v server.com > mailq.log
Desde que tenemos el fichero con la lista de direcciones de correo "sobrante" podemos lanzar el siguiente comando, que buscará en mailq todas las referencias a esas cuentas, sacando el ID y procesándolo mediante postsuper:
# for i in `cat ~/mailq.log`; do `mailq | grep $i| cut -f1 -d* | postsuper -d -`; done
Una vez aplicados estos pequeños trucos la cola debería haberse limpiado bastante y lo que es más importante, en mucho menos tiempo que si vamos procesando los correos uno a uno.

Todo depende de las manos del administrador y de su capacidad de filtrado con las cuentas, pero realmente... ¿qué sistema no depende de un administrador?. Más sencillo sería un postsuper -d ALL aunque apuesto a que más de uno tendría cargo de conciencia.
freebsd sysadmin

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.
  • De verdad tu post estuvo muy interesante y me animo a revisar con mas detalle este comando. Felicitaciones de VErdad. Saludos desde Arequipa PEru,
  • Gracias, me ayudo mucho tu post!!! Saludos, México.
  • Gracias, Me ayudo mucho tu informacion ademas de que aprendi mucho mas. Saludos, QRO
  • Buenas Estoy probando los diferentes comandos en un CentOS pero no filtra bien. Aparecen palabras como blocked. Porque puede ser esto? Gracias
  • Buenas Estoy probando los diferentes comandos en un CentOS pero no filtra bien. Aparecen palabras como blocked. Porque puede ser esto? Gracias
  • Muy buen articulo, bastante útil para aquellos que se adentran en la administración de servidores de correo, en lo personal uso pfqueue para tareas rutinarias como borrar correos, re encolar, pero para tareas de uso rudo y acompañado de bash scripting prefiero mailq y postsuper. pfqueue: A console-based tool for handling MTA queueshttp://pfqueue.sourceforge.net... Saludos.
  • para poder borra todos los mails de la cola: postsuper -d ALL
  • vacan el post. quiero borrar todo los correos que tengan dominio @yahoo.com como lo hago ??? me envias la rpta a mi correo gracias
  • nose si llego tarde con la respuesta...ahi va!! mailq | awk 'BEGIN { RS = "" } /dominio o cadena buscada/ { print $1 } ' | tr -d '*!' | postsuper -d -
  • Excelente!!
  • Hola gracias por esto, me puedes dar un ejemplo mas detallado.
blog comments powered by Disqus