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.

ComandoFunción
headersMostrar la lista de mensajes.
print 1Leer el mensaje número 1.
1Seleccionar y mostrar el mensaje 1.
nextAvanzar al siguiente mensaje.
delete 1Marcar el mensaje 1 para eliminarlo.
undelete 1Deshacer la marca de eliminación.
save 1 archivo.mboxGuardar el mensaje en un archivo de buzón.
quitSalir aplicando los cambios correspondientes.
exitSalir sin modificar el estado del buzón.
helpConsultar 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ódigoSignificado general
2xxOperación completada correctamente.
3xxEl servidor necesita información adicional.
4xxError temporal.
5xxError permanente para la operación solicitada.

Algunos códigos habituales son:

CódigoInterpretación
220Servicio SMTP preparado.
221El servidor está cerrando la conexión.
235Autenticación satisfactoria.
250Operación aceptada.
334El servidor solicita continuar la autenticación.
354El servidor está preparado para recibir el contenido.
421Servicio no disponible temporalmente.
450Buzón o recurso temporalmente no disponible.
451Error temporal de procesamiento.
452Recursos insuficientes temporalmente.
535Error de autenticación.
550Operación rechazada, por ejemplo por destinatario inexistente o política del servidor.
552Se ha excedido un límite de almacenamiento o tamaño.
554Transacció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 authinfo desactualizada.
  • 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

MensajePosible causaPrimera comprobación
535 5.7.8Credenciales rechazadasUsuario, contraseña y authinfo
Connection timed outProblema de conectividadPuerto y firewall
Connection refusedServicio o puerto no disponibleHostname y puerto
stat=DeferredEntrega pendienteRegistros y cola
stat=SentEntrega aceptada por el siguiente servidorConfirmar destinatario
verify=FAILProblema de verificación TLSCertificado y hostname
gethostbyaddr failedProblema de resolución inversaDNS PTR
hostname not qualifiedNombre local incompletohostname y /etc/hosts
mail.log inexistenteRegistro en otro destinojournalctl

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.

Deja un comentario