Analisis de caso: email en el servidor, y envíos masivos - perfeccion-ar/infraestructura-clasica-y-avanzada GitHub Wiki

El presente cursado busca independizar al alumno de soluciones contratadas (ej, hosting con Cpanel), y crear él mismo su propia infraestructura. No solo para emprendimientos propios, sino porque realmente marcan una diferencia en entrevistas laborales de empresas grandes.
Sin embargo, ¿siempre conviene hacer esto?
La respuesta es: depende de cuanto pague el cliente. Aquí hay un ejemplo que puede ser arduo de resolver en nuestra propio cloud/VPS/server:
- El servidor necesita mandarnos alertas (falta de espacio, backup no entregado a otro server, etc)
- El cliente desea tener direcciones de correo @sudominio (ventas@sudominio, informes@sudominio, etc)
- El cliente quiere mandar muchos correos, tal que exceden sus capacidad de envío. Ejemplo
- Publicidad
- Mensajes normales: un foro en un aula de Moodle
- Formulario de contacto, Recuperación de contraseñas de usuarios en su Wordpress
- Un script en el server, alguno de nuestros programas quiere avisar cada mañana cuando el backup terminó bien
- etc
El primero de los casos, se resuelve más o menos simple: instalamos un Postfix, y los correos empiezan a llegar... ¡directamente al Spam! - eso no es un problema si son mensajes para nosotros, los administradores. Podemos rescatar esos mensajes o marcarlos como "No Spam". Pero no servirá para los clientes.
Aquí tiene una configuración básica pero efectiva: https://phoenixnap.com/kb/linux-mail-command
Otra opción es usar el servidor SMTP de nuestra cuenta en Gmail, para que nuestros programas, ejemplo Wordpress, puedan enviar a través de él.
El siguiente ejemplo se puede hacer también con Microsoft 365 (Outlook), el SMTP incluído en el hosting de cualquier plan de Don Web, etc
Pasos generales
- Loguearse a Gmail
- Crear una contraseña especial, llamada "contraseña de aplicación", entrando a https://myaccount.google.com/apppasswords

- Entrar a la configuración de Gmail, y activar POP. Este protocolo habilita un server SMTP. Se hace entrando a https://mail.google.com/mail/u/0/#settings/ y luego haciendo click en [Forwarding and POP/IMAP]

- En Instrucciones de configuración, un link lo llevará a la configuración de los valores SMTP.

Nótese que nos estamos en cierta forma aprovechando de la oportunidad que nos brinda Gmail de setear estos valores en un cliente de correo clásico: como Thunderbird, Claws Mail y otros.
¡Ya tenemos un servidor SMTP, sin tener que haber instalado un montón de cosas en nuestro server! ¿Que podemos hacer?
- Primero, probarlo, con alguno de esos clientes del enlace anterior
- ¿Funciona? Vamos a Wordpress: trataremos que nuestro CMS / LMS (ej: Wordpress, Moodle) pueda mandarnos correos de recuperación de contraseñas, llenado de datos en formulario de contactos, etc.
- Moodle por ejemplo, trae adentro la opción de setearle valores SMTP. Pero no es el caso de Wordpress, el cual no trae soporte SMTP - En cambio, su función interna mail() entregará el correo a cualquier puerto 25 que esté configurado en el equipo, caso Postfix (Método 1), o SSMTP (Método 3). Por lo tanto, la opción más rápida es instalar algún plugin como https://es.wordpress.org/plugins/wp-mail-smtp/ - y luego adentro de ese plugín, configurar los valores SMTP que vimos en las capturas de pantalla.
Ya tenemos un SMTP de Gmail que enviará correos por nosotros. Pero no usamos ni Moodle, ni [Wordpress + wp-mail-smtp]
En este caso, queremos de forma simple, que cualquier cosa que arrojemos en el puerto 25 local sea enviada.
Ejemplos:
- Tenemos algún programa escrito en PHP sumamente bobo. Usando solo la función mail(), queremos enviar correos. Ejemplo:
<?php
$msg = "Nos cascotean el rancho";
// use wordwrap() if lines are longer than 70 characters
$msg = wordwrap($msg,70);
// send email
mail("[email protected]","Cascotes",$msg);
?>
Esto es válido también para otros lenguajes: Node, Ruby, Python, Java, etc. Todos ellos tienen algúna librería interna, de base, para entregar en el puerto local, 25.
Incluso en ocasiones los lenguajes tienen librerías más completas para hacer entregas, que la simple función mail() de PHP. PHP de hecho, tiene también Phpmailer, una librería que en lugar de "solo" arrojar cosas al puerto 25, puede ser alimentada también con los valores SMTP logrados en el Método 2, y lograr así una entrega mas controlada.
Python, sin ir mas lejos, tiene a su vez smtplib (ver ejemplo). Y así con los demás lenguajes.
- Otra situación: Queremos que el sistema operativo envíe correos. Ejemplo a través del simple comando mail (
apt-get install mailutils
).
$ mail [email protected] -s 'Nos cascotean el rancho!'
Así lograremos que cualquier servicio del sistema operativo pueda alertarnos. Ejemplos abundan: desde un smartmontools avisando de la inminente falla de un disco, a un crontab haciendo un backup diario, y avísandonos que todo está bien.
En definitiva: si no queremos complicarnos, y queremos tener un puerto local 25 donde TODO sea envíado por allí, debemos configurar "Simple" SMTP o "SSMTP". Este programa, tras recibir el correo en el puerto 25, pedirá a los servidores de Gmail que terminen la entrega.
- Si ya tiene los valores SMTP obtenido en los pasos anteriores, hay muchos ejemplos en Internet sobre cómo configurar SSMTP. Vea como muestra el siguiente artículo https://sobrebits.com/enviar-correos-desde-la-linea-de-comandos-con-ssmtp-y-gmail/
Límites de este método: hay que cuidar mucho de no pasarnos de ciertos límites mensuales (ej: 200 correos diarios) o pueden cerrarnos la cuenta de Gmail. Un formulario que tengamos en Wordpress podria ocasionar eso, si no tiene un captcha.
¿¡Solo 200 correos diarios!? - ¡pero yo quiero enviar más!
Si hablamos solo de Wordpress, puede usar la API de Google, y un plugin. Es muy posible que los limites sean mejores. Este documento resume bien los pasos: https://kinsta.com/es/blog/gmail-smtp-servidor/
Lo anterior es mas o menos simple. El problema viene cuando tenemos alguna o ambas de las siguientes situaciones
- Necesitamos cuentas @dominio-del-cliente
-
Necesitamos mandar mas de 200 correos diarios. ¡Muchos mas! - Casos:
- Una campaña publicitaria con denas de miles de correos.
- Respuestas en foros de Moodle con muchos estudiantes
- Nuestros propios Gitlab-CE, Jenkins, Youtrack, etc - avisando a los usuarios de... pull requests a master, triguereo de deploys, asignación de tickets de trabajo, etc.
Es decir, habría llegado el momento de instalar nuestro propio servidor de correos.
Si vamos a los pasos necesarios, esto nos exigirá de configurar un montón de servicios, y contratar probablemente más de un servidor. Necesitamos pensar por lo menos en los siguientes servicios:
- SMTP (puerto 25): Postfix, o Qmail, o Sendmail para enviar los correos
- Bind (puerto 53) para gestionar los DNS
- POP (puerto 110 y 995) e IMAP (143 y 993): Alguna interfaz bonita para que el usuario vea y mande sus correos, como Squirremail
- Spamassasain para protegernos del Spam
- Procmail, Fetchmail para ir guardando los correos que llegan en los /home/user
- Antivirus, firewall, etc
- Controlar todo el tiempo que nuestra ip no se "queme", quitandolas todo el tiempo de blacklists.
La gestión de tantos daemons puede volverse tan ardua, que incluso puede que convenga configurar todo con algún "todo incluído" como Exchange (Windows Server), Proxmox Mail Gateway, Zimbra, Poste.io, etc.
Pero igual será complicado administrarlo y defenderlo: hay empresas que destinan un administrador solo para mantener todo eso. También se puede comprar e instalar Cpanel, pero volvemos al origen del problema, que era independizarnos del hosting.
Hay clouds que ya hacen eso. Vamos por ello.
Si tenemos el control de los DNS, podemos aliviar mucho el problema.
-
Respecto de gestionar muchas direcciones de correo, simplemente podemos crear registros MX en nuestro DNS, y que los correos:
- Los gestione un hosting, como habíamos dicho. Los hostings son bastante baratos, alrededor de usd 5 al mes. Si el DNS lo tiene el hosting, apuntamos un registro A hacia nuestro server de metal, o hacia nuestra VPS (afuera del hosting!) pero dejamos los MX como están. Es decir, solo le usamos el servicio de correo.
- Los gestione algún cloud como Google Workspaces (Gmail) o Azure (Microsoft 365 y su Outlook en línea), Este último es el mejor método de todos los aquí descritos, pero es caro: aprox USD 5 por cuenta.
Dato: El servicio de correo (y Google Drive) de Google Workspaces es gratis para escuelas y organizaciones sin fines de lucro. Ejemplo de configuración → Ver más abajo las entradas MX de mi configuración en Hurricane, donde toda dirección @eim.esc.edu.ar es simplemente enviada a los servidores de email de Google.
-
Respecto de mandar muchos correos (mas de 200 por día): el cliente debería contratar un servicio externo para sus campañas de correo: aquí tiene una lista de servicios muy fáciles de usar, con plantillas, estadísticas, etc. Para nuestro ejemplo, usaremos Mailrelay, que incluye 42.000 envíos mensuales gratis.
- A cambio, esos servicios cuidan mucho su reputación. Nos exigen minimamente:
- Que les demostremos que somos los dueños del dominio, agregando ciertos valores en registros TXT del server
- Que agreguemos algunas señales en nuestro DNS (registros DKIM) tal que los servidores de correo de destino puedan comprobar que no somos spammers.
- A cambio, esos servicios cuidan mucho su reputación. Nos exigen minimamente:
- Que el cliente tenga su correo en Gmail
- Si no puede ser así, y el cliente necesita correos@su_dominio, hay que configurar sus MX apuntando a un hosting (ej: Hostinguer). De hecho podemos usar su derecho a usar SMTP en su Hosting para configurarlo en Wordpress y en nuestros scripts. El limite de envío debería ser un poco mejor que enviar a través de Gmail o de Google Workspaces
- Que el email masivo se mande usando la cuota gratuita de clouds que se dedican a envíos masivos:
Vamos a tratar este último caso, usando el generoso cloud Mailrelay
Mailrelay comienza pidiendo que verifiquemos que somos dueños del dominio del cual queremos mandar masivamente correos. Solo tras ello, nos permitirán enviar correos a través de sus server SMTP

En este ejemplo, Mailrelay nos pide que demostremos que somos los dueños del dominio eim.esc.edu.ar, seteando en el DNS estas entradas CNAME y TXT
Entramos a nuestro DNS. En mi ejemplo es Hurricane (gratis, dns.he.net). Podría ser también Microsoft 365, Route 53, Cloudflare, etc - e incluso puede ser un DNS contratado en un hosting:


Generamos entradas TXT y CNAME de acuerdo a las instrucciones del servicio tercerizado de SMTP (Mailrelay)


Si todo anda bien, habremos demostrado nuestra honorabilidad:

Ya estamos en condiciones de configurar un cliente de correo (Ej: Thunderbird) con los valores SMTP de Mailrelay. Este servicio nos permite 500 correos mensuales gratis.

También podemos poner estos valores en nuestro Wordpress o en nuestro Moodle, para que envíen todos los correos que necesiten.
Finalmente, es muy posible que hayamos programado algún sistema que requiera de envío de alertas. Lo mismo scripts (shell Bash, Powershell) de backups o de monitoreo. Ya podemos configurar un Postfix o un SSMTP básico en nuestro server para que mande alertas de todo tipo al SMTP principal que hay en Mail Relay. A esto justamente se dice hacer... relay. También podemos usar alguna librería de Python, Ruby, o el lenguaje que queramos, para enviar mensajes desde nuestros propios programas. Podemos por ejemplo, hacer nuestros propios programas de email marketing, avisos a usuarios, a clientes, etc.