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

Serie: Sendmail en Debian — Parte 3 de 6

En los tutoriales anteriores aprendimos a instalar Sendmail en Debian 13, enviar mensajes locales y configurar un servidor SMTP externo utilizando una cuenta de hosting.

En esta tercera parte aprenderemos a conectar Sendmail con Gmail para enviar correos electrónicos desde la terminal de Debian, utilizando el servidor smtp.gmail.com, el puerto 587 y una conexión cifrada mediante STARTTLS.

También aprenderemos a generar una contraseña de aplicación de Google, proteger nuestras credenciales, verificar el certificado TLS y solucionar errores de autenticación.

Una de las ventajas de este procedimiento es que podremos aprovechar la misma configuración posteriormente para enviar notificaciones desde scripts Bash, programas PHP y otras aplicaciones instaladas en Linux.

1. ¿Qué aprenderemos?

Al finalizar podremos:

  • Configurar una cuenta Gmail para enviar correos mediante SMTP.
  • Comprender qué son las contraseñas de aplicación.
  • Conectar Sendmail con smtp.gmail.com:587.
  • Configurar la autenticación mediante authinfo.
  • Proteger las credenciales con permisos de Linux.
  • Activar y comprobar STARTTLS.
  • Enviar mensajes utilizando mail y sendmail.
  • Consultar los registros y las colas.
  • Solucionar el error 535 5.7.8.
  • Cambiar de un servidor SMTP de hosting a Gmail sin reinstalar Sendmail.

2. ¿Cómo funcionará Sendmail con Gmail?

Sendmail será el programa encargado de procesar los mensajes generados desde nuestro equipo.

Sin embargo, en lugar de intentar entregarlos directamente al servidor del destinatario, utilizará Gmail como servidor de retransmisión.

El funcionamiento será el siguiente:

┌──────────────────────────────┐
│ Debian 13                    │
│ Terminal, Bash o PHP         │
└──────────────┬───────────────┘
               │
               ▼
┌──────────────────────────────┐
│ Sendmail                     │
│ Procesa el mensaje           │
└──────────────┬───────────────┘
               │
               │ SMTP
               │ Puerto 587
               │ STARTTLS
               ▼
┌──────────────────────────────┐
│ smtp.gmail.com               │
│ Autenticación con Gmail      │
└──────────────┬───────────────┘
               │
               ▼
┌──────────────────────────────┐
│ Servidor del destinatario    │
│ Gmail, Outlook, etc.         │
└──────────────────────────────┘

Esta configuración se conoce como SMTP relay mediante smart host.

El smart host es el servidor al que Sendmail entrega los mensajes externos para que continúen su recorrido.

En nuestro caso será:

smtp.gmail.com

2.1. Datos de conexión

Utilizaremos:

ParámetroValor
Servidor SMTPsmtp.gmail.com
Puerto587
SeguridadSTARTTLS
UsuarioCorreo Gmail completo
ContraseñaContraseña de aplicación
AutenticaciónSMTP AUTH
Certificado propioNo necesario

Google documenta oficialmente el uso de smtp.gmail.com con el puerto 587 para conexiones STARTTLS.

Importante: en este tutorial utilizaremos una contraseña de aplicación. Esta opción solo estará disponible si nuestra cuenta de Google cumple los requisitos correspondientes.


3. Requisitos

Necesitaremos:

  • Debian GNU/Linux 13.
  • Sendmail instalado.
  • Permisos administrativos mediante sudo.
  • Una cuenta Gmail compatible con contraseñas de aplicación.
  • Verificación en dos pasos habilitada.
  • Conexión a Internet.
  • Acceso al puerto TCP 587.

Si todavía no tenemos Sendmail instalado, podemos ejecutar:

sudo apt update
sudo apt install sendmail sendmail-cf mailutils ca-certificates libsasl2-modules openssl netcat-openbsd

Explicación de los paquetes

sendmail

Instala el agente de transporte de correo.

sendmail-cf

Proporciona macros y archivos necesarios para generar la configuración de Sendmail.

mailutils

Permite enviar y consultar mensajes desde la terminal.

ca-certificates

Instala certificados de autoridades certificadoras de confianza.

libsasl2-modules

Proporciona mecanismos de autenticación SASL.

openssl

Permite comprobar conexiones TLS y certificados.

netcat-openbsd

Proporciona el comando nc para comprobar conexiones TCP.


4. Crear una contraseña de aplicación de Gmail

Este paso es especialmente importante.

No utilizaremos la contraseña normal de nuestra cuenta de Google.

Las contraseñas de aplicación son credenciales específicas que permiten que determinadas aplicaciones compatibles se autentiquen sin utilizar directamente la contraseña principal.

Google recomienda utilizar mecanismos modernos como OAuth 2.0 cuando sea posible. Sin embargo, las contraseñas de aplicación siguen siendo una alternativa para determinadas aplicaciones que no implementan ese mecanismo.

4.1. Activar la verificación en dos pasos

Primero ingresamos a nuestra cuenta de Google.

Abrimos:

https://myaccount.google.com/security

Buscamos la sección de seguridad y habilitamos la verificación en dos pasos, si todavía no está activada.

Seguimos las instrucciones de Google para completar la configuración.

4.2. Generar la contraseña

Una vez habilitada la verificación en dos pasos, podemos consultar:

https://myaccount.google.com/apppasswords

Si la función está disponible, podremos crear una contraseña para una aplicación.

Podemos asignarle un nombre descriptivo:

Sendmail Debian 13

Google generará una contraseña de aplicación.

Debemos guardarla temporalmente en un lugar seguro porque la utilizaremos en la configuración de Sendmail.

No debemos compartirla ni publicarla.

¿Qué pasa si no aparece la opción?

Puede ocurrir por diferentes razones:

  • No hemos habilitado la verificación en dos pasos.
  • Nuestra cuenta utiliza determinadas configuraciones de seguridad.
  • La cuenta pertenece a una organización que restringe esta función.
  • Tenemos activada Protección Avanzada.
  • Nuestra configuración de verificación en dos pasos no permite contraseñas de aplicación.

Si la función no está disponible, no debemos desactivar las protecciones de la cuenta para forzar su aparición.

En ese caso necesitaremos una alternativa compatible, como una integración OAuth 2.0 o un servicio SMTP diferente.


5. Comprobar la conexión con Gmail

Antes de modificar Sendmail comprobaremos que Debian puede conectarse al servidor SMTP.

Ejecutamos:

nc -nvz -w 5 smtp.gmail.com 587

Explicación del comando

nc

Ejecuta Netcat.

-n

Evita búsquedas adicionales de nombres por parte de Netcat, aunque el hostname proporcionado debe resolverse.

-v

Activa el modo detallado.

-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 SMTP de Google.

587

Es el puerto TCP utilizado.

Resultado esperado

Podemos obtener un mensaje indicando que la conexión fue establecida correctamente.

Esto confirma que podemos alcanzar el puerto SMTP.

Sin embargo, todavía no demuestra que la autenticación ni STARTTLS funcionen.


6. Comprobar STARTTLS con OpenSSL

Ahora verificaremos que Gmail permite negociar una conexión cifrada.

Ejecutamos:

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 completa

openssl

Ejecuta OpenSSL.

s_client

Permite establecer una conexión TLS como cliente.

-starttls smtp

Indica que debemos comenzar una sesión SMTP y negociar STARTTLS.

-connect smtp.gmail.com:587

Especifica el servidor y puerto.

-servername smtp.gmail.com

Indica el nombre del servidor mediante SNI.

-verify_hostname smtp.gmail.com

Comprueba que el certificado presentado sea válido para ese hostname.

-verify_return_error

Hace que los errores de verificación provoquen el fallo de la comprobación.

-brief

Muestra información resumida de la conexión.

Resultado esperado

Podemos encontrar:

Protocol version: TLSv1.3
Verification: OK

También puede negociarse TLS 1.2.

Lo importante es que la conexión se establezca utilizando TLS y que el certificado se verifique correctamente.

Para salir de una sesión interactiva que permanezca abierta podemos presionar Ctrl + C.

¿Por qué es importante verificar el certificado?

Porque cifrar la conexión no basta si no comprobamos que realmente estamos hablando con el servidor esperado.

La verificación ayuda a protegernos frente a servidores que intenten hacerse pasar por Gmail.


7. Crear una copia de seguridad de Sendmail

Antes de modificar la configuración realizaremos un respaldo.

Ejecutamos:

sudo cp -a /etc/mail/sendmail.mc /etc/mail/sendmail.mc.bak

Explicación

sudo

Ejecuta el comando con privilegios administrativos.

cp

Copia archivos.

-a

Activa el modo archivo, que conserva los atributos que sea posible preservar.

/etc/mail/sendmail.mc

Es el archivo original.

/etc/mail/sendmail.mc.bak

Es la copia de seguridad.

Si necesitamos recuperar el archivo posteriormente, podremos utilizar este respaldo.


8. Configurar Gmail como smart host

Abrimos el archivo principal de configuración:

sudo nano /etc/mail/sendmail.mc

8.1. ¿Dónde debemos colocar la configuración?

Buscaremos la sección de macros de Sendmail.

Las instrucciones nuevas deben quedar antes de las líneas que definen los mailers, como:

MAILER(`local')dnl
MAILER(`smtp')dnl

Debemos revisar si ya existen definiciones de:

SMART_HOST
RELAY_MAILER_ARGS
ESMTP_MAILER_ARGS
confAUTH_MECHANISMS
authinfo

Si anteriormente configuramos HostGator, debemos sustituir los valores correspondientes.

No debemos dejar dos smart hosts activos esperando que Sendmail seleccione automáticamente uno de ellos.

8.2. Configuración de Gmail

Agregamos o adaptamos las siguientes instrucciones:

dnl ==================================================
dnl GMAIL SMTP - STARTTLS PUERTO 587
dnl ==================================================

include(`/etc/mail/tls/starttls.m4')dnl

define(`SMART_HOST', `[smtp.gmail.com]')dnl

define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl

define(`confAUTH_MECHANISMS', `LOGIN PLAIN')dnl

FEATURE(`authinfo', `hash -o /etc/mail/auth/client-info.db')dnl

Importante: si la línea include ya existe, no debemos duplicarla. También debemos conservar las demás instrucciones originales de sendmail.mc.

8.3. Explicación de las directivas

SMART_HOST

define(`SMART_HOST', `[smtp.gmail.com]')dnl

Indica que Gmail será nuestro servidor de retransmisión.

Los corchetes evitan determinadas búsquedas MX y permiten utilizar directamente el hostname especificado.

RELAY_MAILER_ARGS

define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl

Establece el puerto 587 para el mailer de retransmisión.

TCP indica el protocolo de transporte.

$h representa el servidor de destino.

587 es el puerto.

ESMTP_MAILER_ARGS

define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl

Configura los argumentos del mailer ESMTP correspondiente.

confAUTH_MECHANISMS

define(`confAUTH_MECHANISMS', `LOGIN PLAIN')dnl

Declara los mecanismos de autenticación indicados.

LOGIN permite autenticación mediante usuario y contraseña.

PLAIN es otro mecanismo de autenticación basado en credenciales.

Estos mecanismos no cifran por sí mismos el contenido de la conexión.

Por eso utilizaremos STARTTLS.

FEATURE authinfo

FEATURE(`authinfo', `hash -o /etc/mail/auth/client-info.db')dnl

Activa la consulta de credenciales SMTP desde una base de datos.

hash indica el formato del mapa.

-o permite tratar el mapa como opcional al abrirse.

/etc/mail/auth/client-info.db es la ruta de la base de datos.


9. Crear el archivo de credenciales Gmail

Crearemos un directorio protegido:

sudo install -d -m 700 -o root -g root /etc/mail/auth

Explicación

install

Permite crear archivos y directorios estableciendo permisos y propietarios.

-d

Indica que deseamos crear un directorio.

-m 700

Establece permisos de lectura, escritura y acceso únicamente para el propietario.

-o root

Define root como propietario.

-g root

Define root como grupo.

/etc/mail/auth

Es el directorio que contendrá las credenciales.

Ahora abrimos:

sudo nano /etc/mail/auth/client-info

Agregamos:

AuthInfo:smtp.gmail.com "U:root" "I:[email protected]" "P:CONTRASENA_DE_APLICACION" "M:LOGIN"
AuthInfo:[smtp.gmail.com] "U:root" "I:[email protected]" "P:CONTRASENA_DE_APLICACION" "M:LOGIN"

9.1. ¿Qué debemos reemplazar?

[email protected]

Debemos sustituirlo por nuestra dirección Gmail completa.

CONTRASENA_DE_APLICACION

Debemos sustituirlo por la contraseña de aplicación generada en Google.

Si Google muestra la contraseña agrupada visualmente con espacios, utilizaremos los caracteres reales de la contraseña, sin agregar separadores.

9.2. ¿Qué no debemos reemplazar?

AuthInfo:

Identifica una entrada de autenticación.

smtp.gmail.com

Es el servidor de Google que estamos configurando.

U:root

Es el identificador de autorización utilizado en esta configuración. No debemos reemplazarlo por nuestro usuario Linux.

I:

Identifica el usuario SMTP.

P:

Identifica la contraseña SMTP.

M:LOGIN

Indica el mecanismo de autenticación.

¿Por qué tenemos dos líneas?

Una entrada utiliza:

AuthInfo:smtp.gmail.com

La otra:

AuthInfo:[smtp.gmail.com]

Esto permite cubrir las formas de búsqueda del hostname con y sin corchetes.

El objetivo es que Sendmail pueda encontrar las credenciales correspondientes al servidor configurado.

Nunca debemos publicar este archivo con las credenciales reales.


10. Proteger las credenciales

Ejecutamos:

sudo chown root:root /etc/mail/auth/client-info
sudo chmod 600 /etc/mail/auth/client-info

Explicación

chown

Cambia el propietario y el grupo del archivo.

root:root

Establece ambos como root.

chmod

Modifica los permisos.

600

Permite lectura y escritura únicamente al propietario.

Con estos permisos, otros usuarios normales no podrán consultar el archivo.


11. Generar la base de datos authinfo

Ahora convertiremos el archivo de credenciales en una base de datos compatible con Sendmail.

Ejecutamos:

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

Ejecuta la cadena indicada.

makemap

Genera un mapa de Sendmail.

hash

Especifica el formato de la base de datos.

/etc/mail/auth/client-info.db

Es el archivo de salida.

<

Redirige el contenido de un archivo hacia la entrada estándar del comando.

/etc/mail/auth/client-info

Es el archivo de origen.

¿Por qué no ejecutar directamente sudo makemap?

Porque la redirección < es procesada por el shell.

Si el usuario normal no tiene permisos para leer el archivo, el comando puede fallar aunque makemap se ejecute mediante sudo.

Con sudo sh -c también se ejecuta la redirección con privilegios administrativos.

Después protegemos la base de datos:

sudo chown root:root /etc/mail/auth/client-info.db
sudo chmod 600 /etc/mail/auth/client-info.db

Importante: si cambiamos la contraseña de aplicación, debemos modificar client-info y regenerar client-info.db.


12. Configurar la verificación del certificado TLS

No necesitamos generar un certificado propio para enviar correos a Gmail.

Sin embargo, sí debemos comprobar que Sendmail utiliza un almacén de certificados de confianza.

Primero verificamos que exista:

ls -l /etc/ssl/certs/ca-certificates.crt

Este archivo contiene certificados de autoridades certificadoras de confianza.

Ahora abrimos:

sudo nano /etc/mail/sendmail.mc

Después de la inclusión de starttls.m4, podemos configurar:

define(`confCACERT', `/etc/ssl/certs/ca-certificates.crt')dnl

Debemos asegurarnos de que no exista otra definición posterior que sobrescriba este valor.

Esta directiva establece el archivo de certificados de confianza que utilizará Sendmail.

12.1. Exigir la verificación TLS

Sendmail permite configurar políticas TLS mediante el mapa de acceso.

Primero comprobamos que nuestra configuración incluya la funcionalidad access_db.

Después abrimos:

sudo nano /etc/mail/access

Agregamos:

TLS_Srv:smtp.gmail.com    VERIFY:128

Esta regla establece una política de verificación TLS para el servidor indicado.

Debemos comprobar que el mapa esté habilitado y que Sendmail interprete correctamente la política.

No debemos considerar la configuración segura únicamente por haber agregado esta línea.

Posteriormente comprobaremos los registros reales de conexión.

¿Qué ocurre si falla la verificación?

No debemos desactivar TLS ni aceptar certificados inválidos solamente para conseguir que el mensaje se envíe.

Primero revisaremos el hostname, el almacén de certificados y la fecha del sistema.


13. Regenerar la configuración

Después de modificar sendmail.mc, ejecutamos:

sudo make -C /etc/mail

Explicación

make

Ejecuta las instrucciones del archivo Makefile.

-C

Indica que debe cambiar al directorio especificado.

/etc/mail

Es el directorio donde se encuentran los archivos de configuración de Sendmail.

Este procedimiento genera o actualiza archivos como:

/etc/mail/sendmail.cf

y las bases de datos correspondientes.

13.1. Comprobar el smart host

Ejecutamos:

grep '^DS' /etc/mail/sendmail.cf

Explicación

grep

Busca líneas que coinciden con un patrón.

^

Representa el comienzo de la línea.

DS

Es la macro utilizada por Sendmail para identificar el smart host en su configuración generada.

Resultado esperado:

DS[smtp.gmail.com]

Si aparece HostGator u otro servidor, debemos revisar sendmail.mc.

13.2. Comprobar el archivo de CA

Ejecutamos:

grep '^O CACertFile=' /etc/mail/sendmail.cf

Resultado esperado:

O CACertFile=/etc/ssl/certs/ca-certificates.crt

Esto confirma la ruta configurada, pero todavía no demuestra que Gmail acepte nuestras conexiones.


14. Reiniciar Sendmail

Ejecutamos:

sudo systemctl restart sendmail

Explicación

systemctl

Administra servicios de systemd.

restart

Detiene y vuelve a iniciar el servicio.

sendmail

Es el servicio que deseamos reiniciar.

Comprobamos:

sudo systemctl status sendmail --no-pager

Buscamos:

Active: active (running)

También podemos consultar:

sudo journalctl -u sendmail --since "2 minutes ago" --no-pager

Explicación

journalctl

Consulta los registros de systemd-journald.

-u sendmail

Filtra los registros del servicio.

--since "2 minutes ago"

Muestra los registros desde hace dos minutos.

--no-pager

Evita abrir un visor interactivo.

Si el servicio tarda demasiado en iniciar, debemos comprobar el nombre del equipo y su resolución local, como explicamos en la Parte 1.


15. Enviar un correo desde la terminal con mail

Realizaremos una prueba sencilla.

Ejecutamos:

echo "Correo enviado desde Debian 13 utilizando Gmail SMTP." \
| mail -s "Prueba Gmail SMTP - OPERSLINUX" [email protected]

Debemos reemplazar [email protected] por una dirección real.

Explicación

echo

Imprime el texto que será utilizado como cuerpo del mensaje.

\

Al final de la primera línea, permite continuar el comando en la siguiente línea de Bash.

|

Es una tubería que conecta la salida de echo con la entrada de mail.

mail

Es el cliente de correo.

-s

Establece el asunto.

"Prueba Gmail SMTP - OPERSLINUX"

Es el asunto del mensaje.

[email protected]

Es el destinatario.

¿Por qué no aparece una confirmación?

El comando mail puede terminar sin mostrar un mensaje de éxito.

Esto no significa necesariamente que el correo haya sido entregado.

Debemos revisar los registros de Sendmail.

Además, en esta prueba sencilla el remitente local puede ser diferente de nuestra cuenta Gmail. Para evitar problemas de identidad del remitente, realizaremos una segunda prueba indicando explícitamente la dirección autorizada.


16. Enviar un correo directamente con Sendmail

Ahora utilizaremos el ejecutable de Sendmail.

Ejecutamos:

/usr/sbin/sendmail -v -t -f [email protected] <<'EOF'
To: [email protected]
From: [email protected]
Subject: Mi primer correo desde Debian 13

Hola.

Este correo fue enviado desde Debian 13 utilizando Sendmail.

Servidor SMTP: Gmail
Puerto: 587
Seguridad: STARTTLS

Saludos desde Linux.
EOF

Debemos reemplazar:

16.1. Explicación del comando

/usr/sbin/sendmail

Es la ruta del ejecutable.

-v

Activa el modo detallado.

-t

Indica que Sendmail debe obtener los destinatarios de las cabeceras.

-f [email protected]

Establece el remitente del sobre SMTP.

<<'EOF'

Inicia un bloque de texto que Bash proporcionará 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.

La última línea debe escribirse sola.

¿Por qué utilizamos -f?

Porque el remitente del sobre SMTP y el remitente visible son conceptos diferentes.

El parámetro -f establece el remitente del sobre, mientras que From: corresponde a una cabecera del mensaje.

Utilizar una dirección autorizada ayuda a evitar inconsistencias, aunque Gmail puede aplicar sus propias políticas y modificar o rechazar identidades no autorizadas.


17. Interpretar los resultados de Sendmail

Una de las partes más importantes es aprender a interpretar los registros.

Ejecutamos:

sudo journalctl -u sendmail -n 50 --no-pager

En nuestras pruebas con Debian 13 encontramos registros similares a los siguientes.

17.1. Conexión TLS correcta

STARTTLS=client,
relay=smtp.gmail.com.,
version=TLSv1.3,
verify=OK,
cipher=TLS_AES_256_GCM_SHA384,
bits=256/256

¿Qué significa cada campo?

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 TLS negociada.

verify=OK

Indica que Sendmail registró una verificación satisfactoria del certificado.

cipher=TLS_AES_256_GCM_SHA384

Identifica el conjunto criptográfico utilizado.

bits=256/256

Muestra información sobre la fortaleza criptográfica de la sesión.

Este resultado confirma que se estableció una conexión TLS con Gmail.

17.2. Gmail acepta el mensaje

También obtuvimos:

to=<[email protected]>,
relay=smtp.gmail.com.,
dsn=2.0.0,
stat=Sent (OK ... - gsmtp)

Explicación

to=

Indica el destinatario.

relay=

Identifica el servidor que procesó la entrega.

dsn=2.0.0

Es un código de estado que indica una entrega satisfactoria al siguiente servidor.

stat=Sent

Indica que el servidor remoto aceptó el mensaje.

gsmtp

Forma parte de la respuesta emitida por la infraestructura SMTP de Google.

¿Esto significa que llegó a la bandeja de entrada?

No necesariamente.

Significa que Gmail aceptó el mensaje para continuar su procesamiento.

El correo todavía puede ser filtrado, rechazado posteriormente o clasificado como spam.

Por eso debemos comprobar también el buzón del destinatario.


18. Solucionar el error 535 5.7.8 de Gmail

Durante nuestras pruebas encontramos uno de los errores más habituales:

535 5.7.8 Username and Password not accepted

Este error indica que Gmail no aceptó las credenciales proporcionadas.

No significa necesariamente que exista un problema con el puerto 587 o con STARTTLS.

De hecho, es posible establecer correctamente una conexión cifrada y posteriormente fallar durante la autenticación.

18.1. Posibles causas

  • Utilizamos la contraseña normal de Google.
  • La contraseña de aplicación es incorrecta.
  • La contraseña fue revocada.
  • El usuario Gmail está mal escrito.
  • Modificamos client-info pero no regeneramos la base de datos.
  • La cuenta tiene restricciones de seguridad.
  • Sendmail no está encontrando la entrada de autenticación adecuada.

18.2. Primera comprobación: usuario

Abrimos:

sudo nano /etc/mail/auth/client-info

Revisamos que el usuario indicado en I: corresponda a nuestra cuenta Gmail completa.

No debemos publicar el contenido de este archivo.

18.3. Segunda comprobación: contraseña

Comprobamos que P: contenga la contraseña de aplicación.

Si tenemos dudas sobre su validez, podemos revocarla desde Google y generar una nueva, siempre que la función siga disponible.

18.4. Tercera comprobación: regenerar la base de datos

Ejecutamos:

sudo sh -c 'makemap hash /etc/mail/auth/client-info.db < /etc/mail/auth/client-info'

Después:

sudo chmod 600 /etc/mail/auth/client-info.db

Finalmente:

sudo systemctl restart sendmail

Realizamos otra prueba de envío.

En nuestro laboratorio, después de corregir la autenticación, Gmail aceptó los mensajes y los registros mostraron:

dsn=2.0.0, stat=Sent

19. Otros errores frecuentes

Error: 534 5.7.9

Podemos encontrar una respuesta indicando que se requiere una contraseña específica de aplicación.

Esto suele ocurrir cuando intentamos utilizar credenciales incompatibles con el método de autenticación.

Debemos comprobar la disponibilidad de contraseñas de aplicación en nuestra cuenta.

Error: Must issue STARTTLS first

Indica que el servidor exige negociar STARTTLS antes de realizar determinadas operaciones, como la autenticación.

Debemos comprobar que Sendmail tenga correctamente habilitado TLS.

Error: Connection timed out

Significa que la conexión no se completó dentro del tiempo esperado.

Comprobamos:

nc -nvz -w 5 smtp.gmail.com 587

Si el puerto no responde, revisaremos nuestra conexión a Internet, firewall y posibles restricciones de red.

Error: Certificate verify failed

Indica un problema al verificar el certificado.

Debemos revisar:

  • Fecha y hora del equipo.
  • Certificados de confianza.
  • Nombre del servidor.
  • Configuración TLS de Sendmail.

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

Error: Deferred

Podemos encontrar:

stat=Deferred

Esto significa que la entrega quedó pendiente.

Sendmail puede intentar enviarla posteriormente.

Debemos revisar el motivo exacto en los registros.


20. Consultar la cola de mensajes

Para comprobar si tenemos correos pendientes ejecutamos:

mailq

También podemos utilizar:

sudo sendmail -bp

¿Qué significa -bp?

Solicita mostrar la cola de mensajes.

En algunas configuraciones podemos encontrar:

MSP Queue status...

Si el comando tarda demasiado, podemos interrumpirlo mediante Ctrl + C.

Esto no elimina automáticamente los mensajes.

Para establecer un límite de tiempo:

timeout 15s mailq

timeout limita la duración del comando.

15s establece quince segundos.

mailq es el programa que ejecutaremos.

Después de corregir un problema, podemos solicitar el procesamiento de la cola:

sudo sendmail -q

El parámetro -q solicita ejecutar una pasada de procesamiento de la cola.

No debemos repetir este comando continuamente si Gmail está rechazando nuestras credenciales.


21. ¿Por qué aparece gethostbyaddr failed?

Durante nuestras pruebas también encontramos:

gethostbyaddr(192.168.100.205) failed: 2

Este mensaje está relacionado con la resolución inversa de nombres.

Sendmail intentó obtener un hostname asociado a la dirección IP local y no consiguió resolverlo.

Esto no significa necesariamente que Gmail esté rechazando la conexión.

En nuestro laboratorio, esta advertencia apareció incluso cuando Sendmail consiguió enviar mensajes correctamente mediante Gmail.

21.1. Comprobar el hostname

Ejecutamos:

hostname

Después:

hostname -f

Podemos obtener:

debian
debian.lab.test

En la primera parte configuramos /etc/hosts para que Debian pudiera resolver un nombre completo.

Si el hostname no está correctamente configurado, debemos revisar ese procedimiento.

No debemos confundir la resolución del nombre del equipo con la autenticación SMTP.

Son problemas diferentes.


22. ¿Puedo utilizar una cuenta Gmail para enviar desde mi dominio?

Sí, pero debemos distinguir entre utilizar Gmail como servidor de salida y utilizar una dirección de dominio propio como remitente.

Por ejemplo, podemos tener:

Cuenta SMTP: [email protected]

Y querer enviar como:

[email protected]

Esto no significa que Gmail permitirá automáticamente utilizar esa dirección.

Google puede exigir que configuremos y verifiquemos la dirección alternativa como un remitente autorizado.

También debemos considerar SPF, DKIM y DMARC del dominio.

Para las primeras pruebas recomendamos utilizar la misma dirección Gmail autenticada como remitente.

Si necesitamos enviar correos profesionales desde un dominio propio, puede resultar más adecuado utilizar el SMTP del proveedor de hosting, como aprendimos en la Parte 2.


23. Recomendaciones de seguridad

No utilizar la contraseña principal de Google

Debemos utilizar una contraseña de aplicación cuando esté disponible y corresponda a nuestro método de autenticación.

Proteger los archivos

Los archivos:

/etc/mail/auth/client-info
/etc/mail/auth/client-info.db

deben permanecer protegidos.

No compartir credenciales

Nunca debemos publicar contraseñas en capturas de pantalla, tutoriales o repositorios de código.

Mantener actualizados los certificados

Podemos actualizar los paquetes y certificados mediante APT.

Respetar los límites de Gmail

Gmail no debe considerarse un servicio ilimitado de envío de correos.

Existen límites y mecanismos de protección contra abusos.

Para aplicaciones que necesitan enviar grandes cantidades de mensajes, conviene utilizar un proveedor transaccional especializado.

Evitar retransmisiones abiertas

No debemos configurar nuestro Sendmail para permitir que cualquier usuario externo envíe correos a través de nuestro equipo.


24. Práctica final

Antes de terminar comprobaremos que todo funciona.

Paso 1. Verificar conectividad

nc -nvz -w 5 smtp.gmail.com 587

Paso 2. Verificar STARTTLS

openssl s_client -starttls smtp -connect smtp.gmail.com:587 -servername smtp.gmail.com -verify_hostname smtp.gmail.com -verify_return_error -brief

Paso 3. Comprobar el smart host

grep '^DS' /etc/mail/sendmail.cf

Resultado esperado:

DS[smtp.gmail.com]

Paso 4. Comprobar el servicio

sudo systemctl status sendmail --no-pager

Paso 5. Enviar un correo de prueba

echo "Prueba final de Gmail SMTP desde Debian." | mail -s "OPERSLINUX Gmail SMTP" [email protected]

Paso 6. Consultar registros

sudo journalctl -u sendmail -n 50 --no-pager

Paso 7. Comprobar mensajes pendientes

sudo sendmail -bp

Si los registros muestran que Gmail aceptó el mensaje y la conexión TLS se verificó correctamente, habremos completado el objetivo de esta tercera parte.


Conclusión

En este tutorial aprendimos a configurar Sendmail para enviar correos electrónicos utilizando Gmail como servidor SMTP.

Configuramos el puerto 587, habilitamos STARTTLS, protegimos nuestras credenciales y utilizamos una contraseña de aplicación para autenticarnos.

También aprendimos a interpretar los registros, identificar mensajes aceptados y solucionar el error 535 5.7.8.

Ahora contamos con una instalación de Sendmail capaz de enviar mensajes mediante Gmail sin necesidad de convertir nuestro equipo Debian en un servidor público de correo.

¿Qué aprenderemos en la Parte 4?

En el siguiente tutorial profundizaremos en el uso y administración de Sendmail desde la terminal.

Aprenderemos a:

  • Enviar mensajes con diferentes comandos.
  • Consultar y administrar correos locales.
  • Interpretar los registros SMTP.
  • Revisar y procesar las colas.
  • Comprender los códigos de respuesta.
  • Diagnosticar problemas de DNS, autenticación y conectividad.

Posteriormente aprenderemos a enviar mensajes HTML, adjuntar archivos y automatizar notificaciones desde scripts Bash y aplicaciones PHP puro.

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

Deja un comentario