Enviar correos y solucionar errores de Sendmail en Debian 13: guía de administración

Serie: Sendmail en Debian — Parte 4 de 6
En las primeras tres partes de esta serie aprendimos a instalar Sendmail en Debian 13, configurar un servidor SMTP de hosting y utilizar Gmail para enviar mensajes mediante STARTTLS.
Ahora que Sendmail está funcionando, aprenderemos a administrarlo.
En este tutorial veremos cómo enviar y leer mensajes desde la terminal, comprobar si realmente fueron aceptados por un servidor SMTP, consultar las colas de correo, interpretar registros y solucionar errores de conexión, autenticación y resolución DNS.
También analizaremos situaciones reales que encontramos durante nuestras pruebas, como un comando mailq que parecía no terminar, un archivo /var/log/mail.log inexistente y advertencias relacionadas con el nombre del equipo.
El objetivo no será memorizar comandos, sino comprender qué hace Sendmail y cómo investigar un problema antes de modificar su configuración.
1. Requisitos para continuar
Este tutorial está preparado para Debian GNU/Linux 13 y Sendmail 8.18.1.
También puede resultar útil en Debian 12 y distribuciones derivadas como Ubuntu, aunque algunas rutas, versiones y herramientas pueden variar.
Necesitaremos tener instalado:
- Sendmail, como agente de transporte de correo.
- Mailutils, para enviar y consultar mensajes.
- OpenSSL, para comprobar conexiones TLS.
- Netcat, para diagnosticar puertos.
- Acceso administrativo mediante
sudo.
Podemos instalar las herramientas necesarias ejecutando:
sudo apt update
sudo apt install sendmail mailutils openssl netcat-openbsd dnsutils
¿Qué significa cada comando?
sudo permite ejecutar una instrucción con privilegios administrativos.
apt es el administrador de paquetes utilizado por Debian.
update actualiza la información local de los paquetes disponibles en los repositorios. No actualiza automáticamente todos los programas instalados.
install solicita instalar los paquetes indicados.
sendmail proporciona el agente de transporte de correo.
mailutils proporciona herramientas para enviar y consultar mensajes.
openssl permite comprobar conexiones y certificados TLS.
netcat-openbsd proporciona el comando nc.
dnsutils proporciona herramientas como dig, útiles para diagnosticar DNS.
Si ya tenemos estos paquetes instalados, APT nos informará que no necesita instalarlos nuevamente.
2. Comprender cómo viaja un correo desde Debian
Antes de comenzar, debemos entender algo importante: ejecutar un comando para enviar un correo no significa necesariamente que el mensaje haya llegado a su destinatario.
El proceso puede dividirse en varias etapas.
┌────────────────────────────┐
│ Usuario o aplicación │
│ mail, Bash, PHP, etc. │
└─────────────┬──────────────┘
│
▼
┌────────────────────────────┐
│ Sendmail │
│ Recibe el mensaje │
└─────────────┬──────────────┘
│
▼
┌────────────────────────────┐
│ Cola de mensajes │
│ Procesamiento y reintentos │
└─────────────┬──────────────┘
│
▼
┌────────────────────────────┐
│ Servidor SMTP externo │
│ Gmail o hosting │
└─────────────┬──────────────┘
│
▼
┌────────────────────────────┐
│ Servidor del destinatario │
└─────────────┬──────────────┘
│
▼
┌────────────────────────────┐
│ Buzón del destinatario │
└────────────────────────────┘
Por ejemplo, cuando ejecutamos mail, el programa puede entregar correctamente el mensaje al sistema local.
Sin embargo, Sendmail todavía debe establecer una conexión con el servidor SMTP externo.
Durante esa conexión pueden presentarse problemas de autenticación, DNS, certificados o conectividad.
Por eso aprenderemos a comprobar cada etapa.
3. Comprobar que Sendmail está funcionando
Primero verificaremos el estado del servicio.
Ejecutamos:
sudo systemctl status sendmail --no-pager
Explicación
systemctl es la herramienta utilizada para administrar servicios mediante systemd.
status solicita información sobre el estado de un servicio.
sendmail identifica el servicio que deseamos consultar.
--no-pager muestra el resultado directamente en la terminal, sin abrir un visor interactivo como less.
Podemos encontrar:
Active: active (running)
Esto indica que el servicio está activo.
Si encontramos:
Active: failed
significa que el servicio ha fallado.
Para intentar iniciarlo:
sudo systemctl start sendmail
start inicia el servicio si está detenido.
Si modificamos su configuración, podemos reiniciarlo:
sudo systemctl restart sendmail
restart detiene y vuelve a iniciar el servicio.
No debemos reiniciar Sendmail continuamente cuando tenemos un problema. Primero conviene consultar sus registros.
4. Enviar un correo sencillo con mail
Comenzaremos utilizando uno de los métodos más fáciles.
Ejecutamos:
echo "Hola, este es un correo enviado desde Debian 13." | mail -s "Prueba de Sendmail" [email protected]
Debemos reemplazar [email protected] por una dirección real.
Explicación completa
echo imprime el texto que escribimos entre comillas.
"Hola, este es un correo enviado desde Debian 13." será el contenido del mensaje.
| es una tubería o pipe. Conecta la salida estándar del comando de la izquierda con la entrada estándar del comando de la derecha.
mail ejecuta el cliente de correo de Mailutils.
-s establece el asunto del mensaje.
"Prueba de Sendmail" es el asunto.
[email protected] es el destinatario.
¿Por qué el comando termina sin mostrar nada?
Es normal que mail no muestre una confirmación de entrega.
Eso significa que debemos comprobar qué ocurrió después.
También debemos recordar que el remitente predeterminado puede ser nuestro usuario local, como [email protected], y no necesariamente la cuenta Gmail o de hosting configurada.
Algunos proveedores pueden rechazar o modificar remitentes que no estén autorizados.
5. Enviar un correo interactivo
También podemos escribir un mensaje directamente desde la terminal.
Ejecutamos:
mail -s "Correo interactivo" [email protected]
La terminal quedará esperando el cuerpo del mensaje.
Escribimos:
Hola.
Estoy aprendiendo a enviar correos desde Debian.
Este mensaje fue escrito directamente desde la terminal.
Para finalizar, presionamos:
Ctrl + D
Esta combinación envía una señal de fin de entrada (EOF) al programa.
No debemos confundirla con Ctrl + C, que normalmente interrumpe la ejecución.
Dependiendo de la configuración del cliente, el mensaje será entregado al sistema de correo local para su procesamiento.
6. Enviar correos con sendmail -v
Ahora utilizaremos directamente Sendmail.
Este método nos permitirá obtener información más detallada.
Ejecutamos:
/usr/sbin/sendmail -v -t -f [email protected] <<'EOF'
To: [email protected]
From: [email protected]
Subject: Prueba detallada de Sendmail
Hola.
Este correo fue enviado desde Debian 13
utilizando Sendmail y un servidor SMTP externo.
Saludos desde Linux.
EOF
Debemos reemplazar [email protected] por la dirección autorizada de nuestro servidor SMTP y [email protected] por el destinatario.
Si utilizamos HostGator, colocaremos la dirección de correo correspondiente a nuestro hosting.
6.1. Explicación de los parámetros
/usr/sbin/sendmail es la ruta del ejecutable de Sendmail.
-v activa el modo detallado, también conocido como verbose. Permite observar información sobre el procesamiento del mensaje.
-t indica que los destinatarios se obtendrán de las cabeceras del mensaje, como To:, Cc: y Bcc:.
-f [email protected] establece el remitente del sobre SMTP. Es diferente de la cabecera visible From:. Según la configuración, Sendmail puede restringir quién tiene permitido establecer este valor.
<<'EOF' es una redirección de Bash denominada here-document.
Todo el texto que escribamos hasta encontrar una línea que contenga únicamente EOF será enviado a la entrada estándar de Sendmail.
Las comillas alrededor de 'EOF' impiden que Bash expanda variables y sustituciones de comandos dentro del bloque.
To: indica el destinatario.
From: establece el remitente visible.
Subject: define el asunto.
La línea vacía después de Subject: separa las cabeceras del cuerpo del mensaje.
EOF finaliza el bloque.
¿Qué pasa si no termina el comando?
Si olvidamos escribir EOF, Bash continuará esperando más texto.
Debemos escribir EOF en una línea independiente y presionar Enter.
Si queremos cancelar la operación, podemos presionar Ctrl + C.
7. Interpretar la conversación SMTP
Al utilizar sendmail -v podemos observar respuestas como las siguientes:
220 debian ESMTP Sendmail
>>> EHLO debian
250-debian Hello localhost
>>> MAIL From:<systemx@debian>
250 2.1.0 Sender ok
>>> RCPT To:<[email protected]>
250 2.1.5 Recipient ok
>>> DATA
354 End data with <CR><LF>.<CR><LF>
>>> .
Esta información representa una conversación entre componentes SMTP.
Es importante comprender qué significa cada parte.
7.1. Código 220
220 debian ESMTP Sendmail
El servidor informa que está preparado para aceptar una conexión SMTP.
7.2. Comando EHLO
>>> EHLO debian
El cliente se presenta ante el servidor.
EHLO también permite solicitar las capacidades ESMTP disponibles.
El servidor puede responder con características como STARTTLS, AUTH, SIZE o PIPELINING.
7.3. MAIL FROM
>>> MAIL From:<systemx@debian>
Indica el remitente del sobre SMTP.
No debe confundirse con la cabecera visible From:.
7.4. RCPT TO
>>> RCPT To:<[email protected]>
Indica el destinatario del sobre SMTP.
Una respuesta 250 significa que el servidor aceptó ese destinatario para la transacción actual.
No garantiza que el mensaje llegue a su bandeja de entrada.
7.5. DATA
>>> DATA
354 End data with <CR><LF>.<CR><LF>
El servidor está preparado para recibir el contenido del mensaje.
La secuencia <CR><LF>.<CR><LF> representa una línea que contiene solamente un punto, delimitada por los finales de línea correspondientes.
Sendmail se encarga de transmitir esta secuencia cuando corresponde.
¿Qué significa >>> .?
Indica que el cliente ha enviado el punto que finaliza el contenido SMTP.
Después debemos esperar la respuesta del servidor.
Importante: si esta conversación ocurre entre nuestro cliente local y Sendmail en 127.0.0.1, todavía no demuestra que Gmail o HostGator hayan aceptado el correo.
Debemos comprobar también la entrega hacia el servidor externo.
8. Leer correos locales desde la terminal
Sendmail no solamente permite enviar mensajes externos.
También puede entregar mensajes a usuarios locales de Debian.
Estos mensajes pueden utilizarse para notificaciones del sistema, tareas programadas y avisos administrativos.
Por ejemplo, podemos enviar un mensaje al usuario root:
echo "Mensaje de prueba para el administrador." | mail -s "Aviso local" root
El destinatario root identifica una cuenta local, siempre que la configuración de entrega y los alias lo permitan.
8.1. Consultar nuestro buzón
Ejecutamos:
mail
El programa abrirá el buzón del usuario actual.
Para consultar el buzón de root:
sudo mail -u root
Explicación
sudo permite ejecutar el programa con los permisos necesarios para acceder al buzón de root.
mail abre el cliente de correo.
-u root indica que deseamos consultar el buzón del usuario root.
En Debian, el buzón local puede encontrarse en:
/var/mail/root
8.2. Comprender la pantalla de mensajes
Podemos obtener:
"/var/mail/root": 1 mensaje 1 nuevo
>N 1 systemx dom nov 8 13:52 15/558 Prueba de Sendmail
?
Veamos cada elemento.
/var/mail/root es el archivo del buzón.
1 mensaje 1 nuevo indica cuántos mensajes contiene y cuántos son nuevos.
> señala el mensaje seleccionado.
N indica que el mensaje es nuevo.
1 es el número del mensaje.
systemx es el remitente mostrado.
dom nov 8 13:52 indica la fecha y hora.
15/558 muestra información de líneas y tamaño.
Prueba de Sendmail es el asunto.
? significa que el programa está esperando una instrucción.
No estamos nuevamente en la terminal normal de Bash.
Estamos dentro del cliente interactivo mail.
9. Comandos para leer, guardar y eliminar mensajes
Cuando aparece el símbolo:
?
podemos escribir comandos propios de Mailutils.
| Comando | Función |
|---|---|
headers | Mostrar la lista de mensajes. |
print 1 | Leer el mensaje número 1. |
1 | Seleccionar y mostrar el mensaje 1. |
next | Avanzar al siguiente mensaje. |
delete 1 | Marcar el mensaje 1 para eliminarlo. |
undelete 1 | Deshacer la marca de eliminación. |
save 1 archivo.mbox | Guardar el mensaje en un archivo de buzón. |
quit | Salir aplicando los cambios correspondientes. |
exit | Salir sin modificar el estado del buzón. |
help | Consultar la ayuda. |
9.1. Leer un mensaje completo
Si tenemos un mensaje número 1, escribimos:
? print 1
El programa mostrará sus cabeceras y contenido.
También podemos escribir:
? 1
Esto permite seleccionar el mensaje.
9.2. Eliminar un mensaje
Escribimos:
? delete 1
Esto marca el mensaje para eliminación.
Para deshacerlo antes de salir:
? undelete 1
9.3. Salir correctamente
Si escribimos:
? quit
Mailutils cerrará la sesión y aplicará las acciones correspondientes.
Los mensajes leídos pueden moverse a un archivo mbox, dependiendo de la configuración.
Si queremos salir sin modificar el buzón:
? exit
Esta diferencia es importante cuando solamente deseamos inspeccionar los mensajes.
9.4. Leer sin cambiar el estado del buzón
También podemos ejecutar:
sudo mail -u root -p
El parámetro -p, en GNU Mailutils, muestra los mensajes en la salida estándar sin cambiar su estado.
Esto resulta útil cuando queremos revisar el contenido sin entrar al modo interactivo.
10. ¿Qué es la cola de correos de Sendmail?
Cuando Sendmail recibe un mensaje que todavía no puede entregar, puede conservarlo en una cola.
Esto permite realizar reintentos posteriores.
Por ejemplo, si Gmail rechaza temporalmente una conexión, Sendmail puede mantener el mensaje pendiente.
La cola no debe confundirse con el buzón local.
Buzón: contiene mensajes recibidos para un usuario.
Cola: contiene mensajes que todavía deben procesarse o entregarse.
11. Consultar la cola con mailq
Ejecutamos:
mailq
Este comando muestra información sobre mensajes pendientes.
Sin embargo, en Debian podemos encontrar una situación como esta:
MSP Queue status...
Y después parece que no ocurre nada.
Esto puede suceder mientras se inspeccionan las colas o cuando alguna operación tarda más de lo esperado.
No significa automáticamente que Sendmail esté bloqueado.
11.1. ¿Qué significa MSP?
MSP significa Mail Submission Program.
Sendmail puede utilizar un componente de envío local y otro encargado del transporte.
Por eso pueden existir colas diferenciadas.
Una es la cola de envío local, asociada al MSP.
Otra es la cola del MTA, encargado del transporte.
11.2. Consultar la cola del MTA
Ejecutamos:
sudo sendmail -bp
Explicación
sudo ejecuta el comando con permisos administrativos.
sendmail ejecuta Sendmail.
-bp solicita mostrar la cola de mensajes.
En la implementación de Sendmail, mailq equivale a solicitar la visualización de la cola mediante sendmail -bp, aunque las opciones y el contexto de ejecución pueden influir en qué cola se consulta.
Para consultar explícitamente la cola MSP:
sudo sendmail -Ac -bp
-Ac selecciona la configuración de envío definida en submit.cf.
-bp muestra los mensajes pendientes.
11.3. Evitar esperas demasiado largas
Podemos ejecutar:
timeout 15s mailq
Explicación
timeout ejecuta un programa con un límite de tiempo.
15s indica quince segundos.
mailq es el comando que deseamos ejecutar.
Si supera el tiempo establecido, timeout intenta terminarlo.
También podemos utilizar:
timeout 15s sudo sendmail -bp
Si el comando no termina, podemos investigar el estado del servicio y los registros.
No debemos borrar archivos de la cola manualmente para intentar resolverlo.
12. Comprender un mensaje pendiente
Una cola puede mostrar información similar a:
6A8Jtr2g003627 576 Sun Nov 8 14:00 <systemx@debian>
(Deferred: Connection timed out)
<[email protected]>
Los datos son ilustrativos.
Identificador del mensaje
6A8Jtr2g003627
Es el identificador interno utilizado por Sendmail.
Nos permite buscar información relacionada con el mensaje en los registros.
Tamaño
576
Indica el tamaño del mensaje en bytes.
Remitente
<systemx@debian>
Es el remitente del sobre SMTP.
Estado
Deferred: Connection timed out
Indica que el mensaje quedó pendiente debido a un problema de conexión.
Destinatario
<[email protected]>
Es la dirección a la que intentamos entregar el mensaje.
13. Reintentar mensajes pendientes
Si ya corregimos el problema, podemos solicitar un nuevo procesamiento de la cola.
Ejecutamos:
sudo sendmail -q
Explicación
sudo ejecuta Sendmail con privilegios administrativos.
sendmail inicia el programa.
-q solicita procesar la cola.
También podemos utilizar:
sudo sendmail -q -v
El parámetro -v activa la salida detallada.
Esto permite observar información adicional durante el procesamiento.
¿Cuándo debemos utilizarlo?
Por ejemplo, después de corregir una contraseña SMTP incorrecta.
No conviene repetir este comando constantemente si el servidor continúa rechazando las credenciales.
Primero debemos solucionar el problema que impide la entrega.
14. Consultar los registros de Sendmail con journalctl
Los registros son una de las herramientas más importantes para administrar un servidor de correo.
En ellos podemos encontrar información sobre:
- Inicio y detención del servicio.
- Conexiones SMTP.
- Negociación STARTTLS.
- Autenticación.
- Mensajes aceptados.
- Mensajes pendientes.
- Errores DNS.
- Problemas de conexión.
Para consultar los últimos registros:
sudo journalctl -u sendmail -n 50 --no-pager
Explicación completa
journalctl permite consultar los registros administrados por systemd-journald.
-u sendmail filtra los registros asociados a la unidad sendmail.
-n 50 solicita los últimos 50 registros.
--no-pager muestra el resultado directamente en la terminal.
14.1. Ver registros en tiempo real
Ejecutamos:
sudo journalctl -u sendmail -f
-f significa follow.
Permite seguir los nuevos registros conforme aparecen.
Podemos dejar esta terminal abierta y enviar un correo desde otra terminal.
Así observaremos cómo Sendmail procesa el mensaje.
Para salir:
Ctrl + C
14.2. Consultar registros recientes
Ejecutamos:
sudo journalctl -u sendmail --since "10 minutes ago" --no-pager
--since establece el momento a partir del cual queremos consultar registros.
"10 minutes ago" es una expresión relativa de tiempo.
Esto resulta útil después de realizar una prueba.
14.3. Buscar errores concretos
Ejecutamos:
sudo journalctl -u sendmail --no-pager | grep -Ei 'error|failed|deferred|reject|535'
Explicación
| conecta la salida de journalctl con grep.
grep busca coincidencias de texto.
-E permite utilizar expresiones regulares extendidas.
-i ignora diferencias entre mayúsculas y minúsculas.
'error|failed|deferred|reject|535' busca cualquiera de los términos separados por |.
Este comando ayuda a localizar errores, aunque no sustituye la lectura de los registros completos.
15. ¿Por qué no existe /var/log/mail.log?
Durante nuestras pruebas intentamos ejecutar:
sudo tail -f /var/log/mail.log
Y encontramos:
tail: no se puede abrir '/var/log/mail.log' para lectura:
No existe el fichero o el directorio
Esto puede ocurrir cuando el sistema no está configurado para escribir los registros de correo en ese archivo.
En Debian, los mensajes pueden estar disponibles mediante journald sin que exista necesariamente /var/log/mail.log.
Por ello, nuestra alternativa será:
sudo journalctl -u sendmail -f
También podemos consultar los registros generales buscando los identificadores de Sendmail:
sudo journalctl -t sm-mta -n 50 --no-pager
Explicación
-t sm-mta filtra los mensajes cuyo identificador de syslog es sm-mta.
-n 50 muestra los últimos 50 registros.
--no-pager evita abrir un visor interactivo.
Esto puede resultar útil porque no todos los mensajes de Sendmail tienen que aparecer necesariamente bajo la misma unidad de systemd.
¿Podemos activar mail.log?
Sí, mediante un servicio de registro como rsyslog y la configuración correspondiente.
Sin embargo, no es necesario instalarlo únicamente para consultar los registros de Sendmail si journalctl ya proporciona la información necesaria.
16. Interpretar una entrega correcta
En nuestras pruebas con Gmail obtuvimos registros similares a:
STARTTLS=client,
relay=smtp.gmail.com.,
version=TLSv1.3,
verify=OK,
cipher=TLS_AES_256_GCM_SHA384,
bits=256/256
Este resultado proporciona información sobre la conexión TLS.
STARTTLS=client
Indica que Sendmail está actuando como cliente TLS.
relay=smtp.gmail.com
Identifica el servidor remoto.
version=TLSv1.3
Indica la versión de TLS negociada.
verify=OK
Indica que Sendmail registró una verificación satisfactoria del certificado.
cipher
Identifica el conjunto criptográfico utilizado.
bits
Proporciona información sobre la fortaleza criptográfica de la conexión.
Después encontramos:
to=<[email protected]>,
relay=smtp.gmail.com.,
dsn=2.0.0,
stat=Sent (OK ... - gsmtp)
¿Qué significa dsn=2.0.0?
Es un código de estado de entrega satisfactorio.
¿Qué significa stat=Sent?
Indica que Sendmail registró una entrega satisfactoria al siguiente servidor.
En este ejemplo, Gmail aceptó el mensaje.
Esto no garantiza que el correo haya llegado a la bandeja de entrada final.
El mensaje todavía puede pasar por filtros antispam y otros procesos del servidor destinatario.
17. Comprender los códigos SMTP
Los servidores SMTP utilizan códigos numéricos para indicar el resultado de las operaciones.
Generalmente, el primer dígito nos ayuda a identificar el tipo de respuesta.
| Código | Significado general |
|---|---|
| 2xx | Operación completada correctamente. |
| 3xx | El servidor necesita información adicional. |
| 4xx | Error temporal. |
| 5xx | Error permanente para la operación solicitada. |
Algunos códigos habituales son:
| Código | Interpretación |
|---|---|
| 220 | Servicio SMTP preparado. |
| 221 | El servidor está cerrando la conexión. |
| 235 | Autenticación satisfactoria. |
| 250 | Operación aceptada. |
| 334 | El servidor solicita continuar la autenticación. |
| 354 | El servidor está preparado para recibir el contenido. |
| 421 | Servicio no disponible temporalmente. |
| 450 | Buzón o recurso temporalmente no disponible. |
| 451 | Error temporal de procesamiento. |
| 452 | Recursos insuficientes temporalmente. |
| 535 | Error de autenticación. |
| 550 | Operación rechazada, por ejemplo por destinatario inexistente o política del servidor. |
| 552 | Se ha excedido un límite de almacenamiento o tamaño. |
| 554 | Transacción rechazada. |
Los códigos pueden acompañarse de códigos de estado mejorados, como 5.7.8.
Por eso siempre debemos leer el mensaje completo del servidor.
18. Solucionar el error 535 5.7.8
Uno de los errores que encontramos al configurar Gmail fue:
535 5.7.8 Username and Password not accepted
Esto indica que Gmail no aceptó la autenticación.
Posibles causas
- Usuario incorrecto.
- Contraseña incorrecta.
- Contraseña de aplicación revocada.
- Uso de la contraseña normal de Google.
- Base de datos
authinfodesactualizada. - Restricciones de seguridad de la cuenta.
18.1. Revisar las credenciales
Abrimos:
sudo nano /etc/mail/auth/client-info
Debemos revisar el usuario y la contraseña, pero nunca compartir el contenido de este archivo.
Si realizamos cambios, regeneramos la base de datos:
sudo sh -c 'makemap hash /etc/mail/auth/client-info.db < /etc/mail/auth/client-info'
Explicación
sudo ejecuta con privilegios administrativos.
sh inicia un intérprete de comandos.
-c solicita ejecutar la cadena indicada.
makemap genera un mapa de Sendmail.
hash especifica el formato.
client-info.db es la base de datos de salida.
< redirige el contenido del archivo de texto hacia makemap.
Después comprobamos que la base de datos tenga permisos adecuados:
sudo chmod 600 /etc/mail/auth/client-info.db
chmod modifica permisos.
600 permite lectura y escritura únicamente al propietario.
Finalmente reiniciamos:
sudo systemctl restart sendmail
Después repetimos el envío de prueba y consultamos los registros.
19. Diagnosticar problemas de puertos SMTP
Si Sendmail no consigue conectarse al servidor SMTP, primero debemos comprobar la conectividad.
Para Gmail:
nc -vz -w 5 smtp.gmail.com 587
Explicación
nc ejecuta Netcat.
-v activa la salida detallada.
-z comprueba la conectividad sin enviar datos de aplicación.
-w 5 establece un tiempo de espera de cinco segundos.
smtp.gmail.com es el servidor.
587 es el puerto TCP.
Para un servidor de hosting:
nc -vz -w 5 mail.ejemplo.com 587
Debemos reemplazar mail.ejemplo.com por el hostname real de nuestro proveedor.
Posibles resultados
Connection succeeded: se pudo establecer una conexión TCP.
Connection refused: el destino rechazó la conexión.
Connection timed out: la conexión no se completó dentro del tiempo esperado.
Un puerto accesible no garantiza que el servidor acepte nuestras credenciales ni que STARTTLS funcione.
20. Verificar STARTTLS y el certificado
Para comprobar el servidor SMTP de Gmail:
openssl s_client \
-starttls smtp \
-connect smtp.gmail.com:587 \
-servername smtp.gmail.com \
-verify_hostname smtp.gmail.com \
-verify_return_error \
-brief
Explicación
openssl ejecuta OpenSSL.
s_client inicia un cliente de prueba TLS.
-starttls smtp solicita negociar STARTTLS sobre SMTP.
-connect establece el servidor y puerto.
-servername indica el hostname mediante SNI.
-verify_hostname comprueba que el certificado corresponda al hostname esperado.
-verify_return_error hace que los errores de verificación provoquen un fallo.
-brief muestra un resumen.
Podemos encontrar:
Protocol version: TLSv1.3
Verification: OK
Esto indica que la prueba TLS fue satisfactoria.
Si aparece un error de certificado, debemos revisar el hostname, la fecha del sistema y los certificados de confianza.
No debemos desactivar la verificación simplemente para conseguir una conexión.
21. Diagnosticar problemas DNS
DNS permite convertir nombres de dominio en direcciones IP y realizar otras consultas necesarias para los servicios de correo.
Por ejemplo, podemos comprobar la resolución de Gmail:
getent ahosts smtp.gmail.com
Explicación
getent consulta bases de datos de nombres mediante los mecanismos configurados en el sistema.
ahosts solicita direcciones de host utilizando la resolución de nombres del sistema.
smtp.gmail.com es el hostname que deseamos resolver.
También podemos utilizar:
dig smtp.gmail.com A
Explicación
dig realiza consultas DNS.
smtp.gmail.com es el nombre consultado.
A solicita registros IPv4.
Para consultar registros IPv6:
dig smtp.gmail.com AAAA
AAAA identifica registros IPv6.
21.1. Consultar los registros MX
Si queremos conocer los servidores responsables de recibir correo para un dominio, ejecutamos:
dig gmail.com MX
MX solicita registros de intercambio de correo.
Es importante comprender que los registros MX se utilizan para identificar servidores receptores de correo.
No debemos asumir que el servidor MX de Gmail es el servidor que debemos utilizar para enviar mensajes autenticados.
Para enviar mediante Gmail utilizaremos:
smtp.gmail.com:587
22. ¿Qué significa DNS fwd/rev mismatch?
Durante nuestras pruebas ejecutamos:
nc -vz gmail-smtp-in.l.google.com 25
Y encontramos una advertencia similar a:
DNS fwd/rev mismatch:
gmail-smtp-in.l.google.com != lcdfwe-in-f27.1e100.net
Esto significa que Netcat detectó una diferencia entre los nombres obtenidos mediante determinadas comprobaciones de resolución directa e inversa.
No significa automáticamente que el servidor sea malicioso ni que exista un fallo de Sendmail.
Además, estábamos comprobando el puerto 25 de un servidor receptor de correo, no el puerto 587 del servicio SMTP autenticado de Gmail.
¿Qué debemos hacer?
Para nuestro objetivo, lo correcto es comprobar:
nc -vz -w 5 smtp.gmail.com 587
Si queremos evitar determinadas búsquedas inversas realizadas por Netcat:
nc -nvz -w 5 smtp.gmail.com 587
El parámetro -n evita búsquedas de nombres adicionales realizadas por Netcat, aunque el hostname proporcionado todavía necesita resolverse.
Esto puede reducir advertencias relacionadas con la resolución inversa.
23. Resolver problemas con el hostname de Debian
Durante la instalación inicial encontramos:
WARNING: local host name (debian) is not qualified
También observamos:
My unqualified host name (debian) unknown;
sleeping for retry
Sendmail intenta determinar la identidad de nuestro equipo.
Si solamente encuentra el nombre corto debian, puede generar advertencias.
23.1. Comprobar el nombre del equipo
Ejecutamos:
hostname
Este comando muestra el nombre del equipo.
Después:
hostname -f
El parámetro -f solicita mostrar el nombre de dominio completo o FQDN, cuando puede resolverse correctamente.
Inicialmente podemos encontrar:
debian
debian
Esto indica que el nombre completo no se está resolviendo como esperamos.
23.2. Revisar /etc/hosts
Abrimos:
sudo nano /etc/hosts
En nuestro laboratorio utilizamos una entrada como:
127.0.1.1 debian.lab.test debian
¿Qué significa?
127.0.1.1 es una dirección de loopback utilizada habitualmente en configuraciones locales de Debian.
debian.lab.test es un nombre completo de ejemplo utilizado dentro del laboratorio.
debian es el nombre corto del equipo.
El dominio .test está reservado para pruebas y no representa un dominio público.
Esta configuración permite resolver localmente el nombre completo del equipo.
No debemos eliminar las entradas de localhost ni modificar direcciones sin comprender su función.
23.3. Comprobar el resultado
Ejecutamos:
hostname -f
Resultado esperado en nuestro ejemplo:
debian.lab.test
También:
getent hosts debian
Podemos encontrar:
127.0.1.1 debian.lab.test debian
Esto confirma que el sistema puede resolver el nombre local.
24. ¿Qué significa gethostbyaddr failed?
Después de corregir el hostname, durante nuestras pruebas todavía encontramos:
gethostbyaddr(192.168.100.205) failed: 2
Este mensaje está relacionado con una búsqueda inversa de la dirección IP local.
Sendmail intentó obtener el nombre asociado a:
192.168.100.205
y la consulta no produjo el resultado esperado.
¿Por qué ocurre?
En una red local podemos utilizar direcciones privadas que no tienen registros PTR configurados en un servidor DNS.
Esto no significa necesariamente que exista un problema con Gmail o con STARTTLS.
De hecho, durante nuestras pruebas conseguimos enviar mensajes correctamente aunque apareciera esta advertencia.
24.1. Comprobar la resolución inversa
Ejecutamos:
dig -x 192.168.100.205
Explicación
dig realiza consultas DNS.
-x solicita una búsqueda inversa.
192.168.100.205 es la dirección IP que deseamos consultar.
Si no existe un registro PTR, es posible que no obtengamos un nombre.
¿Debemos corregirlo obligatoriamente?
No necesariamente para este escenario.
Si utilizamos Sendmail como cliente local conectado a Gmail o a un servidor SMTP de hosting, la ausencia de un PTR para nuestra IP privada no implica automáticamente que el envío vaya a fallar.
En un servidor de correo público, la resolución inversa y la identidad del servidor adquieren mayor importancia.
No debemos confundir esta advertencia con un error de autenticación SMTP.
25. Diferenciar los principales errores de Sendmail
| Mensaje | Posible causa | Primera comprobación |
|---|---|---|
535 5.7.8 | Credenciales rechazadas | Usuario, contraseña y authinfo |
Connection timed out | Problema de conectividad | Puerto y firewall |
Connection refused | Servicio o puerto no disponible | Hostname y puerto |
stat=Deferred | Entrega pendiente | Registros y cola |
stat=Sent | Entrega aceptada por el siguiente servidor | Confirmar destinatario |
verify=FAIL | Problema de verificación TLS | Certificado y hostname |
gethostbyaddr failed | Problema de resolución inversa | DNS PTR |
hostname not qualified | Nombre local incompleto | hostname y /etc/hosts |
mail.log inexistente | Registro en otro destino | journalctl |
No debemos modificar varios archivos al mismo tiempo sin saber qué error estamos intentando resolver.
Es preferible realizar una comprobación, corregir un problema y volver a probar.
26. Procedimiento recomendado para diagnosticar Sendmail
Cuando un correo no llega, podemos seguir este orden.
Paso 1. Comprobar el servicio
sudo systemctl status sendmail --no-pager
Paso 2. Comprobar el servidor SMTP configurado
grep '^DS' /etc/mail/sendmail.cf
Si utilizamos Gmail, esperamos encontrar:
DS[smtp.gmail.com]
Paso 3. Comprobar conectividad
nc -vz -w 5 smtp.gmail.com 587
Paso 4. Comprobar TLS
openssl s_client -starttls smtp -connect smtp.gmail.com:587 -servername smtp.gmail.com -verify_hostname smtp.gmail.com -verify_return_error -brief
Paso 5. Enviar un mensaje de prueba
/usr/sbin/sendmail -v -t -f [email protected] <<'EOF'
To: [email protected]
From: [email protected]
Subject: Diagnostico Sendmail
Prueba de funcionamiento desde Debian 13.
EOF
Paso 6. Consultar registros
sudo journalctl -u sendmail -n 50 --no-pager
Paso 7. Consultar mensajes pendientes
sudo sendmail -bp
Paso 8. Revisar la cola MSP
sudo sendmail -Ac -bp
Paso 9. Reintentar después de corregir el problema
sudo sendmail -q
Si encontramos un error, debemos interpretarlo antes de continuar.
27. Práctica final: administrar Sendmail
Para terminar realizaremos una práctica completa.
Ejercicio 1. Enviar un mensaje local al usuario root.
echo "Prueba local desde Debian." | mail -s "Mensaje local" root
Ejercicio 2. Abrir el buzón del administrador.
sudo mail -u root
Dentro de Mailutils, utilizar:
headers
print 1
exit
Ejercicio 3. Enviar un mensaje externo con mail.
echo "Prueba externa desde Debian." | mail -s "Correo externo" [email protected]
Ejercicio 4. Consultar registros recientes.
sudo journalctl -u sendmail --since "10 minutes ago" --no-pager
Ejercicio 5. Comprobar mensajes pendientes.
sudo sendmail -bp
Ejercicio 6. Comprobar la cola de envío local.
sudo sendmail -Ac -bp
Ejercicio 7. Comprobar el servidor SMTP.
nc -vz -w 5 smtp.gmail.com 587
Ejercicio 8. Consultar el nombre completo del equipo.
hostname -f
Ejercicio 9. Consultar la resolución DNS del servidor SMTP.
dig smtp.gmail.com A
Ejercicio 10. Comprobar si Sendmail aceptó y retransmitió el mensaje.
sudo journalctl -u sendmail -n 100 --no-pager
Debemos buscar el identificador del mensaje y comprobar si aparece stat=Sent, stat=Deferred u otro resultado.
Conclusión
En esta cuarta parte aprendimos a administrar Sendmail desde la terminal de Debian 13.
Ahora sabemos enviar mensajes utilizando mail y sendmail, consultar correos locales, comprender la conversación SMTP y revisar las colas de mensajes pendientes.
También aprendimos a utilizar journalctl para investigar problemas, interpretar códigos SMTP y diferenciar errores de autenticación, conectividad, certificados y DNS.
Una de las lecciones más importantes es que un correo aceptado por Sendmail no necesariamente ha llegado a su destinatario.
Debemos comprobar el recorrido del mensaje y aprender a interpretar los registros para saber en qué etapa ocurrió el problema.
¿Qué aprenderemos en la Parte 5?
En el siguiente tutorial aprenderemos a utilizar Sendmail para crear mensajes más completos.
Trabajaremos con:
- Correos con contenido HTML.
- Encabezados MIME.
- Mensajes con archivos adjuntos.
- Envío de documentos e informes.
- Correos con formato personalizado.
- Buenas prácticas para evitar problemas de codificación.
Estos conocimientos nos prepararán para automatizar notificaciones desde Bash y desarrollar formularios de contacto y sistemas de correo utilizando PHP puro.
OPERSLINUX — Aprende Linux, servidores y programación mediante la práctica.



