Notificaciones por Email en GLPI: Guía Completa de Configuración

Guía técnica de notificaciones por correo en GLPI: SMTP, OAuth para Gmail y Microsoft 365, el modelo evento-cola-envío, el cron de la acción queuednotification, diagnóstico por SQL y las trampas de campo que impiden que el correo llegue aunque el SMTP esté bien.

En este artículo8 secciones

En GLPI, "configurar el correo" no es solo apuntar a un servidor SMTP: es garantizar que el evento se convierta en mensaje, entre en la cola y realmente salga. En el mantenimiento de entornos de clientes, la mayoría de los casos de "GLPI dejó de enviar correo" no tienen nada mal en el SMTP: lo que se rompió fue el vaciado de la cola o el cron. Esta guía cubre la configuración completa y, sobre todo, los puntos donde la entrega falla de verdad.

El modelo mental: evento, cola y envío

Una notificación pasa por tres etapas, y cada una falla de forma distinta:

  1. Evento - algo ocurre (nuevo ticket, seguimiento, resolución) y una Notificación asocia el evento con una Plantilla y los destinatarios.
  2. Cola - el mensaje se guarda en la tabla glpi_queuednotifications, no se envía al instante.
  3. Envío - la acción automática queuednotification, disparada por el cron, vacía la cola vía SMTP.

Guarda esa separación: la mayoría de los incidentes que atendemos están en la etapa 3 (la cola se llena y nadie la vacía), no en la etapa 1 (SMTP). Configurar un SMTP perfecto sin asegurar el cron es la receta clásica del "lo configuré todo y no llega nada".

Configuración base del SMTP

En Configurar > Notificaciones > Configuración de seguimientos por correo (Setup > Notifications), habilita los seguimientos por correo y completa:

  • Modo de envío: SMTP+TLS en la mayoría de los casos - evita el mail() de PHP en producción.
  • Servidor y puerto: el host del relay + 587 (STARTTLS) o 465 (SSL).
  • Usuario/contraseña u OAuth: según el proveedor.
  • Correo del administrador y del remitente: una dirección que el relay esté autorizado a enviar como - ese detalle decide si el correo llega o cae en spam.

La contraseña se guarda cifrada (GLPIKey) en la columna smtp_passwd. Nunca la leas por SQL: viene revuelta y no ayuda al diagnóstico. Para revisar el resto de la configuración directamente en la base de datos:

-- Diagnóstico de la configuración de envío (nunca leas smtp_passwd: viene cifrado)
SELECT name, value
FROM glpi_configs
WHERE context = 'core'
  AND name IN ('smtp_mode','smtp_host','smtp_port','smtp_username',
               'smtp_check_certificate','admin_email','from_email',
               'notifications_mailing','use_notifications');

Si notifications_mailing devuelve 0, las notificaciones por correo están desactivadas globalmente - ninguna configuración de SMTP importa hasta activarlo.

Eligiendo el modo de envío

Esta es la matriz que usamos para decidir el modo por escenario:

ModoCuándo usarPuertoPrecaución principal
PHP mail()Solo laboratorio/prueba local-Sin auth/TLS; cae en spam - no usar en producción
SMTPRelay interno de confianza en la LAN25 o 587Sin cifrado; solo en red cerrada
SMTP + TLS (STARTTLS)Relay externo con autenticación587Predeterminado recomendado; valida el certificado
SMTP + SSLRelay que exige TLS implícito465Menos común hoy, pero funcional
SMTP + OAuth 2.0Gmail / Microsoft 365587Requiere App Registration + SMTP AUTH habilitado (M365)

Gmail y Microsoft 365 con OAuth 2.0

Gmail y Microsoft 365 bloquearon la autenticación básica (usuario + contraseña). El camino soportado es OAuth 2.0 (GLPI 10.0.7+). En el proveedor registras una aplicación (Google Cloud Console o Azure App Registrations), generas un Client ID y un Client Secret, indicas la redirect URI de GLPI y autorizas. En GLPI, elige el modo SMTP+OAuth, selecciona el proveedor y pega las credenciales.

La trampa que más tiempo consume en Microsoft 365: incluso con el OAuth correcto, M365 deshabilita SMTP AUTH por defecto en el buzón. Sin habilitarlo, la autenticación pasa y el envío falla. Habilítalo en el buzón usado:

# Microsoft 365: habilita SMTP AUTH en el buzón usado por OAuth (deshabilitado por defecto)
Set-CASMailbox -Identity [email protected] -SmtpClientAuthenticationDisabled $false

En Gmail/Workspace el ámbito es https://mail.google.com/ y, en cuentas Workspace, el administrador puede necesitar autorizar la app. Las cuentas con 2FA aún aceptan una contraseña de aplicación como plan B, pero Google está retirando ese camino.

La cola y el cron: donde de verdad se rompe

Aquí está el detalle que solo aparece en la operación. La acción automática queuednotification puede correr en dos modos: GLPI (disparada por acceso a la interfaz) o CLI (por cron externo). En una instancia de bajo tráfico - el cliente que solo usa GLPI en horario laboral - el modo GLPI hace que las notificaciones de la madrugada solo salgan cuando alguien abre el sistema por la mañana. El síntoma llega como "correo atrasado" o "no llega". La decisión que estandarizamos en el mantenimiento: todas las acciones automáticas en modo CLI, con front/cron.php llamado por cron externo cada minuto.

# GLPI - vacía la cola de notificaciones cada minuto (usuario del servidor web)
* * * * * www-data /usr/bin/php /var/www/glpi/front/cron.php >/dev/null 2>&1

# En Docker: dispara el cron de GLPI como el usuario del servidor web (ajusta nombre/ruta)
* * * * * root docker exec -u www-data glpi php /var/www/glpi/front/cron.php >/dev/null 2>&1

Para ver si la cola se vacía, mira lo que está atascado sin sent_time:

-- Notificaciones atascadas en la cola (cola llena = el cron no la está vaciando)
SELECT id, itemtype, recipient, create_time, send_time, sent_time, sent_try
FROM glpi_queuednotifications
WHERE sent_time IS NULL
ORDER BY send_time ASC
LIMIT 20;

Una pila grande y creciente aquí, con el SMTP intacto, casi siempre es cron detenido o en modo GLPI. También puedes seguirlo en la interfaz en Administración > Cola de notificaciones.

Plantillas y variables

En Configurar > Notificaciones > Plantillas de notificación editas el cuerpo de cada evento. Las variables usan la sintaxis ##...##:

<!-- Plantilla "Nuevo ticket" - cuerpo HTML con variables de GLPI -->
<p>Hola ##ticket.author##,</p>
<p>Tu ticket <strong>##ticket.id##</strong> ha sido registrado:</p>
<ul>
  <li>Título: ##ticket.title##</li>
  <li>Prioridad: ##ticket.priority##</li>
  <li>Síguelo en: ##ticket.url##</li>
</ul>

Una plantilla puede tener versiones por idioma; sin la versión del idioma del destinatario, GLPI usa la predeterminada. El error común aquí es editar solo el cuerpo en portugués y extrañarse de que el técnico con perfil en inglés reciba la plantilla vieja.

Trampas de campo

Los síntomas que más vemos y dónde investigar cada uno:

SíntomaCausa probableDónde mirar
No sale ningún correoCola sin vaciar / cron detenidoglpi_queuednotifications + acción queuednotification
Error de autenticaciónAuth básica bloqueada (Gmail/M365)Migrar a OAuth; habilitar SMTP AUTH en M365
Los correos caen en spamRemitente no autorizado en el relay (SPF/DMARC)Alinear from_email con el dominio del relay
5.7.60 / SendAsDenied (M365)Buzón OAuth sin permiso "Send As"Conceder Send As o usar su propia dirección
Timeout en el puerto 25El proveedor de nube bloquea el 25 de salidaCambiar a 587 (STARTTLS)
El técnico no recibe su propia actualización"No notificar al autor de la acción"Comportamiento esperado, no es un bug

Un aviso sobre el último caso: por defecto GLPI no notifica al autor de su propia acción. El técnico que actualiza el ticket no recibe el eco de su propia actualización - eso es comportamiento esperado, no un bug. Confundirlo con "notificación rota" ya costó una madrugada de diagnóstico persiguiendo un problema que no existía.

Más allá del correo

El correo es asíncrono y compite por atención con la bandeja de entrada. Para que el técnico vea el ticket en el instante en que cambia, el correo no es el mejor canal. Considera notificación en tiempo real con el módulo Smart Notify (campana en la barra) o envío por WhatsApp y Telegram para los eventos que no pueden esperar al próximo ciclo de correo.

Si el correo de tu GLPI vive intermitente - a veces llega, a veces no - normalmente es la cola y el cron, no el SMTP. NexTool se encarga del mantenimiento de GLPI con monitorización de la cola de notificaciones y el cron bajo control. Habla con nosotros sobre soporte y mantenimiento de GLPI.


Revisado por el equipo de NexTool Solutions.

Preguntas Frecuentes

Casi nunca el problema es el SMTP, sino el vaciado de la cola. Las notificaciones van a la tabla glpi_queuednotifications y solo salen cuando la acción automática queuednotification corre por el cron. Si el cron está detenido o la acción está en modo GLPI en una instancia de bajo tráfico, la cola se llena y no se envía nada. Ejecuta front/cron.php por cron externo cada minuto.

Usa 587 con STARTTLS en la mayoría de los casos - es el estándar moderno de envío autenticado. El 465 (SSL implícito) funciona con relays que lo exigen. Evita el 25: además de no tener cifrado, casi todo proveedor de nube bloquea el puerto 25 de salida, lo que aparece como timeout en el envío.

Registra una aplicación en Azure (App Registrations), genera un Client ID y Secret, indica la redirect URI de GLPI y, en GLPI, usa el modo SMTP+OAuth apuntando a smtp.office365.com en el puerto 587. El truco: M365 deshabilita SMTP AUTH por defecto en el buzón. Habilítalo con Set-CASMailbox -SmtpClientAuthenticationDisabled $false, o el envío falla incluso con el OAuth correcto.

En la interfaz, en Administración > Cola de notificaciones. En la base de datos, consulta glpi_queuednotifications filtrando por sent_time IS NULL - esos son los mensajes que aún no han salido. Una pila grande y creciente con el SMTP intacto indica cron detenido o la acción queuednotification en modo GLPI.

La razón más común es que el remitente (from_email/admin_email) no esté autorizado a enviar por el relay usado, lo que rompe SPF/DMARC. Configura la dirección de remitente con un dominio que el servidor SMTP tenga permiso de enviar como, y alinea SPF, DKIM y DMARC en el DNS del dominio.

Para fiabilidad, usa CLI/externo. El modo GLPI dispara el cron por acceso a la interfaz; en una instancia ociosa fuera del horario laboral, las notificaciones se atrasan o solo salen cuando alguien abre el sistema. Un cron externo llamando a front/cron.php cada minuto garantiza el vaciado independientemente del tráfico.

?Necesitas ayuda?