Cómo instalar y configurar Postfix en Debian 13 para enviar correos con HostGator y Gmail

Guía completa para principiantes | OPERSLINUX

Serie Postfix — Parte 1 | OPERSLINUX

Enviar correos electrónicos desde Linux es una función especialmente útil cuando administramos servidores, desarrollamos aplicaciones web o necesitamos recibir notificaciones automáticas.

Por ejemplo, podemos configurar nuestro servidor Debian para que nos avise cuando el almacenamiento esté por agotarse, cuando un servicio deje de funcionar o cuando alguien complete un formulario de contacto desarrollado en PHP.

Para conseguirlo utilizaremos Postfix, un agente de transporte de correo que nos permitirá enviar mensajes mediante un servidor SMTP externo.

En este tutorial aprenderemos a instalar Postfix desde cero en Debian 13, configurarlo primero con una cuenta de correo de HostGator o un proveedor similar y, posteriormente, utilizar Gmail como alternativa.

También realizaremos pruebas desde la terminal y comprobaremos su compatibilidad con scripts Bash y aplicaciones PHP.

1. ¿Qué es Postfix y para qué sirve?

Postfix es un agente de transporte de correo electrónico, también conocido como MTA (Mail Transfer Agent).

Su función es recibir mensajes de aplicaciones o usuarios locales, procesarlos y encargarse de su transporte hacia otros servidores de correo.

Por ejemplo, cuando ejecutamos:

echo "Hola desde Debian" | mail -s "Prueba" [email protected]

El comando mail prepara el mensaje y lo entrega al sistema de correo configurado.

Si utilizamos Postfix, este puede conectarse a un servidor SMTP externo, autenticarse y transmitir el mensaje.

El proceso sería:

USUARIO O APLICACIÓN
        |
        v
COMANDO mail / BASH / PHP
        |
        v
      POSTFIX
        |
        v
 SERVIDOR SMTP EXTERNO
  HostGator o Gmail
        |
        v
 SERVIDOR DESTINATARIO
        |
        v
 BUZÓN DE CORREO

¿Por qué utilizar un servidor SMTP externo?

Postfix también puede intentar entregar mensajes directamente a los servidores destinatarios.

Sin embargo, esto requiere una configuración más avanzada, especialmente en lo relacionado con DNS, reputación de direcciones IP, SPF, DKIM, DMARC y restricciones de los proveedores de Internet.

Para comenzar, utilizaremos un servidor SMTP externo que ya disponga de la infraestructura necesaria para transmitir nuestros mensajes.

Este procedimiento se conoce como SMTP relay o retransmisión SMTP.

¿Qué conseguiremos?

Al finalizar tendremos un servidor Debian capaz de enviar correos utilizando:

  • El comando mail.
  • La interfaz compatible con Sendmail.
  • Scripts Bash.
  • Tareas programadas con cron.
  • La función mail() de PHP.
  • Aplicaciones web que utilicen el sistema local de correo.

No configuraremos un servidor para recibir correos desde Internet ni alojaremos buzones de correo. Nuestro objetivo será exclusivamente el envío.


2. Requisitos

Para seguir el tutorial necesitaremos:

  • Debian GNU/Linux 13 instalado.
  • Una cuenta de usuario con permisos sudo.
  • Conexión a Internet.
  • Una cuenta de correo de HostGator o un proveedor SMTP similar.
  • Opcionalmente, una cuenta de Gmail.
  • Acceso a la terminal.

Trabajaremos suponiendo que Debian se encuentra recién instalado y que todavía no hemos configurado un servidor de correo.

2.1. Comprobar nuestra versión de Debian

Abrimos una terminal y ejecutamos:

cat /etc/os-release

Explicación

cat permite mostrar el contenido de archivos.

/etc/os-release contiene información sobre la distribución Linux instalada.

También podemos utilizar:

hostnamectl

Este comando muestra información del sistema, incluido su nombre de host.


3. Comprobar si ya existe un servidor de correo instalado

Antes de instalar Postfix es recomendable comprobar si tenemos otro agente de transporte de correo.

Ejecutamos:

dpkg -l | grep -Ei 'postfix|exim4|sendmail|nullmailer|msmtp|ssmtp'

¿Qué significa cada parte?

dpkg -l muestra los paquetes registrados por el administrador de paquetes de Debian.

| envía la salida del primer comando al segundo.

grep busca coincidencias de texto.

-E permite utilizar expresiones regulares extendidas.

-i ignora diferencias entre mayúsculas y minúsculas.

El símbolo | dentro de la expresión de búsqueda significa «o».

Por ejemplo:

postfix|exim4|sendmail

busca cualquiera de esos nombres.

Si no encontramos ningún MTA instalado, podemos continuar.

Si aparece Exim4, Sendmail u otro sistema, debemos revisar su configuración antes de sustituirlo. No es recomendable instalar dos agentes de transporte principales sin comprender cómo interactúan.


4. Actualizar los repositorios e instalar Postfix

Primero actualizamos la información de los paquetes:

sudo apt update

Explicación

sudo ejecuta el comando con privilegios administrativos.

apt es el administrador de paquetes de Debian.

update actualiza los índices de paquetes disponibles en los repositorios configurados.

Ahora instalamos:

sudo apt install postfix mailutils libsasl2-modules ca-certificates openssl

Estos paquetes cumplen funciones diferentes:

PaqueteFunción
postfixAgente de transporte de correo
mailutilsHerramientas para enviar y consultar correos desde terminal
libsasl2-modulesMódulos para autenticación SMTP
ca-certificatesCertificados de autoridades de confianza
opensslHerramientas para comprobar conexiones TLS

4.1. Pantalla de configuración inicial

Durante la instalación puede aparecer un asistente de configuración.

Debian ofrece diferentes tipos de instalación de Postfix.

Para este tutorial seleccionaremos:

Internet Site

Aunque utilizaremos un relay SMTP externo, esta opción proporciona una configuración inicial que después adaptaremos manualmente.

Cuando solicite el nombre de correo del sistema, podemos indicar un nombre apropiado para nuestro equipo o dominio.

Por ejemplo:

debian.ejemplo.com

Este nombre es ilustrativo. No debemos utilizar un dominio ajeno como identidad de nuestro servidor.

Si todavía no tenemos un dominio propio, podemos continuar con el nombre local del equipo para realizar pruebas.

Más adelante configuraremos el servidor SMTP que realmente enviará los mensajes.


5. Comprobar que Postfix está instalado

Ejecutamos:

postconf mail_version

Este comando muestra la versión de Postfix.

Ahora consultamos el servicio:

sudo systemctl status postfix --no-pager

Explicación

systemctl administra unidades de systemd.

status consulta su estado.

postfix identifica el servicio.

--no-pager evita mostrar la salida mediante un paginador interactivo.

En algunas instalaciones de Debian, la unidad principal puede aparecer como active (exited) porque actúa como unidad de control. Esto no significa necesariamente que Postfix esté detenido.

Podemos comprobar su configuración mediante:

sudo postfix check

Y consultar sus procesos:

ps aux | grep '[p]ostfix'

Si necesitamos iniciarlo:

sudo systemctl start postfix

Para habilitar su arranque con el sistema:

sudo systemctl enable postfix

6. Conocer los archivos de configuración

Postfix utiliza varios archivos, pero los más importantes para nuestro tutorial son:

/etc/postfix/
│
├── main.cf
├── master.cf
└── sasl_passwd

El último archivo todavía no existe; lo crearemos posteriormente.

6.1. Archivo main.cf

Es el archivo principal de configuración.

Contiene parámetros relacionados con el nombre del servidor, la entrega de mensajes, la autenticación SMTP y el cifrado TLS.

Lo abriremos mediante:

sudo nano /etc/postfix/main.cf

6.2. Archivo master.cf

Define los servicios y procesos que Postfix puede ejecutar.

Para nuestro escenario de envío local mediante un relay SMTP externo no necesitaremos modificarlo.

6.3. Archivo sasl_passwd

Almacenará las credenciales utilizadas para autenticarnos con HostGator o Gmail.

Por contener información sensible, tendrá permisos restringidos.


7. Hacer una copia de seguridad

Antes de modificar main.cf, creamos un respaldo:

sudo cp -a /etc/postfix/main.cf /etc/postfix/main.cf.bak

Explicación

cp copia archivos.

-a conserva atributos importantes, como permisos y propietario.

El archivo terminado en .bak será nuestra copia de seguridad.

Si cometemos un error, podremos recuperar la configuración anterior.


PARTE A: CONFIGURAR POSTFIX CON HOSTGATOR O UN SMTP SIMILAR

8. Obtener los datos SMTP de nuestro proveedor

Antes de modificar Postfix necesitamos conocer los parámetros del servidor SMTP.

En HostGator, cuando utilizamos cuentas de correo administradas mediante cPanel, podemos consultar la información de conexión desde el panel de hosting.

Generalmente encontraremos estos datos en la sección de cuentas de correo y configuración de dispositivos.

Necesitaremos:

ParámetroEjemplo
Servidor SMTPservidor.ejemplo.com
Usuario[email protected]
ContraseñaContraseña del buzón
Puerto465 o 587, según el servicio
SeguridadSSL/TLS o STARTTLS
AutenticaciónSí

Importante: el nombre servidor.ejemplo.com es ficticio. Debemos reemplazarlo por el hostname real proporcionado por nuestro servicio de correo.

La documentación de HostGator para cuentas de correo cPanel muestra habitualmente el puerto 465 con SSL/TLS, mientras que algunos servicios también admiten 587 con STARTTLS.

No debemos asumir que ambos puertos funcionan en todas las cuentas.

En este tutorial comenzaremos con 465, que es la opción de conexión cifrada indicada en su documentación general. Después mostraremos cómo adaptar la configuración a 587.


9. Comprobar la conexión al servidor SMTP

Antes de introducir contraseñas podemos comprobar que nuestro equipo se comunica con el servidor.

Para el puerto 465 utilizamos:

openssl s_client \
  -connect servidor.ejemplo.com:465 \
  -servername servidor.ejemplo.com \
  -verify_hostname servidor.ejemplo.com \
  -verify_return_error \
  -CAfile /etc/ssl/certs/ca-certificates.crt

Debemos sustituir el hostname de ejemplo.

Explicación

openssl s_client inicia una conexión TLS de prueba.

-connect indica el servidor y puerto.

-servername proporciona el nombre de servidor para SNI.

-verify_hostname comprueba que el certificado corresponda al nombre esperado.

-verify_return_error hace que los errores de verificación provoquen un fallo.

-CAfile indica el archivo de certificados de confianza.

Si todo funciona, podremos encontrar:

Verification: OK
Verify return code: 0 (ok)

Esta comprobación verifica la conexión TLS y el certificado, pero todavía no confirma que nuestras credenciales SMTP sean correctas.

Para cerrar la prueba podemos presionar Ctrl + C.


10. Configurar Postfix para HostGator mediante SSL/TLS

Ahora abrimos:

sudo nano /etc/postfix/main.cf

Buscamos las directivas que vamos a utilizar.

Si ya existen, modificamos sus valores. No debemos dejar configuraciones duplicadas.

Para facilitar el aprendizaje podemos agregar comentarios explicativos.

Utilizaremos:

# ==================================================
# POSTFIX - ENVÍO MEDIANTE SMTP EXTERNO
# ==================================================

# Nombre de nuestro servidor
myhostname = debian.ejemplo.com

# Dominios que Postfix considera locales
mydestination = $myhostname, localhost.$mydomain, localhost

# Escuchar únicamente conexiones SMTP locales
inet_interfaces = loopback-only

# Redes locales de confianza
mynetworks = 127.0.0.0/8, [::1]/128

# Servidor SMTP externo
relayhost = [servidor.ejemplo.com]:465

# Autenticación SASL
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

# No permitir autenticación anónima
# ni mecanismos de contraseña sin TLS
smtp_sasl_security_options = noanonymous, noplaintext

# Permitir mecanismos LOGIN/PLAIN
# únicamente dentro de la sesión TLS
smtp_sasl_tls_security_options = noanonymous

# Exigir cifrado y verificar el servidor
smtp_tls_security_level = secure

# SSL/TLS desde el inicio de la conexión
smtp_tls_wrappermode = yes

# Certificados de confianza
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

# Información básica de TLS en registros
smtp_tls_loglevel = 1

Este bloque es una configuración de referencia para una instalación nueva dedicada al envío local. Debemos conservar otros parámetros legítimos que Debian haya generado en main.cf y evitar duplicar directivas.

No debemos utilizar literalmente debian.ejemplo.com ni servidor.ejemplo.com. Son marcadores que deben sustituirse por los nombres apropiados.

10.1. Explicación de los parámetros

myhostname

myhostname = debian.ejemplo.com

Define el nombre que Postfix utilizará para identificar al servidor.

Debe ser un nombre válido y apropiado para nuestra instalación.

mydestination

mydestination = $myhostname, localhost.$mydomain, localhost

Indica qué dominios se consideran destinos locales.

No debemos agregar automáticamente el dominio de nuestro buzón externo. Si Postfix considera ese dominio local, podría intentar entregar sus mensajes localmente en lugar de utilizar el relay.

inet_interfaces

inet_interfaces = loopback-only

Hace que Postfix escuche conexiones SMTP entrantes únicamente en las interfaces locales.

Esto es adecuado para nuestro objetivo: enviar mensajes generados en el propio servidor.

mynetworks

mynetworks = 127.0.0.0/8, [::1]/128

Define las redes de confianza.

Aquí incluimos únicamente las direcciones de loopback IPv4 e IPv6.

No debemos incluir redes públicas ni rangos amplios sin una razón administrativa.

relayhost

relayhost = [servidor.ejemplo.com]:465

Indica el servidor SMTP al que Postfix entregará los mensajes externos.

Los corchetes evitan que Postfix busque registros MX para ese nombre.

El número 465 indica el puerto.

smtp_sasl_auth_enable

smtp_sasl_auth_enable = yes

Activa la autenticación SASL del cliente SMTP de Postfix.

smtp_sasl_password_maps

smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

Indica dónde se almacenarán las credenciales.

smtp_tls_security_level

smtp_tls_security_level = secure

Exige TLS y verificación de la identidad del servidor.

smtp_tls_wrappermode

smtp_tls_wrappermode = yes

Activa TLS desde el comienzo de la conexión, apropiado para el puerto 465.

Esta es una diferencia fundamental respecto al puerto 587, donde normalmente se negocia STARTTLS después de iniciar la conversación SMTP.


11. Crear el archivo de credenciales

Primero creamos el archivo con permisos restringidos:

sudo install -m 600 -o root -g root /dev/null /etc/postfix/sasl_passwd

Ahora lo abrimos:

sudo nano /etc/postfix/sasl_passwd

Agregamos:

[servidor.ejemplo.com]:465 [email protected]:CONTRASEÑA_DEL_CORREO

Debemos sustituir todos los valores.

¿Qué significa esta línea?

[servidor.ejemplo.com]:465 identifica el relay SMTP.

[email protected] es el usuario SMTP.

CONTRASEÑA_DEL_CORREO es la contraseña de la cuenta de correo.

El formato general es:

[servidor]:puerto usuario:contraseña

El servidor y puerto deben coincidir exactamente con los configurados en relayhost.

No debemos utilizar la contraseña de acceso al panel de hosting si el proveedor requiere la contraseña específica del buzón.


12. Generar la base de datos de credenciales

Postfix utilizará una tabla indexada para consultar las credenciales.

Ejecutamos:

sudo postmap hash:/etc/postfix/sasl_passwd

Esto genera:

/etc/postfix/sasl_passwd.db

¿Qué hace postmap?

postmap crea o consulta tablas de búsqueda utilizadas por Postfix.

En este caso, convierte nuestro archivo de texto en una base de datos de tipo hash.

Podemos comprobar los tipos disponibles mediante:

postconf -m

Si nuestra instalación no admite hash, debemos seleccionar un tipo compatible, como lmdb, y utilizarlo tanto en main.cf como en el comando postmap.

Ahora protegemos los archivos:

sudo chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

¿Qué significa chmod 600?

El propietario puede leer y escribir.

Los demás usuarios no tienen permisos sobre esos archivos.

Esto es importante porque contienen credenciales reales.


13. Comprobar y aplicar la configuración

Ejecutamos:

sudo postfix check

Si encontramos errores, debemos corregirlos antes de continuar.

Después reiniciamos:

sudo systemctl restart postfix

Comprobamos:

sudo systemctl status postfix --no-pager

También podemos consultar los parámetros configurados:

postconf relayhost smtp_tls_security_level smtp_tls_wrappermode smtp_sasl_auth_enable

Esperamos encontrar los valores que acabamos de establecer.


14. Enviar nuestro primer correo con HostGator

Para enviar un mensaje desde la terminal utilizaremos mail, proporcionado por GNU Mailutils.

Ejecutamos:

echo "Hola, este correo fue enviado desde Debian 13 utilizando Postfix." \
| mail -r [email protected] \
       -s "Prueba de Postfix con HostGator" \
       [email protected]

Explicación

echo produce el contenido del mensaje.

| envía ese contenido a mail.

mail prepara el correo.

-r establece la dirección del remitente solicitada por GNU Mailutils.

-s define el asunto.

[email protected] representa la dirección destinataria.

Utilizaremos un remitente autorizado por nuestra cuenta SMTP.

El comando puede terminar sin mostrar ningún mensaje. Esto no significa automáticamente que el destinatario lo haya recibido.

Debemos comprobar los registros.


15. Consultar los registros y la cola de Postfix

Primero revisamos:

postqueue -p

Este comando muestra los mensajes pendientes.

Si aparece:

Mail queue is empty

la cola consultada está vacía.

Esto no garantiza que los mensajes hayan llegado, por lo que también revisaremos los registros.

En Debian podemos utilizar:

sudo journalctl --since "10 minutes ago" --no-pager | grep -i postfix

Explicación

journalctl consulta los registros del sistema.

--since limita la búsqueda a un periodo.

--no-pager muestra el resultado directamente.

grep -i postfix filtra los mensajes relacionados con Postfix.

En instalaciones que utilizan archivos de registro tradicionales también podemos encontrar:

sudo tail -n 50 /var/log/mail.log

Este archivo no está presente en todos los sistemas.

¿Qué debemos buscar?

Una entrega aceptada por el servidor SMTP puede aparecer como:

status=sent

Un intento aplazado puede aparecer como:

status=deferred

Un rechazo definitivo puede aparecer como:

status=bounced

sent indica que Postfix registró una entrega satisfactoria al siguiente servidor. No garantiza que el mensaje haya terminado en la bandeja principal del destinatario.


16. ¿Y si nuestro proveedor utiliza el puerto 587 con STARTTLS?

Algunos servicios SMTP utilizan el puerto 587.

En ese caso debemos modificar dos parámetros de main.cf.

Abrimos:

sudo nano /etc/postfix/main.cf

Cambiamos:

relayhost = [servidor.ejemplo.com]:587
smtp_tls_wrappermode = no

Conservamos:

smtp_tls_security_level = secure

Esto permitirá que Postfix inicie la conexión SMTP y negocie STARTTLS.

Ahora debemos modificar la clave del archivo de credenciales:

sudo nano /etc/postfix/sasl_passwd

Cambiamos:

[servidor.ejemplo.com]:587 [email protected]:CONTRASEÑA_DEL_CORREO

Regeneramos la base de datos:

sudo postmap hash:/etc/postfix/sasl_passwd

Revisamos:

sudo postfix check

Y reiniciamos:

sudo systemctl restart postfix

Comprobar STARTTLS

Podemos utilizar:

openssl s_client \
  -starttls smtp \
  -connect servidor.ejemplo.com:587 \
  -servername servidor.ejemplo.com \
  -verify_hostname servidor.ejemplo.com \
  -verify_return_error \
  -CAfile /etc/ssl/certs/ca-certificates.crt

La diferencia principal es:

-starttls smtp

Este parámetro solicita negociar TLS mediante STARTTLS.

No debemos utilizar smtp_tls_wrappermode = yes con un servidor que espera STARTTLS convencional por el puerto 587.


PARTE B: CONFIGURAR POSTFIX CON GMAIL

17. ¿Podemos utilizar Gmail en lugar de HostGator?

Sí.

Postfix puede enviar mensajes mediante el servidor SMTP de Gmail, siempre que nuestra cuenta permita el mecanismo de autenticación correspondiente.

La configuración SMTP de Gmail es:

ParámetroValor
Servidorsmtp.gmail.com
Puerto587
SeguridadSTARTTLS
AutenticaciónSí
UsuarioDirección completa de Gmail
ContraseñaContraseña de aplicación, cuando esté disponible

Para cuentas personales compatibles, Google permite utilizar contraseñas de aplicación bajo determinadas condiciones.

Las cuentas administradas por organizaciones pueden tener políticas diferentes.


18. Preparar la cuenta de Gmail

Antes de configurar Postfix debemos comprobar que nuestra cuenta permite utilizar una contraseña de aplicación.

Generalmente necesitaremos tener activada la verificación en dos pasos.

Podemos consultar:

https://myaccount.google.com/apppasswords

Si la opción está disponible, creamos una contraseña de aplicación para nuestro servidor.

Google proporciona una contraseña que utilizaremos exclusivamente para la autenticación SMTP.

No debemos utilizar nuestra contraseña habitual de Google.

Tampoco debemos compartir la contraseña de aplicación ni incluirla en capturas de pantalla, artículos o repositorios públicos.

Si la opción no está disponible, debemos consultar las restricciones de nuestra cuenta. No todas las cuentas admiten este mecanismo.


19. Modificar Postfix para utilizar Gmail

Si ya completamos la configuración de HostGator, no necesitamos reinstalar Postfix.

Solamente cambiaremos el relay y sus credenciales.

Abrimos:

sudo nano /etc/postfix/main.cf

Configuramos:

# ==========================================
# POSTFIX - GMAIL SMTP
# ==========================================

relayhost = [smtp.gmail.com]:587

smtp_sasl_auth_enable = yes

smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

smtp_sasl_security_options = noanonymous, noplaintext

smtp_sasl_tls_security_options = noanonymous

smtp_tls_security_level = secure

smtp_tls_wrappermode = no

smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

smtp_tls_loglevel = 1

El resto de nuestra configuración local puede permanecer igual.

¿Qué cambió?

Servidor SMTP

Antes:

relayhost = [servidor.ejemplo.com]:465

Ahora:

relayhost = [smtp.gmail.com]:587

Tipo de conexión TLS

Antes:

smtp_tls_wrappermode = yes

Ahora:

smtp_tls_wrappermode = no

Esto se debe a que Gmail utilizará STARTTLS en el puerto 587.


20. Configurar las credenciales de Gmail

Abrimos:

sudo nano /etc/postfix/sasl_passwd

Reemplazamos la configuración anterior por:

[smtp.gmail.com]:587 [email protected]:CONTRASEÑA_DE_APLICACION

Debemos utilizar nuestra dirección real y la contraseña de aplicación correspondiente.

Regeneramos la base de datos:

sudo postmap hash:/etc/postfix/sasl_passwd

Verificamos los permisos:

sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

Comprobamos:

sudo postfix check

Reiniciamos:

sudo systemctl restart postfix

Ahora Postfix intentará utilizar Gmail para transmitir los mensajes externos.


21. Comprobar la conexión STARTTLS de Gmail

Ejecutamos:

openssl s_client \
  -starttls smtp \
  -connect smtp.gmail.com:587 \
  -servername smtp.gmail.com \
  -verify_hostname smtp.gmail.com \
  -verify_return_error \
  -CAfile /etc/ssl/certs/ca-certificates.crt

Si la conexión TLS funciona, encontraremos información relacionada con el certificado y la sesión cifrada.

Podemos comprobar si aparece:

Verify return code: 0 (ok)

Esto demuestra que la verificación del certificado fue satisfactoria, pero todavía necesitamos probar el envío autenticado.


22. Enviar un correo utilizando Gmail

Ejecutamos:

echo "Hola, este correo fue enviado desde Debian 13 mediante Postfix y Gmail." \
| mail -r [email protected] \
       -s "Prueba de Postfix con Gmail" \
       [email protected]

Debemos sustituir las direcciones por las nuestras.

Después consultamos:

postqueue -p

Y:

sudo journalctl --since "10 minutes ago" --no-pager | grep -i postfix

Si Gmail acepta el mensaje, Postfix puede registrar:

status=sent

También debemos comprobar el buzón destinatario.

En ocasiones el mensaje puede llegar a la carpeta de spam o ser filtrado por el proveedor.


23. Diferencias entre HostGator y Gmail

Aunque ambos permiten enviar correos, presentan algunas diferencias.

CaracterísticaHostGator o SMTP similarGmail
UsuarioCorreo del dominioCuenta Gmail
ContraseñaContraseña del buzónContraseña de aplicación, si está disponible
ServidorHostname indicado por el proveedorsmtp.gmail.com
Puerto465 o 587 según el servicio587
CifradoTLS implícito o STARTTLSSTARTTLS
RemitenteDirección autorizada del dominioDirección Gmail o alias autorizado
Uso habitualCorreo de sitios y dominiosPruebas y notificaciones de bajo volumen

Para aplicaciones web que utilizan un dominio propio, suele resultar conveniente emplear una cuenta SMTP autorizada para ese dominio.

Para prácticas personales y notificaciones sencillas, Gmail puede ser una alternativa, siempre que sus políticas y límites permitan el uso previsto.


PARTE C: UTILIZAR POSTFIX CON BASH Y PHP

24. ¿Postfix funciona con scripts Bash que utilizan Sendmail?

Sí.

Postfix proporciona una interfaz compatible con el programa Sendmail.

Podemos comprobarla:

ls -l /usr/sbin/sendmail

Y consultar su destino:

readlink -f /usr/sbin/sendmail

Esto no significa que tengamos instalado el MTA Sendmail original.

Significa que Postfix proporciona un ejecutable compatible para recibir mensajes de aplicaciones locales.

24.1. Enviar un correo desde Bash

Creamos:

nano prueba-bash.sh

Agregamos:

#!/usr/bin/env bash

DESTINATARIO="[email protected]"
REMITENTE="[email protected]"

ASUNTO="Prueba Bash con Postfix"

MENSAJE="Este correo fue generado desde un script Bash."

/usr/sbin/sendmail -t -f "$REMITENTE" <<EOF
To: $DESTINATARIO
From: $REMITENTE
Subject: $ASUNTO
Content-Type: text/plain; charset=UTF-8

$MENSAJE
EOF

Si utilizamos HostGator, cambiaremos el remitente por la cuenta autorizada del dominio.

Explicación

#!/usr/bin/env bash indica que el script debe ejecutarse con Bash.

DESTINATARIO, REMITENTE y ASUNTO son variables.

/usr/sbin/sendmail es la interfaz de entrega local.

-t permite obtener los destinatarios de las cabeceras.

-f solicita establecer el remitente del sobre.

<<EOF inicia un documento heredado, también conocido como heredoc.

El contenido entre <<EOF y EOF se envía como entrada al comando.

Debemos utilizar valores de remitente autorizados por nuestro proveedor SMTP.

24.2. Dar permisos de ejecución

Ejecutamos:

chmod 700 prueba-bash.sh

El propietario podrá leer, escribir y ejecutar el archivo.

Después:

./prueba-bash.sh

Ahora Postfix recibirá el mensaje y utilizará el relay SMTP configurado.

¿Y los scripts de alertas, HTML y adjuntos?

También pueden funcionar.

Esto permite reutilizar las prácticas de nuestra guía sobre correos automáticos con Bash:

  • Alertas de almacenamiento.
  • Notificaciones de servicios.
  • Mensajes programados con cron.
  • Correos HTML.
  • Archivos adjuntos.
  • Notificaciones de respaldos.

No necesitamos instalar Sendmail como MTA adicional.


25. Enviar correos desde PHP puro utilizando Postfix

Otra ventaja es que PHP puede utilizar el sistema local de correo mediante la función mail().

Primero instalamos PHP CLI:

sudo apt install php-cli

Comprobamos:

php -v

Ahora consultamos:

php -i | grep -i sendmail_path

Podemos encontrar:

sendmail_path => /usr/sbin/sendmail -t -i

Esto indica que PHP utilizará la interfaz local compatible con Sendmail.

25.1. Crear una prueba PHP

Creamos:

nano prueba-php.php

Agregamos:

<?php

declare(strict_types=1);

$destinatario = "[email protected]";

$remitente = "[email protected]";

$asunto = "Prueba PHP con Postfix";

$mensaje = "Hola.\n\n"
         . "Este correo fue creado desde PHP puro.\n"
         . "Postfix se encarga de procesarlo.";

$cabeceras = [
    "From" => $remitente,
    "Reply-To" => $remitente,
    "Content-Type" => "text/plain; charset=UTF-8"
];

$resultado = mail(
    $destinatario,
    $asunto,
    $mensaje,
    $cabeceras
);

if ($resultado) {

    echo "Mensaje aceptado por el sistema local.\n";

} else {

    echo "No fue posible entregar el mensaje a Postfix.\n";

}

Debemos sustituir el remitente y el destinatario por direcciones reales.

Ejecutamos:

php prueba-php.php

¿Qué hace mail()?

La función mail() entrega el mensaje al mecanismo local de correo configurado en PHP.

En nuestro caso, ese mecanismo utiliza la interfaz compatible con Sendmail que proporciona Postfix.

Si devuelve true, significa que el sistema local aceptó el mensaje para procesarlo.

No garantiza que haya llegado al destinatario.

Para comprobarlo debemos revisar los registros de Postfix.

25.2. ¿Podemos utilizar formularios HTML?

Sí.

El formulario de contacto que desarrollamos en nuestra guía de PHP puro y Sendmail también puede funcionar con Postfix.

No necesitamos cambiar HTML, CSS ni las validaciones por el simple hecho de utilizar otro MTA.

Sin embargo, debemos mantener las protecciones de seguridad:

  • Validación de los campos.
  • Protección contra inyección de cabeceras.
  • Tokens CSRF.
  • Límites de frecuencia.
  • HTTPS.
  • Remitentes y destinatarios controlados.

26. Administrar Postfix desde la terminal

Estos son algunos de los comandos que conviene conocer.

ComandoFunción
sudo systemctl status postfixConsultar el servicio
sudo systemctl restart postfixReiniciar Postfix
sudo systemctl enable postfixHabilitarlo al iniciar Debian
sudo postfix checkComprobar la configuración
postconf -nMostrar parámetros modificados
postqueue -pConsultar mensajes pendientes
sudo postqueue -fSolicitar un nuevo intento de entrega
sudo postmap hash:/etc/postfix/sasl_passwdRegenerar la tabla de credenciales

Podemos consultar el manual:

man postfix

O:

man postconf

Para salir del manual presionamos la tecla q.


27. Solucionar errores frecuentes

27.1. Authentication failed

Este error indica que el servidor SMTP rechazó la autenticación.

Debemos comprobar:

  • Usuario.
  • Contraseña.
  • Puerto.
  • Mecanismos SASL.
  • Coincidencia entre relayhost y sasl_passwd.

En Gmail debemos comprobar que la contraseña de aplicación siga siendo válida.

27.2. No worthy mechs found

Este mensaje puede aparecer cuando Postfix no encuentra un mecanismo de autenticación compatible.

Comprobamos:

dpkg -l | grep libsasl2-modules

Si el paquete no está instalado:

sudo apt install libsasl2-modules

También debemos revisar que TLS se esté negociando correctamente.

27.3. Connection timed out

Significa que la conexión no pudo completarse dentro del tiempo esperado.

Podemos comprobar la resolución DNS:

getent ahosts smtp.gmail.com

También podemos probar el puerto:

openssl s_client -starttls smtp -connect smtp.gmail.com:587

Si la conexión falla, debemos revisar nuestra red, firewall y las restricciones del proveedor.

27.4. Certificate verify failed

Indica un problema de verificación TLS.

Debemos revisar:

  • Nombre del servidor SMTP.
  • Certificado presentado.
  • Autoridades de confianza.
  • Fecha y hora del sistema.

No debemos desactivar la verificación de certificados simplemente para ocultar el error.

27.5. Sender address rejected

Puede ocurrir cuando utilizamos un remitente no autorizado.

Por ejemplo, si nos autenticamos con:

[email protected]

pero intentamos enviar como:

[email protected]

el proveedor podría rechazar el mensaje.

Debemos utilizar remitentes permitidos por nuestra cuenta.

27.6. El correo se queda en la cola

Consultamos:

postqueue -p

Si encontramos mensajes pendientes, revisamos el motivo.

Después de corregir el problema podemos ejecutar:

sudo postqueue -f

Esto solicita un nuevo intento de entrega.

No debemos repetirlo constantemente si el error continúa.


28. Recomendaciones de seguridad

Antes de utilizar Postfix en un servidor conectado a Internet debemos considerar varios aspectos.

No convertir el servidor en un relay abierto

Nuestro servidor no debe permitir que cualquier usuario externo lo utilice para enviar mensajes.

Por eso limitamos las conexiones entrantes a loopback.

Proteger las credenciales

Los archivos:

/etc/postfix/sasl_passwd
/etc/postfix/sasl_passwd.db

deben tener permisos restringidos.

Exigir cifrado

Debemos utilizar TLS y comprobar la identidad del servidor SMTP.

Utilizar remitentes autorizados

El proveedor puede exigir que la dirección utilizada corresponda a la cuenta autenticada o a un alias permitido.

Respetar los límites del proveedor

Los servidores SMTP pueden imponer límites de envío por hora, día o cuenta.

No debemos utilizar cuentas personales para realizar envíos masivos sin verificar sus condiciones.

Mantener el sistema actualizado

Ejecutaremos periódicamente las actualizaciones de seguridad de Debian.


29. Práctica final

Para comprobar que todo funciona realizaremos las siguientes pruebas.

Prueba 1. Comprobar Postfix

sudo postfix check

Prueba 2. Consultar el relay

postconf relayhost

Prueba 3. Comprobar TLS

postconf smtp_tls_security_level smtp_tls_wrappermode

Prueba 4. Enviar desde Mailutils

echo "Prueba final desde Debian 13" \
| mail -s "Postfix funcionando" [email protected]

Para esta prueba es preferible establecer explícitamente un remitente autorizado mediante mail -r cuando sea necesario.

Prueba 5. Ejecutar el script Bash

./prueba-bash.sh

Prueba 6. Ejecutar PHP

php prueba-php.php

Prueba 7. Consultar la cola

postqueue -p

Prueba 8. Consultar registros

sudo journalctl --since "10 minutes ago" --no-pager | grep -i postfix

Finalmente verificaremos que los mensajes hayan llegado a los buzones destinatarios.


Conclusión

En este tutorial aprendimos a instalar Postfix desde cero en Debian 13 y configurarlo para enviar correos electrónicos mediante servidores SMTP externos.

Primero utilizamos una cuenta de HostGator o un proveedor similar, configurando autenticación SASL y cifrado TLS.

Después aprendimos a cambiar el relay para utilizar Gmail mediante STARTTLS por el puerto 587.

También conocimos los archivos principales de Postfix, aprendimos a proteger las credenciales y realizamos pruebas desde la terminal.

Por último, comprobamos que Postfix proporciona una interfaz compatible con Sendmail, lo que permite utilizarlo con scripts Bash y aplicaciones desarrolladas en PHP puro.

Esto nos proporciona una base para automatizar notificaciones, desarrollar formularios de contacto y administrar el correo saliente de nuestros servidores Linux.

OPERSLINUX — Aprende Linux, servidores y programación mediante la práctica.

Deja un comentario