Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI
Cuando estamos desarrollando páginas web, una de las funcionalidades más interesantes que deberíamos tener en cuenta, es la de ofrecer la posibilidad, a los usuarios o clientes, de comunicarse con nuestra aplicación, potenciando la interacción e intercambio de información en ambas direcciones.
Hoy en día contamos con varias opciones, como contratar o integrar servicios desarrollados por terceros, que ofrecen novedosas alternativas de comunicación, como chats, Watssap, Telegram, las redes sociales, etc. o de la manera tradicional, mediante el uso del correo electrónico, que al igual que la mayoría de las anteriores, tambén permite envío de documentos adjuntos, solicitudes de pedidos o facturas.
El problema con el que nos encontramos a menudo, es que al configurar nuestro entorno de desarrollo local, no solemos aprovechar para instalar correctamente un servidor de correos que nos permita realizar pruebas de envío y, generalmente optamos por dejar esta comprobación para cuando el proyecto está a punto de terminarse o incluso cuando ya está en el servidor de producción.
Qué es Postfix y para qué sirve
Postfix es un agente de transporte de mensajes (MTA) de última generación, también conocido como servidor SMTP, que tiene dos propósitos:
- Es responsable de transportar mensajes de correo electrónico desde un cliente de correo / agente de usuario de correo (MUA) a un servidor SMTP remoto.
- También se utiliza para aceptar correos electrónicos de otros servidores SMTP.
Postfix fue diseñado originalmente como un reemplazo de Sendmail, el servidor SMTP tradicional en Unix. En comparación, Postfix es más seguro y más fácil de configurar. Es compatible con Sendmail, por lo que si desinstala Sendmail y lo reemplaza con Postfix, sus scripts y programas existentes seguirán funcionando sin problemas.
Cómo instalar y configurar Postfix como servidor SMTP solo de envío en Ubuntu 20.04
Aunque suelo enfocarme en las configuraciones específicas para trabajar con Drupal, en este artículo voy a enseñarte todos los pasos que deberías saber, para configurar un entorno local de Linux, en el que puedas enviar correos electrónicos desde tus aplicaciones, sin importar la plataforma o lenguaje con el que esté desarrollada. Para ello voy a utilizar WSL2 en Windows 10.
Paso 1 - Configurar el entorno de desarrollo con Linux
Para este ejercicio vamos a utilizar el WSL 2 en Windows 10, que nos permitirá desarrollar en un entorno de Linux, dentro de nuestro ordenador con Windows 10 Home, sin la necesidad de utilizar máquinas virtuales. Antes de pasar al siguiente paso, deberías configurar tu entorno WSL2, puedes ver cómo hacerlo en el artículo llamado Cómo instalar Drupal 9 usando Docker en Windows 10 Home
Paso 2 - Configuración del usuario No Root con permisos
Siempre que realicemos una instalación de Linux, el primer paso es configurar los datos para nuestro usuario ROOT, éste tiene acceso y permisos para construir y destruir cualquier archivo dentro de nuestro entorno, lo cual podría suponer un alto riesgo, especialmente si estamos comenzando a trabajar con Linux. Por eso, si todavía no haz configurado el usuario No Root, es el momento de hacerlo, para poder ejecutar el resto del la instalación sin sustos:
Primero creremos el usuario, y a continuación le incluiremos en el grupo sudo, para que pueda ejecutar comando con permisos de root, sin que tengamos que cerrar sesión o abrir otras pestañas para ejecutar el código. Puedes ver una explicación más amplia de Cómo crear y configurar el usuario No Root aquí
adduser noroot_user
usermod -aG sudo noroot_user
Ahora que ya hemos creado nuestro usuario No Root, podremos iniciar sesión, en la misma ventana, o en una nueva pestaña si está utilizando la terminal mejorada en windows, para continuar con el resto de la instalación, para ello ejecutaremos el comando:
su - noroot_user
Paso 3 - Instalación de Apache y configuración del dominio para nuestra web
Lo siguiente que vamos a necesitar es el servidor donde vamos a alojar nuestra web, y el dominio que utilizaremos para el envío de nuestros correos electrónicos. En ese caso, utilizaremos Apache, por considerarlo el más conocido por todos los usuarios.
Primero actualizaremos los listado de paquetes en Linux
sudo apt update
sudo apt upgrade
Y una vez actualizado, podremos ejecutar el código de instalación de Apache:
sudo apt install apache2
Cuando haya terminado la instalación podremos arrancar el servidor, con el siguiente comando:
sudo service apache2 start
Una vez instalado el servidor Apache, probemos que todo funciona, accediendo en el navegador a la url http://localhost. Deberíamos ver en pantalla la siguiente imagen:
Paso 4 - Configuración del dominio con Virtual Host
Para nuestro ejemplo, necesitaremos un dominio, FQDN (Fully Qualified Domain Name), se usa comúnmente en servidores conectados a Internet y deberíamos usar FQDN en nuestros servidores de correo. Consta de dos partes: un nombre de nodo y un nombre de dominio. Por ejemplo:
mail.midomino.com
El dominio del ejemplo anterior, sería un FQDN. mail es el nombre de nodo, midomino.com es el nombre de dominio.
Como en nuestro ejemplo nuestra web no estará conectada a internet, ya que la alojaremos en un entorno local, lo que haremos es "simular" un dominio, que apunte a nuestra ip, para ello, abriremos el archivo donde están alojados los dominios de Ubuntu, escribiendo en la consola el siguiente comando:
sudo nano /etc/hosts
Una vez abierto el editor de texto NANO, que viene con la instalación por defecto de Ubuntu 20.04, añadiremos la misma ip y nuestro dominio, algo parecido a lo siguiente, respetando la misma estructura del modelo que se nos presente en el archivo hosts:
127.0.0.1 mail.drupaladicto.localhost
Al terminar de añadir el dominio en el archivo hosts, haremos clic en Ctrl + X para cerrar y confirmaremos que queremos conservar los cambios haciendo clic en Y.
Paso 5 - Instalación de Postfix
Como siempre, antes de realizar cualquier instalación en Linux, primero actualizaremos el listado de paquetes disponibles en nuestra distribución y a continuación ejecutaremos el comando de instalación de Postfix y el (-y), para que se instalen todas las dependencias:
sudo apt update
sudo apt install mailutils
Inmediatamente, veremos en pantalla el inicio del instalador, donde seleccionaremos la opción Internet Site, si no se habre con esta opción seleccionada por defecto, presionaremos la tecla TAB hasta seleccionarla y luego presionaremos la tecla ENTER, para pasar a la siguiente pantalla.
En la siguiente pantalla, escribiremos el nombre de nuestro dominio, como mencionamos anteriormente, si nuestro objetivo es mail.midominio.localhost, sólo escribiremos la segunda parte, tal y como se muestra en la imagen:
La opción predeterminada es Internet Site. Es la opción recomendada para su caso de uso, por lo tanto, presione TAB y, luego, ENTER. Si solo ve el texto de la descripción, presione TAB para seleccionar OK y, luego, ENTER.
Si no se muestra automáticamente, ejecute el siguiente comando para iniciarlo:
sudo dpkg-reconfigure postfix
Una vez instalado, Postfix se iniciará automáticamente y se generará un archivo /etc/postfix/main.cf. Ahora podemos verificar la versión de Postfix con este comando:
postconf mail_version
En Ubuntu 18.04, la versión de Postfix es 3.3.0 y Ubuntu 20.04 se envía con la versión 3.4.13.
Paso 6 - Configuración de Postfix
En este paso, configuraremos Postfix para enviar y recibir correos electrónicos únicamente del servidor en el que se está ejecutando; es decir, desde localhost.
Para lograrlo, configuraremos Postfix para que escuche únicamente en la interfaz de loopback, que es la interfaz de red virtual que utiliza el servidor para comunicarse internamente. Para ejecutar estos cambios, editaremos el archivo de configuración principal de Postfix, denominado main.cf, que se encuentra en etc/postfix.
Abriremos el archivo con nuestro editor NANO escribiendo en pantalla el siguiente comando:
sudo nano /etc/postfix/main.cf
Una vez abierto, buscaremos la siguientes líneas y realizaremos las modificaciones:
. . .
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
. . .
Canbiaremos el valor de inet_interfaces para que sea igual a loopback-only:
. . .
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
. . .
Sin cerrar el archivo, buscaremos otra directiva que tendremos que modificar, es mydestination, que especifica la lista de dominios que se entregan a través del transporte de entrega de correo local_transport. Por defecto, los valores son similares a los siguientes:
. . .
mydestination = $myhostname, your_domain, localhost.com, , localhost
. . .
Modificaremos esta línea para que tenga el siguiente aspecto:
. . .
mydestination = localhost.$mydomain, localhost, $myhostname
. . .
Cuando hayamos terminado con los cambios, cerraremos el archivo y entonces podremos restaurar el servicio usando el siguiente comando:
sudo service postfix restart
Nuestro servidor ya está configurado para enviar correos electrónicos, ahora podremos realizar las pruebas de envío.
Paso 7 - Comprobación de los envíos desde el servidor SMTP
En este paso, probaremos si Postfix puede enviar correos electrónicos a una cuenta de correo electrónico externa usando el comando mail, que es parte del paquete mailutils que instaló en el primer paso.
Para enviar un correo electrónico de prueba, ejecutaremos el siguiente comando, cambiando la última parte por la dirección de correo con la que quieras probarlo:
echo "Este es el cuerpo del correo de pruebas" | mail -s "Este es el asunto del correo" tu_direccion_de_correo
Una vez ejecutado el código, podrás abrir la bandeja de entrada o la de no deseados (Span) de tu cuenta de correo y deberías tener el contenido de este correo casi de inmediato.
Si recibiéramos un error del comando mail, o si no recibiéramos un mensaje después de un período prolongado, tendremos que comprobar que la configuración de Postfix que modificamos sea válida y que el nombre de su servidor y el nombre de host estén establecidos con el nombre de su dominio.
Debemos tomar en cuenta, que los correos todavía no están cifrados, por lo que los servidores de correo, podrían identificarlos como No deseados (Span)
Paso 8 - Reenviar correos del sistema
En este paso, configuraremos el reenvío de correos electrónicos para el usuario root, con el propósito de que los mensajes generados por el sistema que se nos envíen en nuestro servidor local, se reenvíen a una dirección de correo electrónico externa.
El archivo /etc/aliases contiene una lista de nombres alternativos de destinatarios de correo electrónico. Lo abriremos para editarlo:
sudo nano /etc/aliases
Una vez abierto, tendrá un aspecto parecido al siguiente:
# See man 5 aliases for format
postmaster: root
La única directiva presente especifica que los correos electrónicos generados por el sistema se envíen a root.
Así que añadiremos la siguiente línea al final del archivo:
...
root: tu_direccion_de_correo
Con esta línea, estamos especificando que los correos electrónicos enviados al usuario root se reenvíen a una dirección de correo electrónico específica. Sustituiremos tu_direccion_de_correo por tu dirección de correo electrónico personal. Y cuando hayamos terminado, guardaremos los cambios y cerraremos el archivo.
Para que el cambio se realice, ejecutaremos el siguiente comando:
sudo newaliases
Al ejecutar newaliases, se creará una base de datos de alias que utiliza el comando mail, que se toman del archivo de configuración que acaba de editar.
Podremos comprobar que se envían correos electrónicos al usuario root al ejecutar lo siguiente:
echo "Este es el cuerpo del mensaje, enviado a ROOT" | mail -s "Esta es la línea del asunto" root
Si abrimos nuestra cuenta de correo, podremos ver un nuevo mensaje.
Ahora, habilitará el cifrado de mensajes para que todos los correos electrónicos que envíe su servidor estén protegidos contra alteraciones en tránsito y se consideren más legítimos.
Paso 9 - Habilitar el cifrado SMTP
Para nuestro ejemplo, vamos a utilizar un certificado auto-firmado, con el programa OpenSSL, que viene instalado en Ubuntu 20.04. Ejecutaremos el siguiente comando, modificando el nombre del dominio, por el que configuramos al principio de este artículo, y esto nos generará el certificado y la clave primaria, dentro del la ubicación /etc/ssl:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/midominio.localhost.key -out /etc/ssl/midominio.localhost.crt
Esto nos abrirá la pantalla, que nos perdirá los datos del registro del certificado, rellenaremos cada línea, haciendo clic en la tecla ENTER, para pasar a la siguiente; teniendo especial cuidado en las dos últimas, donde tendremos que especificar el nombre de nuestro dominio, tal y como lo hemos definido y una dirección de correo real, para que no nos genere ningún error.
Cuando hayamos terminado con la creación del certificado, veremos el mensaje de confirmación de que se generado correctamente y entonces, podremos realizar los cambios en el archivo de configuración, para actualizar la ubicación por la de nuestro certificado, para ello ejecutaremos la siguiente línea:
sudo nano /etc/postfix/main.cf
Una vez abierto, buscaremos las siguientes líneas y las actualizaremos por la información correspondiente:
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level=may
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
Al terminar, cerraremos el archivo y guardaremos lo cambios. A continuación reiniciaremos el servicio de Postfix para que queden registrados, con el siguiente comando:
sudo service postfix restart
Entonces, podremos volver a probar el envío de un correo electrónico, con el siguiente código, modificando tu cuenta de correo:
echo "Este es el cuerpo del mensaje CERTIFICADO " | mail -s "Este es el asunto del Correo Certificado" tu_direccion_de_correo
Si volvemos a ver nuestra bandeja de entrada, deberíamos encontrar un nuevo correo en el buzón.