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
mailysendmail. - 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ámetro | Valor |
|---|---|
| Servidor SMTP | smtp.gmail.com |
| Puerto | 587 |
| Seguridad | STARTTLS |
| Usuario | Correo Gmail completo |
| Contraseña | Contraseña de aplicación |
| Autenticación | SMTP AUTH |
| Certificado propio | No 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:
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:
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?
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.
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:
[email protected]por la cuenta Gmail autenticada.[email protected]por el destinatario.
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.
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-infopero 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.



