Cómo configurar Sendmail con SMTP de HostGator en Debian 13 utilizando STARTTLS

Serie: Sendmail en Debian — Parte 2 de 6
En la primera parte de esta serie aprendimos a instalar Sendmail en Debian 13, configurar el nombre de nuestro equipo, enviar mensajes locales y consultar los buzones desde la terminal.
Ahora daremos el siguiente paso: configurar Sendmail para enviar correos electrónicos a Internet utilizando una cuenta SMTP de nuestro hosting.
Para este tutorial utilizaremos HostGator como ejemplo, aunque el procedimiento puede adaptarse a otros proveedores que permitan autenticación SMTP mediante el puerto 587 y STARTTLS.
Nuestro objetivo será conseguir que Debian utilice una cuenta de correo de nuestro dominio para enviar mensajes a direcciones externas, sin necesidad de configurar un servidor público de correo ni comprar un certificado SSL propio.
Aprenderemos a configurar las credenciales, protegerlas, activar STARTTLS, verificar la conexión y solucionar los errores más frecuentes.
1. ¿Qué necesitamos antes de comenzar?
Para seguir este tutorial debemos haber completado la primera parte de la serie o contar con una instalación funcional de Sendmail.
Necesitaremos:
- Debian GNU/Linux 13.
- Sendmail instalado y funcionando.
- Acceso administrativo mediante
sudo. - Una cuenta de correo creada en HostGator o un proveedor compatible.
- El nombre del servidor SMTP de nuestro hosting.
- Conexión a Internet.
- Acceso al puerto 587 del servidor SMTP, con soporte STARTTLS.
¿Funciona en otras distribuciones?
Los conceptos y parte de los comandos también pueden aplicarse a Debian 12 y distribuciones derivadas como Ubuntu.
En otras familias de Linux, como Fedora, Rocky Linux y AlmaLinux, pueden cambiar los paquetes, las rutas y los procedimientos para regenerar la configuración.
Este tutorial está orientado específicamente a Debian 13 y Sendmail 8.18.1.
2. ¿Qué es un servidor SMTP externo?
SMTP significa Simple Mail Transfer Protocol.
Es el protocolo utilizado para transferir mensajes de correo electrónico.
Cuando enviamos un correo desde una aplicación, el mensaje debe llegar a un servidor que se encargue de procesarlo y transportarlo hacia su destino.
Sendmail puede realizar diferentes funciones, pero en este tutorial lo utilizaremos junto con un servidor SMTP externo, también conocido como smart host.
Nuestro funcionamiento será el siguiente:
┌──────────────────────────────┐
│ Debian 13 │
│ Terminal, Bash o PHP │
└──────────────┬───────────────┘
│
▼
┌──────────────────────────────┐
│ Sendmail │
│ Procesa el mensaje │
└──────────────┬───────────────┘
│
│ SMTP + STARTTLS
│ Puerto 587
▼
┌──────────────────────────────┐
│ Servidor SMTP de HostGator │
│ Autenticación de la cuenta │
└──────────────┬───────────────┘
│
▼
┌──────────────────────────────┐
│ Servidor del destinatario │
│ Gmail, Outlook, etc. │
└──────────────────────────────┘
De esta manera, nuestro equipo no necesita encargarse directamente de entregar mensajes a todos los servidores de correo de Internet.
El proveedor SMTP realiza esa función.
2.1. ¿Qué ventajas tiene?
Utilizar un servidor SMTP externo puede facilitar:
- El envío de notificaciones desde Linux.
- El uso de cuentas de correo de un dominio propio.
- La autenticación mediante usuario y contraseña.
- El envío desde scripts Bash y aplicaciones PHP.
- La administración de mensajes mediante un servicio de correo existente.
Sin embargo, el proveedor puede aplicar límites de envío, filtros antispam y políticas de uso.
También debemos configurar correctamente la identidad del remitente para evitar problemas de autenticación de dominio.
3. ¿Qué es STARTTLS y por qué utilizaremos el puerto 587?
Antes de modificar Sendmail necesitamos comprender cómo protegeremos la conexión.
STARTTLS permite que una sesión SMTP negocie una conexión cifrada mediante TLS.
El puerto 587 se utiliza habitualmente para el envío autenticado de correo electrónico.
Cuando el servidor admite STARTTLS, el cliente puede solicitar el establecimiento de una conexión cifrada antes de transmitir las credenciales.
Puertos SMTP habituales
| Puerto | Uso |
|---|---|
| 25 | Transferencia SMTP entre servidores y determinados servicios. |
| 465 | SMTP mediante TLS implícito. |
| 587 | Envío autenticado, habitualmente mediante STARTTLS. |
En este tutorial utilizaremos:
Puerto: 587
Seguridad: STARTTLS
Autenticación: usuario y contraseña
Verificación del certificado: habilitada
3.1. ¿Necesitamos un certificado SSL propio?
No.
Para conectarnos como clientes a un servidor SMTP de HostGator no necesitamos comprar un certificado ni generar uno propio.
El servidor remoto presenta su certificado TLS.
Nuestro sistema Debian puede comprobarlo utilizando los certificados de autoridades certificadoras de confianza.
Estos certificados normalmente se encuentran en:
/etc/ssl/certs/ca-certificates.crt
Este archivo no contiene la contraseña de nuestro correo.
Contiene certificados de autoridades de confianza utilizados para verificar la identidad de servidores.
Importante: no tener que instalar un certificado propio no significa que debamos desactivar la verificación TLS.
Una conexión cifrada sin verificar correctamente la identidad del servidor puede quedar expuesta a determinados ataques de intermediario.
4. Obtener los datos SMTP de HostGator
Antes de configurar Sendmail debemos conocer los datos reales de nuestro servidor de correo.
No todos los alojamientos utilizan el mismo nombre de servidor.
En HostGator podemos consultar los datos desde cPanel, normalmente en la sección de cuentas de correo y la opción para conectar dispositivos o configurar un cliente de correo.
Buscaremos la configuración manual del servidor saliente SMTP.
Para este tutorial utilizaremos los siguientes datos ficticios:
| Dato | Ejemplo |
|---|---|
| Dirección de correo | [email protected] |
| Servidor SMTP | mail.ejemplo.com |
| Puerto | 587 |
| Seguridad | STARTTLS |
| Usuario SMTP | [email protected] |
| Contraseña | Contraseña de la cuenta de correo |
Debemos reemplazar todos los datos de ejemplo por los correspondientes a nuestro hosting.
HostGator también puede proporcionar un nombre de servidor como mx01.hostgator.mx o un hostname específico de nuestra cuenta.
Es recomendable utilizar el nombre de servidor indicado por el proveedor, especialmente si coincide con el certificado TLS.
Importante sobre HostGator
Aunque HostGator documenta el puerto 587 como opción de envío SMTP en determinados servicios, otras configuraciones oficiales utilizan el puerto 465 con TLS implícito.
Por ello, antes de continuar debemos comprobar que nuestra cuenta específica realmente admite STARTTLS por el puerto 587.
No debemos seleccionar el puerto 587 únicamente porque aparezca en este tutorial.
Si el proveedor no lo admite, esta configuración no será compatible y tendremos que utilizar otro procedimiento.
5. Comprobar que el servidor SMTP responde
Antes de modificar Sendmail comprobaremos la conectividad con nuestro servidor de correo.
Para ello utilizaremos Netcat.
5.1. Instalar Netcat y OpenSSL
Ejecutamos:
sudo apt install netcat-openbsd openssl ca-certificates
Explicación
sudo
Ejecuta el comando con privilegios administrativos.
apt install
Solicita instalar los paquetes indicados.
netcat-openbsd
Proporciona una implementación del comando nc, útil para comprobar conexiones TCP.
openssl
Proporciona herramientas para trabajar con conexiones y certificados TLS.
ca-certificates
Instala el conjunto de certificados de autoridades certificadoras de confianza utilizado por diferentes programas.
5.2. Comprobar el puerto 587
Ejecutamos:
nc -nvz -w 5 mail.ejemplo.com 587
Explicación de cada parámetro
nc
Ejecuta Netcat.
-n
Evita determinadas búsquedas de nombres realizadas por Netcat, aunque el sistema todavía debe resolver el hostname que proporcionamos.
-v
Activa la salida detallada.
-z
Permite comprobar una conexión sin enviar datos de aplicación.
-w 5
Establece un tiempo de espera de cinco segundos.
mail.ejemplo.com
Es el servidor SMTP que deseamos comprobar.
587
Es el puerto TCP de destino.
Resultado esperado
Podemos encontrar un mensaje indicando que la conexión fue establecida correctamente.
Esto significa que el puerto es accesible desde nuestro equipo.
Sin embargo, una conexión TCP exitosa no garantiza que el servidor admita STARTTLS ni que nuestras credenciales sean correctas.
Por eso realizaremos otra prueba.
6. Verificar STARTTLS y el certificado del servidor
Utilizaremos OpenSSL para comprobar que el servidor admite una conexión cifrada.
Ejecutamos:
openssl s_client \
-starttls smtp \
-connect mail.ejemplo.com:587 \
-servername mail.ejemplo.com \
-verify_hostname mail.ejemplo.com \
-verify_return_error \
-brief
Debemos reemplazar todas las apariciones de mail.ejemplo.com por el nombre SMTP real.
6.1. Explicación del comando
openssl
Ejecuta la herramienta OpenSSL.
s_client
Inicia un cliente de prueba para establecer conexiones TLS.
-starttls smtp
Indica que primero debe establecerse una sesión SMTP y posteriormente negociar STARTTLS.
-connect mail.ejemplo.com:587
Indica el servidor y el puerto al que deseamos conectarnos.
-servername mail.ejemplo.com
Envía el nombre del servidor mediante SNI, cuando corresponde.
Esto permite que un servidor que aloja varios servicios pueda presentar el certificado adecuado.
-verify_hostname mail.ejemplo.com
Solicita comprobar que el certificado presentado corresponde al nombre del servidor.
-verify_return_error
Hace que los errores de verificación del certificado provoquen un fallo de la comprobación.
-brief
Muestra un resumen de la conexión.
6.2. Resultado esperado
Una conexión correcta puede mostrar:
Protocol version: TLSv1.3
Verification: OK
También es posible obtener TLS 1.2.
Lo importante es que se negocie una versión TLS segura y que la verificación del certificado sea correcta.
¿Qué pasa si aparece un error de certificado?
No debemos desactivar la verificación.
Primero revisaremos:
- Que el nombre SMTP sea correcto.
- Que el proveedor haya indicado el hostname adecuado.
- Que el certificado no esté caducado.
- Que Debian tenga actualizados sus certificados de confianza.
Si utilizamos mail.ejemplo.com pero el certificado corresponde al hostname real del servidor de HostGator, posiblemente debamos utilizar ese hostname en nuestra configuración.
7. Crear una copia de seguridad de Sendmail
Ahora que comprobamos la conexión, comenzaremos la configuración.
Antes de modificar cualquier archivo importante, realizaremos una copia de seguridad.
Ejecutamos:
sudo cp -a /etc/mail/sendmail.mc /etc/mail/sendmail.mc.bak
Explicación
cp
Copia archivos.
-a
Activa el modo archivo, conservando los atributos que sea posible preservar.
/etc/mail/sendmail.mc
Es el archivo original de configuración.
/etc/mail/sendmail.mc.bak
Es el archivo de respaldo.
La extensión .bak es una convención utilizada para identificar copias de seguridad.
Si cometemos un error, podremos recuperar la configuración anterior.
8. Configurar el servidor SMTP en sendmail.mc
El archivo principal que modificaremos es:
/etc/mail/sendmail.mc
Lo abrimos:
sudo nano /etc/mail/sendmail.mc
8.1. ¿Dónde debemos colocar la configuración?
Dentro del archivo encontraremos comentarios, directivas y definiciones utilizadas por Sendmail.
Buscaremos la sección donde se encuentran las macros define, FEATURE e include.
Debemos colocar nuestra configuración junto a estas directivas, antes de las definiciones de los mailers, normalmente identificadas por instrucciones como:
MAILER(`local')dnl
MAILER(`smtp')dnl
No debemos agregar las directivas nuevas dentro de un bloque LOCAL_CONFIG ni después de las definiciones de mailers sin comprobar el contexto de M4.
¿Qué debemos revisar antes?
Buscaremos si ya existen las siguientes instrucciones:
SMART_HOST
RELAY_MAILER_ARGS
ESMTP_MAILER_ARGS
authinfo
starttls.m4
Si existen, debemos modificarlas o aprovecharlas según corresponda.
No debemos crear varias definiciones activas del mismo smart host.
8.2. Configuración para HostGator
Agregamos o adaptamos estas líneas:
dnl ==================================================
dnl SMTP EXTERNO - HOSTING
dnl ==================================================
include(`/etc/mail/tls/starttls.m4')dnl
define(`SMART_HOST', `[mail.ejemplo.com]')dnl
define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl
FEATURE(`authinfo', `hash -o /etc/mail/auth/client-info.db')dnl
Si include(/etc/mail/tls/starttls.m4′)dnl` ya existe y está activo, no debemos duplicarlo.
La configuración de TLS incluida por Debian debe estar correctamente preparada.
8.3. Explicación de cada línea
dnl
dnl SMTP EXTERNO - HOSTING
dnl significa delete through newline.
Es una instrucción de M4 que descarta el resto de la línea.
Se utiliza frecuentemente para comentarios y para controlar cómo se generan los archivos.
include
include(`/etc/mail/tls/starttls.m4')dnl
Incorpora el contenido de otro archivo de configuración.
En este caso, carga las directivas TLS preparadas por las herramientas de Debian.
SMART_HOST
define(`SMART_HOST', `[mail.ejemplo.com]')dnl
Indica a Sendmail qué servidor utilizará para retransmitir los mensajes externos.
define establece una macro de configuración.
SMART_HOST identifica el servidor de retransmisión.
mail.ejemplo.com es el servidor SMTP.
Los corchetes indican que Sendmail debe utilizar ese host directamente, evitando determinadas consultas MX para seleccionarlo.
Debemos reemplazar:
mail.ejemplo.com
por el hostname SMTP real.
No debemos eliminar los corchetes sin comprender su función.
RELAY_MAILER_ARGS
define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
Establece los argumentos utilizados por el mailer de retransmisión.
TCP indica una conexión TCP.
$h representa el host de destino.
587 indica el puerto.
ESMTP_MAILER_ARGS
define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl
Configura los argumentos del mailer ESMTP.
En esta guía utilizamos el puerto 587 para las rutas SMTP de retransmisión correspondientes.
Esto no significa que Sendmail vaya a utilizar siempre el puerto 587 para cualquier operación imaginable; depende del mailer seleccionado y de las reglas de entrega.
authinfo
FEATURE(`authinfo', `hash -o /etc/mail/auth/client-info.db')dnl
Activa el uso de un mapa de credenciales SMTP.
FEATURE habilita una característica de Sendmail.
authinfo permite consultar información de autenticación para servidores remotos.
hash identifica el formato de la base de datos.
-o indica que el mapa puede tratarse como opcional al abrirse.
/etc/mail/auth/client-info.db es la ruta donde se almacenará la base de datos.
No debemos interpretar -o como una instrucción para enviar mensajes sin autenticación.
El servidor SMTP puede seguir exigiendo usuario y contraseña.
9. Crear el directorio de credenciales SMTP
Ahora configuraremos los datos de acceso de nuestra cuenta de correo.
No guardaremos la contraseña directamente dentro de sendmail.mc.
Utilizaremos un archivo independiente.
Primero creamos un directorio protegido:
sudo install -d -m 700 -o root -g root /etc/mail/auth
Explicación completa
install
Es una herramienta que permite instalar archivos y crear directorios con permisos y propietarios definidos.
-d
Indica que deseamos crear un directorio.
-m 700
Establece los permisos del directorio.
El valor 700 significa que el propietario tiene permisos de lectura, escritura y ejecución, mientras que otros usuarios no tienen acceso.
-o root
Establece root como propietario.
-g root
Establece root como grupo.
/etc/mail/auth
Es la ruta del directorio que deseamos crear.
10. Configurar el usuario y la contraseña SMTP
Abrimos el archivo de credenciales:
sudo nano /etc/mail/auth/client-info
Agregamos:
AuthInfo:mail.ejemplo.com "U:root" "I:[email protected]" "P:CONTRASENA_SMTP" "M:LOGIN"
AuthInfo:[mail.ejemplo.com] "U:root" "I:[email protected]" "P:CONTRASENA_SMTP" "M:LOGIN"
Estas dos entradas permiten contemplar búsquedas del servidor SMTP con y sin corchetes.
10.1. ¿Qué debemos reemplazar?
Debemos reemplazar:
mail.ejemplo.com
Por el servidor SMTP real de HostGator.
Por la dirección de correo completa creada en nuestro hosting.
CONTRASENA_SMTP
Por la contraseña de esa cuenta.
¿Qué no debemos reemplazar?
AuthInfo:
Identifica una entrada de autenticación.
U:root
Establece el identificador de autorización utilizado por Sendmail en esta configuración.
No representa necesariamente al usuario Linux que está enviando el correo.
I:
Identifica el usuario de autenticación SMTP.
P:
Identifica la contraseña.
M:LOGIN
Selecciona el mecanismo de autenticación LOGIN.
Este mecanismo debe ser compatible con el servidor SMTP.
Ejemplo ilustrativo
Si nuestro servidor fuera:
mx01.hostgator.mx
y nuestra cuenta:
[email protected]
utilizaríamos ese hostname y esa dirección en ambas entradas.
La contraseña real debe introducirse únicamente en el archivo protegido.
Nunca debemos compartir capturas de pantalla que muestren la contraseña.
Tampoco debemos subir este archivo a GitHub o incluirlo en respaldos públicos.
Si la contraseña contiene comillas u otros caracteres especiales, debemos revisar su representación en el formato authinfo para evitar que la entrada se interprete incorrectamente.
11. Proteger el archivo de credenciales
El archivo contiene información sensible.
Por ello, modificaremos sus permisos.
Ejecutamos:
sudo chown root:root /etc/mail/auth/client-info
Explicación
chown
Cambia el propietario y el grupo de un archivo.
root:root
Indica que el propietario será root y el grupo será root.
Después:
sudo chmod 600 /etc/mail/auth/client-info
¿Qué significa chmod 600?
chmod
Modifica los permisos de un archivo.
600
Establece:
| Usuario | Lectura | Escritura | Ejecución |
|---|---|---|---|
| Propietario | Sí | Sí | No |
| Grupo | No | No | No |
| Otros | No | No | No |
Esto evita que usuarios normales puedan leer las credenciales.
12. Generar la base de datos de autenticación
Sendmail utiliza mapas de información que pueden almacenarse en bases de datos.
Nuestro archivo client-info contiene las credenciales en formato de texto.
Ahora generaremos la base de datos que Sendmail consultará.
Ejecutamos:
sudo sh -c 'makemap hash /etc/mail/auth/client-info.db < /etc/mail/auth/client-info'
12.1. Explicación de cada elemento
sudo
Ejecuta el comando con privilegios administrativos.
sh
Inicia un intérprete de comandos.
-c
Solicita ejecutar la cadena de comandos indicada.
makemap
Es una herramienta de Sendmail que crea o consulta bases de datos utilizadas por sus mapas.
hash
Indica el formato de base de datos.
/etc/mail/auth/client-info.db
Es el archivo de salida.
<
Es un operador de redirección.
Envía el contenido de un archivo a la entrada estándar del comando.
/etc/mail/auth/client-info
Es el archivo original que contiene nuestras credenciales.
12.2. ¿Por qué utilizamos sudo sh -c?
Podríamos pensar que basta con ejecutar:
sudo makemap hash /etc/mail/auth/client-info.db < /etc/mail/auth/client-info
Sin embargo, este comando puede producir un error de permisos.
Esto ocurre porque la redirección < es procesada por nuestro shell antes de que sudo ejecute makemap.
Si nuestro usuario no puede leer el archivo protegido, la operación fallará.
Al utilizar:
sudo sh -c '...'
el intérprete que procesa la redirección también se ejecuta con privilegios administrativos.
12.3. Proteger la base de datos
Ejecutamos:
sudo chown root:root /etc/mail/auth/client-info.db
sudo chmod 600 /etc/mail/auth/client-info.db
La base de datos también contiene información sensible.
No debemos asumir que el formato .db significa que las contraseñas están cifradas de forma irreversible.
Importante
Cada vez que modifiquemos el usuario o la contraseña del archivo client-info, deberemos regenerar client-info.db.
Modificar solamente el archivo de texto no garantiza que Sendmail utilice las nuevas credenciales.
13. Comprobar la configuración TLS de Sendmail
En Debian, sendmailconfig puede generar:
/etc/mail/tls/starttls.m4
Este archivo contiene directivas relacionadas con TLS.
No necesitamos comprar un certificado para conectarnos a HostGator, pero debemos asegurarnos de que Sendmail pueda verificar el certificado del servidor remoto.
Primero comprobamos que exista el almacén de certificados de Debian:
ls -l /etc/ssl/certs/ca-certificates.crt
Explicación
ls
Muestra información de archivos.
-l
Utiliza el formato largo.
/etc/ssl/certs/ca-certificates.crt
Es la ruta del archivo que deseamos comprobar.
13.1. Configurar el archivo de CA
En sendmail.mc, después de la inclusión de starttls.m4, podemos establecer explícitamente el archivo de autoridades certificadoras:
define(`confCACERT', `/etc/ssl/certs/ca-certificates.crt')dnl
Debemos comprobar que esta definición no quede sobrescrita por otra posterior.
La finalidad es que Sendmail disponga de un archivo adecuado de certificados de confianza.
Importante: esta directiva, por sí sola, no garantiza que cualquier error TLS provoque el rechazo de la entrega. También debemos comprobar la política de verificación aplicada al servidor SMTP.
13.2. Exigir la verificación del servidor remoto
Sendmail permite establecer políticas TLS mediante su mapa de acceso.
Abrimos:
sudo nano /etc/mail/access
Si nuestra configuración de Sendmail tiene habilitada la funcionalidad access_db y las políticas TLS correspondientes, podemos agregar:
TLS_Srv:mail.ejemplo.com VERIFY:128
Debemos sustituir el hostname por el servidor SMTP real.
Esta entrada expresa una política de verificación TLS para el servidor indicado.
Antes de utilizarla debemos comprobar que el mapa access está habilitado en sendmail.mc y que nuestra versión de Sendmail interpreta la regla como esperamos.
No debemos utilizarla como sustituto de una prueba real de conexión.
¿Qué pasa si falla la verificación?
No debemos cambiar la política a una opción permisiva simplemente para conseguir que el mensaje salga.
Primero revisaremos:
- Nombre SMTP.
- Certificado presentado.
- Cadena de confianza.
- Fecha y hora del equipo.
- Certificados de confianza instalados.
14. Regenerar la configuración de Sendmail
Después de modificar sendmail.mc y el mapa de acceso, debemos regenerar los archivos utilizados por Sendmail.
Ejecutamos:
sudo make -C /etc/mail
Explicación
make
Ejecuta las instrucciones definidas en un archivo Makefile.
-C
Indica que debe cambiar al directorio especificado antes de ejecutar las reglas.
/etc/mail
Es el directorio que contiene los archivos de configuración de Sendmail.
Este comando puede regenerar:
/etc/mail/sendmail.cf
y las bases de datos correspondientes.
Si aparece un error, debemos corregirlo antes de continuar.
14.1. Comprobar el smart host
Ejecutamos:
grep '^DS' /etc/mail/sendmail.cf
Explicación
grep
Busca líneas que coinciden con un patrón.
^
Indica el comienzo de la línea.
DS
Es la macro de smart host en el archivo de configuración generado.
Resultado esperado:
DS[mail.ejemplo.com]
Si aparece otro servidor, debemos revisar sendmail.mc.
14.2. Comprobar el certificado de confianza
Ejecutamos:
grep '^O CACertFile=' /etc/mail/sendmail.cf
Buscamos una línea como:
O CACertFile=/etc/ssl/certs/ca-certificates.crt
Esto confirma qué archivo de CA quedó configurado.
No confirma por sí solo que la conexión SMTP esté funcionando.
14.3. Comprobar el mapa TLS
Si agregamos una política en /etc/mail/access, podemos consultar la base de datos:
sudo makemap -u hash /etc/mail/access.db | grep -i 'tls'
Explicación
makemap
Permite trabajar con mapas de Sendmail.
-u
Muestra las entradas de una base de datos existente.
hash
Indica el formato de la base de datos.
/etc/mail/access.db
Es la base de datos que deseamos consultar.
|
Conecta la salida del primer comando con la entrada del segundo.
grep -i 'tls'
Busca las líneas que contienen tls sin distinguir mayúsculas y minúsculas.
Si nuestra entrada se generó correctamente, podremos verla en el resultado.
15. Reiniciar Sendmail
Una vez regenerada la configuración, reiniciamos el servicio:
sudo systemctl restart sendmail
Explicación
systemctl
Administra servicios mediante systemd.
restart
Detiene y vuelve a iniciar el servicio.
sendmail
Es el servicio que deseamos reiniciar.
Después consultamos:
sudo systemctl status sendmail --no-pager
Buscamos:
Active: active (running)
Si aparece un error, revisamos:
sudo journalctl -u sendmail -n 40 --no-pager
Este comando muestra los últimos 40 registros asociados al servicio.
16. Enviar nuestro primer correo utilizando HostGator
Ahora realizaremos una prueba de envío externo.
Utilizaremos una dirección de destino diferente de la cuenta SMTP para facilitar la comprobación.
Por ejemplo, podemos enviar a una cuenta Gmail personal.
Ejecutamos:
/usr/sbin/sendmail -v -t -f [email protected] <<'EOF'
To: [email protected]
From: [email protected]
Subject: Prueba SMTP desde Debian 13
Hola.
Este es un correo de prueba enviado desde Debian 13.
Servidor de envio: HostGator
Puerto SMTP: 587
Seguridad: STARTTLS
Saludos desde Linux.
EOF
Debemos reemplazar [email protected] por nuestra cuenta SMTP y [email protected] por el destinatario real.
16.1. Explicación completa
/usr/sbin/sendmail
Ejecuta Sendmail.
-v
Activa el modo detallado.
-t
Permite obtener los destinatarios de las cabeceras.
Establece el remitente del sobre SMTP.
Debemos utilizar una dirección autorizada por nuestro proveedor.
<<'EOF'
Inicia un bloque de texto que Bash entregará a Sendmail.
To:
Indica el destinatario.
From:
Indica el remitente visible.
Subject:
Establece el asunto.
Línea vacía
Separa las cabeceras del cuerpo del mensaje.
EOF
Finaliza el bloque de texto.
No debemos escribirlo dentro del cuerpo del correo.
17. ¿Cómo sabemos si el mensaje se envió?
El hecho de que el comando termine no garantiza que el mensaje haya llegado.
Debemos revisar los registros.
Ejecutamos:
sudo journalctl -u sendmail -n 50 --no-pager
Buscamos una conexión hacia nuestro servidor SMTP.
Si la negociación TLS fue correcta, podemos encontrar información similar a:
STARTTLS=client,
relay=mail.ejemplo.com,
version=TLSv1.3,
verify=OK
Esto indica que Sendmail estableció una conexión TLS y registró una verificación correcta del certificado.
Después podemos encontrar:
dsn=2.0.0, stat=Sent
¿Qué significa?
dsn=2.0.0
Indica un resultado satisfactorio de entrega al siguiente servidor, de acuerdo con el estado registrado.
stat=Sent
Indica que el servidor SMTP aceptó el mensaje.
Esto no garantiza que el destinatario lo haya recibido en su bandeja principal.
Todavía pueden intervenir filtros antispam, políticas de seguridad y procesos posteriores.
También debemos revisar la carpeta de correo no deseado del destinatario.
18. Consultar la cola de mensajes pendientes
Si el servidor SMTP no acepta el mensaje inmediatamente, Sendmail puede conservarlo temporalmente en una cola.
Ejecutamos:
mailq
Este comando permite consultar mensajes pendientes.
También podemos utilizar:
sudo sendmail -bp
¿Qué significa -bp?
El parámetro -bp solicita mostrar el contenido de la cola.
En algunas configuraciones podemos encontrar:
MSP Queue status...
Si el comando parece quedarse esperando, podemos interrumpirlo con:
Ctrl + C
Esto no elimina automáticamente los mensajes.
Para limitar el tiempo de espera:
timeout 15s mailq
timeout establece un límite de ejecución.
15s representa quince segundos.
mailq es el comando que se ejecutará.
18.1. Reintentar mensajes pendientes
Después de corregir cualquier error de autenticación o conexión, podemos ejecutar:
sudo sendmail -q
El parámetro -q solicita procesar la cola.
No debemos repetirlo continuamente si sabemos que el servidor SMTP está rechazando nuestras credenciales.
Primero debemos resolver la causa del error.
19. Errores frecuentes y sus soluciones
Error 1. El servidor SMTP rechaza las credenciales
Podemos encontrar:
535 Authentication failed
o un mensaje similar.
Esto significa que el servidor SMTP no aceptó la autenticación.
Posibles causas
- Usuario incorrecto.
- Contraseña incorrecta.
- Cuenta suspendida.
- Mecanismo de autenticación incompatible.
- Archivo
client-info.dbdesactualizado. - Restricciones del proveedor.
¿Qué debemos revisar?
Primero verificamos el usuario y la contraseña en:
/etc/mail/auth/client-info
No debemos mostrar su contenido en capturas de pantalla ni compartirlo públicamente.
Después regeneramos la base de datos:
sudo sh -c 'makemap hash /etc/mail/auth/client-info.db < /etc/mail/auth/client-info'
Y reiniciamos:
sudo systemctl restart sendmail
Error 2. No podemos leer client-info
Podemos encontrar:
Permission denied
Si ejecutamos makemap con una redirección desde un shell sin privilegios, el archivo puede resultar inaccesible.
Utilizamos:
sudo sh -c 'makemap hash /etc/mail/auth/client-info.db < /etc/mail/auth/client-info'
Esto permite que la redirección se realice dentro del intérprete ejecutado como administrador.
Error 3. El servidor no responde por el puerto 587
Podemos encontrar:
Connection timed out
Esto puede deberse a:
- Puerto bloqueado.
- Servidor incorrecto.
- Problemas de conectividad.
- Firewall.
- Restricciones del proveedor.
Comprobamos:
nc -nvz -w 5 mail.ejemplo.com 587
Si la conexión falla, debemos comprobar los datos proporcionados por HostGator antes de modificar Sendmail.
Error 4. El certificado TLS no coincide
Podemos encontrar un error de verificación del certificado.
Esto puede ocurrir cuando utilizamos:
mail.ejemplo.com
pero el servidor presenta un certificado para otro hostname.
Solución
Consultar el nombre SMTP recomendado por el proveedor y utilizar el que corresponda al certificado.
No debemos desactivar la verificación TLS.
Error 5. STARTTLS no está disponible
Si el servidor no anuncia STARTTLS en el puerto 587, nuestra configuración segura no podrá continuar de la forma esperada.
Debemos comprobar:
openssl s_client -starttls smtp -connect mail.ejemplo.com:587 -servername mail.ejemplo.com -verify_hostname mail.ejemplo.com -verify_return_error -brief
Si el proveedor solamente admite el puerto 465, necesitaremos una configuración de TLS implícito diferente.
No debemos cambiar únicamente el número de puerto de 587 a 465.
Error 6. Sendmail sigue utilizando otro servidor SMTP
Comprobamos:
grep '^DS' /etc/mail/sendmail.cf
Si aparece un servidor anterior, revisamos sendmail.mc.
Después regeneramos:
sudo make -C /etc/mail
Y reiniciamos:
sudo systemctl restart sendmail
Error 7. El mensaje aparece como Deferred
Podemos encontrar:
stat=Deferred
Esto significa que la entrega quedó pendiente.
No debemos interpretar automáticamente este resultado como una pérdida definitiva del correo.
Sendmail puede reintentar la entrega posteriormente.
Debemos revisar los registros para identificar la causa.
Error 8. No existe /var/log/mail.log
Podemos intentar:
sudo tail -f /var/log/mail.log
Y obtener:
No existe el fichero o el directorio
En algunas instalaciones de Debian, los registros pueden estar disponibles mediante systemd-journald sin que exista un archivo tradicional mail.log.
Por eso utilizaremos:
sudo journalctl -u sendmail -f
El parámetro -f permite observar nuevos registros en tiempo real.
Para salir presionamos Ctrl + C.
20. Recomendaciones de seguridad
Antes de utilizar Sendmail para notificaciones reales, debemos considerar lo siguiente.
Utilizar una cuenta dedicada
Es preferible crear una dirección específica para los mensajes automáticos.
Por ejemplo:
[email protected]
Esto facilita la administración de credenciales y permite separar los mensajes automáticos del correo personal.
Proteger las contraseñas
Los archivos:
/etc/mail/auth/client-info
/etc/mail/auth/client-info.db
deben mantenerse protegidos.
No debemos compartirlos ni incluirlos en repositorios públicos.
Verificar TLS
No basta con que el servidor anuncie STARTTLS.
Debemos comprobar que la conexión esté cifrada y que el certificado presentado corresponda al servidor esperado.
Respetar los límites del hosting
Los servicios de alojamiento pueden establecer límites de envío por hora, por cuenta o por dominio.
Debemos consultar las condiciones de nuestro plan antes de utilizarlo para grandes cantidades de mensajes.
Configurar SPF, DKIM y DMARC
Si utilizamos un dominio propio, debemos revisar los registros DNS relacionados con la autenticación de correo.
SPF permite declarar qué servidores están autorizados a enviar correo para un dominio.
DKIM permite firmar criptográficamente mensajes para verificar determinados aspectos de su autenticidad.
DMARC establece políticas y mecanismos de reporte relacionados con la autenticación y alineación del dominio.
Estos mecanismos ayudan a mejorar la autenticación del correo, aunque no garantizan por sí solos que todos los mensajes lleguen a la bandeja de entrada.
Evitar servidores de retransmisión abiertos
No debemos modificar Sendmail para permitir que cualquier equipo de Internet lo utilice para enviar mensajes.
Nuestro objetivo es utilizarlo como sistema local de envío, conectado a un proveedor SMTP autenticado.
21. Práctica final
Antes de dar por terminada esta segunda parte, comprobaremos nuestra configuración.
Paso 1. Comprobar la conexión SMTP
nc -nvz -w 5 mail.ejemplo.com 587
Paso 2. Verificar STARTTLS
openssl s_client -starttls smtp -connect mail.ejemplo.com:587 -servername mail.ejemplo.com -verify_hostname mail.ejemplo.com -verify_return_error -brief
Paso 3. Comprobar el smart host
grep '^DS' /etc/mail/sendmail.cf
Paso 4. Comprobar que Sendmail está activo
sudo systemctl status sendmail --no-pager
Paso 5. Enviar un mensaje de prueba
echo "Prueba de SMTP desde Debian 13." | mail -s "Prueba OPERSLINUX" [email protected]
Paso 6. Consultar los registros
sudo journalctl -u sendmail -n 50 --no-pager
Paso 7. Comprobar la cola
sudo sendmail -bp
Si el servidor SMTP acepta el mensaje y los registros muestran una entrega satisfactoria, habremos conseguido configurar Sendmail para utilizar un servidor SMTP externo.
Conclusión
En esta segunda parte aprendimos a conectar Sendmail con una cuenta SMTP de un proveedor de hosting.
Comprendimos la función del smart host, configuramos el puerto 587, protegimos las credenciales y revisamos cómo establecer conexiones mediante STARTTLS.
También aprendimos a generar las bases de datos de Sendmail, comprobar la configuración y diagnosticar errores de autenticación, conectividad y certificados.
Una de las ventajas de este procedimiento es que no necesitamos montar un servidor público de correo para enviar notificaciones desde Debian.
Podemos utilizar una cuenta SMTP existente y aprovecharla desde la terminal, scripts Bash o aplicaciones PHP.
¿Qué aprenderemos en la Parte 3?
En el siguiente tutorial aprenderemos a configurar Sendmail con Gmail SMTP utilizando una contraseña de aplicación.
El procedimiento será muy parecido, pero utilizaremos:
Servidor: smtp.gmail.com
Puerto: 587
Seguridad: STARTTLS
También explicaremos cómo resolver el error 535 5.7.8, que puede aparecer cuando Gmail rechaza las credenciales.
De esta manera podremos utilizar Sendmail tanto con cuentas de hosting como con Gmail, sin tener que comenzar la configuración desde cero.
OPERSLINUX — Aprende Linux, servidores y programación mediante la práctica.



