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:
| Paquete | Función |
|---|---|
postfix | Agente de transporte de correo |
mailutils | Herramientas para enviar y consultar correos desde terminal |
libsasl2-modules | Módulos para autenticación SMTP |
ca-certificates | Certificados de autoridades de confianza |
openssl | Herramientas 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ámetro | Ejemplo |
|---|---|
| Servidor SMTP | servidor.ejemplo.com |
| Usuario | [email protected] |
| Contraseña | Contraseña del buzón |
| Puerto | 465 o 587, según el servicio |
| Seguridad | SSL/TLS o STARTTLS |
| Autenticación | Sí |
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ámetro | Valor |
|---|---|
| Servidor | smtp.gmail.com |
| Puerto | 587 |
| Seguridad | STARTTLS |
| Autenticación | Sí |
| Usuario | Dirección completa de Gmail |
| Contraseña | Contraseñ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:
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ística | HostGator o SMTP similar | Gmail |
|---|---|---|
| Usuario | Correo del dominio | Cuenta Gmail |
| Contraseña | Contraseña del buzón | Contraseña de aplicación, si está disponible |
| Servidor | Hostname indicado por el proveedor | smtp.gmail.com |
| Puerto | 465 o 587 según el servicio | 587 |
| Cifrado | TLS implícito o STARTTLS | STARTTLS |
| Remitente | Dirección autorizada del dominio | Dirección Gmail o alias autorizado |
| Uso habitual | Correo de sitios y dominios | Pruebas 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.
| Comando | Función |
|---|---|
sudo systemctl status postfix | Consultar el servicio |
sudo systemctl restart postfix | Reiniciar Postfix |
sudo systemctl enable postfix | Habilitarlo al iniciar Debian |
sudo postfix check | Comprobar la configuración |
postconf -n | Mostrar parámetros modificados |
postqueue -p | Consultar mensajes pendientes |
sudo postqueue -f | Solicitar un nuevo intento de entrega |
sudo postmap hash:/etc/postfix/sasl_passwd | Regenerar 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
relayhostysasl_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.



