domingo, 3 de marzo de 2013

Servidores de correo Postfix: Gestión de envíos/recepción masivo, Configuraciones en Hotmail, Gmail


Introducción
Como se puede leer más abajo, la administración de servidores de correo no consiste meramente en saber configurar un servidor de correo, dicha gestión implica un conocimiento considerablemente mayor de nuestra parte como administradores. Sin ese conocimiento, los fallos de envíos, problemas diversos de bloqueo de proveedores, etc. van a ocurrir con frecuencia, aparentemente sin motivo alguno (el motivo es la falta de gestión del servicio de correo).

Como se sabe bien cualquier administrador de correo, servicios públicos como Hotmail y Yahoo, entre otros, son conocidos porque no toleran más que cierta cantidad limitada de envíos simultáneos de correo por destinatario y/o por dominio de origen, entre otras limitaciones y exigencias.

Las limitaciones de los servicios de correo públicos son fáciles de verificar usando un par de técnicas básicas, más abajo están explicadas un par para escenarios basados en Postfix corriendo sobre Linux (o Unix).


Reputación automática
Como podrán leer en las políticas de cada proveedor de servicios de correo, normalmente maneja el concepto de "reputación", y se hace automáticamente. No es muy difícil imaginar cómo es el mecanismo que realiza esta evaluación, ya la idea básica - y algunas capacidades de reconfiguración automática - está presente en el típico software anti-spam como SpamAssasin y similares.


Armando nuestro propio sistema de reputación automático (nociones e ideas)
Inclusive, con relativamente poco código Bash - un script - se puede emular consistentemente la función de esos evaluadores de reputación. Por ejemplo:

Tenemos los logs de Postfix, cada cierto tiempo se grepea los logs buscando determinados patrones básicos, como por ejemplo, cualquier remitente que contenga más de 100 destinatarios, luego se guarda el mail y dominio de origen, luego se continua escaneando. Si luego de X recepciones desde una misma cuenta y/o dominio, se sigue recibiendo envíos masivos (más de 100 destinatarios), el script puede tomar acción al respecto, por ejemplo:

- Agregar una regla en Postfix para que bloquee toda recepción de correo desde el dominio infractor.

- Agregar una regla Iptables que bloquee la IP de origen de los envíos masivos (bloqueando así un solo servidor de entre posibles varios servidores que podría tener un proveedor, permitiendo así que otros usuarios que no están realizando envíos masivos justo en esos minutos, no sufran el rebote/descarte automático de correos).

- Reconfigurar Postfix y/o algun filtro de Postfix (Postgrey y similares), para que hagan un greylisting extendido automático para correos de origen en el dominio infractor. Por ejemplo, Postgrey greylistea correos por 5 minutos, la configuración para infractores podría extender ese parámetro a 25 o 45 minutos, solamente para el dominio infractor 

* Cuanto más largo es el delay en el greylisting, más alto es el riesgo de que la configuración del servidor de correo remitente sencillamente dé por inválido el correo, especialmente en servidores configurados con baja sensibilidad a errores y/o mal configurados, o que no respetan demasiado el estándar SMTP; 

Un server bien configurado debería reintentar el envío del correo hacia nuestro server por al menos unas 24 a 48 hs. (Gmail lo reintenta durante 4 días por ejemplo). La configuración por defecto de mucho software de servidor de correo tiene un mínimo de 24 a 48 hs. de reintentos por cierto.

Cualquiera de las 3 opciones de ejemplo de arriba deberán ser temporales, y el script deberá incluir un mecanismo de revalidación regular de la sanción aplicada (reevaluando cada 4 horas por ejemplo), y así se podrá manejar dinámicamente el problema de envíos masivos a las cuentas de nuestro servidor de correo.


De todos modos, no es necesario comenzar desde cero, fácilmente se puede usar y/o incorporar herramientas de terceros a nuestro programa y adelantar mucho camino:

- Mail::DeliveryStatus::BounceParser - Perl extension to analyze bounce messages

- MRPostfixBounce

" mr_postfix_bounce is a mrjob that parses a Postfix log file looking for messages that have bounced and yielding the (email address, date ordinal). The emitted email addresses can then be unconfirmed or handled in some other way."

Repositorio Github


- ,etc.


Fuentes de información
Desde aquí pueden empezar a leer sobre cuales son las prácticas de envío de correo aceptables para estos tres proveedores.


Gmail: Gmail Bulk Senders Guidelines

Hotmail: Hotmail Daily Message Limit

Yahoo: Yahoo! Mail Basics




Límites
La información siguiente fue recopilada de las fuentes anteriores, debería estar vigente al momento, pero los proveedores cambian estos thresholds sin previo aviso, de vez en cuando


Límites de Yahoo

  • Límite de envíos: 20 correos por cuenta/conexión 
  • Ratio de envíos: 100 envíos por día
  • Límite de archivos a atachar: 25 mb
  • Método para que expire el bloqueo: no aplica.


Yahoo acepta un máximo de 20 correos por conexión SMTP. Se sugiere limitar el número de mensajes que se envía dentro de este límite por conexión. Cuando se alcanza el límite, Yahoo no va aceptar más correos y va cortar la conexión sin devolver ningun código de error.

Si tenés que enviar correos a muchas cuentas de Yahoo, podés intentar que el servidor de correo se reconecte inmediatamente luego de la desconexión. Podés abrir conexiones concurrentes al mismo server para facilitar eso.

Yahoo mantiene datos de reputación sobre cada IP y dominio desde el cual se envía correo, por lo tanto separar los envíos de correo masivos (que usen una IP/dominio diferente), de los correos típicos, es una buena idea.

Con Yahoo Plus el límite de envíos desde una cuenta de correo es de 500 correos por día, y cada mensaje puede ser enviado a no más de 100 contactos.


Límites de Gmail

  • Límite de envíos: 100 correos por persona/conexión 
  • Ratio de envíos: 100 personas por día
  • Límite de archivos a atachar: 25 mb
  • Método para que expire el bloqueo: Se recupera la capacidad de envío para la cuenta dentro de las 24 hs. de alcanzado algún límite.


Si usás un cliente como Outlook, no envíes más de 100 destinatarios por envío.

Gmail va a deshabilitar temporalmente tu cuenta si envías correos a más de 500 destinatarios o si envías a una gran cantidad de destinos válidos (cuentas de correo no existentes, rebotes).


Límites de Hotmail

  • Límite de envíos: 100 correos por cuenta/conexión 
  • Ratio de envíos: 100 envíos por día
  • Límite de archivos a atachar: 25 mb
  • Método para que expire el bloqueo: no aplica.

El límite de Hotmail para correos salientes es 100 mensajes por día, de todos modos no es un valor estable.

El límite depende de la reputación de la cuenta de correo remitente en Hotmail. El sistema necesita pocos días para recolectar datos de una cuenta de correo remitente y configurar una reputación. Así que hay límites más chicos para cuentas nuevas y cuentas que tienen un perfil similar al envío de spam. A medida que una cuenta de correo desarrolla una reputación de no enviar correo basura/no deseado, Hotmail incrementa la cantidad de destinatarios a las que una cuenta de correo puede enviar simultáneamente (en un solo envío). A la inversa, cuando una cuenta se desmadra y empieza a enviar muchos correos basura/no deseados, Hotmail automáticamente baja la cantidad de correos simultáneos de destino por envío que va a aceptar antes de empezar a rebotarlos.

Se puede verificar el status de un cuenta de correo para algunos países, hace falta un número de celular y es una validación vía SMS. http://g.live.com/1rewlive4tup/tupp

Esto te puede ayudar a aumentar el límite de envíos simultáneos si es que está por debajo del estándar para un usuario gratuito. Si ya estás en ese límite, la validación vía SMS no va a incrementarlo.

Una alternativa es pagar Hotmail Plus o MSN Premium y así se obtiene un límite más amplio para envíos masivos desde una cuenta de correo.


Configuración de Postfix para envíos masivos a Hotmail, Yahoo y otros proveedores:
Estudiando un poco la documentación de Postfix, muchos posteos en foros (incluyendo las respuestas directas de los mismos programadores de Postfix para algunas preguntas), y un par de decenas de posteos de blogs diversos, más ya habiendo implementado un par de veces configuraciones similares, más o menos puedo concluir que lo siguiente es una configuración bastante aceptable para gestionar el envío masivo de correo desde Postfix.

Hay que trabajar sobre tres files de configuración de Postfix, en general ubicados en /etc/postfix

1) main.cf
2) master.cf
3) transport


1) En main cargamos:
#
# Manejo de cola-lenta
# destination_concurrency_feedback_debug = yes

# Estos dos parámetros evitan el reintento de envío de correos
# cuando el servidor de destino rechaza las conexiones

#How  many  pseudo-cohorts  must  suffer connection or handshake failure
#before a specific destination is considered  unavailable  (and  further
#delivery  is suspended). Specify zero to disable this feature. A destination's 
#pseudo-cohort failure count is reset each time a delivery completes
#without connection or handshake failure for that specific destination.
slow_destination_concurrency_failed_cohort_limit = 1

# require 5 consecutive failures to declare the destination dead
slow_concurrency_failed_cohort_limit = 1

#The  default amount of delay that is inserted between individual 
#deliveries to the same destination; with per-destination recipient  limit  > 1, 
#a destination is a domain, otherwise it is a recipient.
slow_destination_rate_delay = 120s 

# The default maximal number of parallel 
# deliveries to the same  destination.
# default: 20 
slow_destination_concurrency_limit = 5

# The default maximal number of recipients per message delivery.
# default: 50
slow_destination_recipient_limit = 20

# Reduce la velocidad de los envíos
#
# When  SMTP  connection  caching  is enabled, 
# the amount of time that an
# unused SMTP client socket is kept open before it  is  closed.  
slow_smtp_connection_cache_time_limit = 0

#  Never  send  EHLO  at  the  start  of  an  SMTP  session.
slow_never_send_ehlo = yes 


2) En master cargamos:
slow      unix  -       -       n       -       20       smtp
        -o syslog_name=postfix-slow

# Permite nombrar la cola de trabajo 
# en los logs


3) Y en transport cargamos:
# Servidores de correo en "slow"
#
hotmail.com     slow:
yahoo.com       slow:
arnet.com.ar    slow:
yahoo.com.cn    slow:
gigared.com     slow:

luego actualizamos la configuración:

postmap transport
postfix reload

y listo.


Técnicas básicas para detectar bloqueos y envíos masivos en Postfix
Un servicio Postfix en Debian Squeeze, ubica el log de Postfix en /var/log/mail.log

tail -f /var/log/mail.log

Con este comando podemos ver en directo el tráfico de correo entrante y saliente de nuestro server. En los detalles del log se aprecia fácilmente el tipo de manejo del tráfico que hace la configuración que tenemos en producción. Antes de seguir, una...

Advertencia importante
Verificar la política de limitaciones de un servidor de correo tiene el riesgo eminente de que su sistema - el cual no conocemos - no solamente opere sobre la cuenta de correo remitente, sino sobre el dominio. Si rebasamos algún máximo - como los detallados antes para Gmail,Hotmail,Yahoo - nos arriesgamos a caer dentro de una política de bloqueo de envíos desde nuestro servidor de correo.

Dicha política suele ser automática para problemas con relativamente pocos correos (50-100-150 destinatarios), especialmente en el caso de grandes proveedores como Gmail.

Sin embargo servidores de correo con bajo tráfico pueden tener medidas menos automatizadas en producción, inclusive algun simple script contador, que luego de cierto punto envía un correo de alerta al administrador, quien luego podría simplemente agregar manualmente nuestra IP o dominio (lo último es más probable), a una configuración de bloqueo, la cual para poder deshacer va a requerir acción directa de nuestra parte (probablemente intercambiar correos con el admin, sino llegar a él o algun responsable vía teléfonica). Las "vías automáticas" para "liberar" nuestro dominio no suelen existir para servidores de correo de bajo volumen (por ejemplo, una página web donde registrar nuestro pedido).


Probando el límite de política de Hotmail en Postfix

Lo recordamos:
Límites de Hotmail
Límite de envíos: 100 correos por cuenta/conexión 
Ratio de envíos: 100 envíos por día
Límite de archivos a atachar: 25 mb

* Disponiendo de 150 cuentas de correo válidas en Hotmail para usar como destinatarios.

- Veamos la configuración antes recomendada en Postfix, ubicada en:

/etc/postfix/main.cf

# The default maximal number of recipients per message delivery.
# default: 50
slow_destination_recipient_limit = 20

- lo subimos a 150

slow_destination_recipient_limit = 150

- Recargamos postfix:
postfix reload

- Abrimos un tail -f
tail -f /var/log/mail.log

- Creamos y enviamos un correo con las 150 cuentas como destinatarios.
- Miramos el log desde el tail, y buscamos la queue ID del mensaje, por ejemplo en:

postfix/smtpd[1677]: connect from
 mail.example.com[192.168.100.45]
postfix/smtpd[1677]: 9634B16F7F7:
 client=mail.example.com[192.168.100.45]

"9634B16F7F7" es el queue ID

- Si quieren copiar y pegar el tramo del log para un análisis detallado, y se les pasa de largo el queue ID, más tarde lo pueden grepear un poco, por ejemplo

grep hotmail /var/log/mail.log
grep correo-origen /var/log/mail.log

,etc.

- Grepeando el queue ID en el log de Postfix van a poder ver el tramo completo del log que muestra el tráfico desde nuestro servidor hacia Hotmail, solo para nuestro correo de prueba de límites de políticas:

Por ejemplo:

$ grep 9634B16F7F7 /var/log/maillog
postfix/smtpd[1677]: 9634B16F7F7:
 client=localhost[127.0.0.1]
postfix/cleanup[1679]: 9634B16F7F7:
 message-id=<20031227171249 .9634b16f7f7="" scallop.example.com="">
postfix/qmgr[1673]: 9634B16F7F7:
 from=, size=368,
 nrcpt=1 (queue active)
postfix/smtp[1681]: 9634B16F7F7:
 to=, relay=none,
 delay=46, status=deferred
 (connect to 216.150.150.131[216.150.150.131]:
 No route to host)


- Y en algun punto luego de los primeros 100 mensajes, van a ver cómo los correos empiezan a rebotar desde los servidores de Hotmail.

* Tip: para ver qué dominios tiene Microsoft asignados a servidores de correo, lo podemos ver con:

dig mx hotmail.com


- Si los mensajes de nuestro correo de prueba no rebotan con ese primer mail, a no preocuparse, ni tampoco relajarse: el sistema de evaluación de reputación de Hotmail está posiblemente teniendo en cuenta algunas variables que hacen que no bloquee nuestro envío (como que la cuenta no sea nueva y ya tenga buena reputación dentro de Hotmail, por ejemplo). Si repetimos el envío un par de veces más, en algun momento Hotmail va a iniciar el bloqueo y tiene la buena netiquette de avisarnos vía mensajes detallados en el log:

Jan 12 00:00:46 smtp5 postfix-lowpriority/smtp[18663]: 3B5AC800054C: to=, relay=mx3.hotmail.com[65.55.92.184]:25, conn_use=27, delay=0.35, delays=0.23/0/0.04/0.08, dsn=5.0.0, status=bounced (host mx3.hotmail.com[65.55.92.184] said: 550 Requested action not taken: mailbox unavailable (in reply to RCPT TO command))

bah, en gral. lo hace, puede que no pase a veces:

Apr 22 00:21:52 mail2 postfix/smtp[24775]: connect to
mx3.hotmail.com[64.4.50.179]: Connection timed out (port 25)
Apr 22 00:21:52 mail2 postfix/smtp[24773]: connect to
mx1.hotmail.com[65.54.245.8]: Connection timed out (port 25)


Un par técnicas de análisis las pueden leer aquí:
http://onlamp.com/onlamp/2004/01/22/postfix.html

A thing or two about Postfix log analysis
http://activedeveloper.info/a-thing-or-two-about-postfix-log-analysis.html

2 comentarios:

Paul de Fombelle dijo...

Post muy bueno y completo. De forma general, conseguir que se entreguen correctamente los envíos de correo masivo (legítimos, por supuesto), se ha vuelto a convertir en un reto técnico.

Otra opción es externalizar este desafío y utilizar un servicio de enrutamiento como el de Sarbacán para su envío masivo: http://www.sarbacan.es

Dardo Valdez dijo...

Muchas gracias por tu comentario y colaboración Paul.

Sldos.