Academia Deltamontero · Documentación
Arquitectura

Correo

Envío por Office 365, cola con límites, registro, enlaces de un solo uso, desvío de pruebas y notificaciones.

Visión general

Todos los correos que envía la plataforma pasan por una sola clase, local_deltamodules\mailer. Las notificaciones internas de Moodle (foros, calificaciones, mensajes, avisos) no salen por correo: se quedan en la campana de la plataforma.

Evento o acción (crear colaborador, recuperar contraseña, módulo asignado, …)
        │
        ▼
mailer::queue()  ──► tabla local_deltamodules_mail (cola = registro)
        │                      │
        │ inmediato o al       │ tarea send_mail (cada minuto, contenedor moodle-cron)
        │ terminar la página   ▼
        └──────────────► mailer::deliver()
                           ├─ ¿correo configurado y sin pausa? ¿cabe en el límite?
                           ├─ bloqueo por correo (nunca se envía dos veces)
                           ├─ crea el enlace de un solo uso en este momento (si aplica)
                           ├─ ¿desvío de pruebas? → todo a MOODLE_MAIL_DIVERT_TO
                           └─ SMTP: smtp.office365.com:587 (STARTTLS, LOGIN)

Sin servidor de correo configurado la plataforma funciona igual: no envía nada y la contraseña se recupera con la cédula.

Servidor: Office 365

Estado en producción: activo. La Academia envía correos con normalidad (confirmado el 08/10/2026).

La cuenta de envío es el buzón info@deltamontero.com de Office 365. La configuración sale de las variables de entorno en cada arranque (moodle-config.sh); no está en el respaldo.

VariableValor en producciónAjuste de Moodle
MOODLE_SMTP_HOSTsmtp.office365.comsmtphosts (con el puerto)
MOODLE_SMTP_PORT587 (por defecto)smtphosts
MOODLE_SMTP_SECUREtls = STARTTLS (por defecto)smtpsecure
MOODLE_SMTP_USERla cuenta de envíosmtpuser; autenticación LOGIN
MOODLE_SMTP_PASSWORDsolo en Coolify, en modo literalsmtppass
MOODLE_SMTP_FROMvacíoremitente; si está vacío se usa MOODLE_SMTP_USER
MOODLE_MAIL_DIVERT_TOvacíodesvío de pruebas (local_deltamodules/mail_divert_to)
MOODLE_NOREPLY_EMAILnoreply@deltamontero.com (ejemplo de .env.example)noreplyaddress solo si no hay SMTP
MOODLE_SUPPORT_EMAILsoporte@deltamontero.com (ejemplo de .env.example)supportemail (formulario "Contactar con el soporte del sitio")

Reglas que impone Office 365 y que la configuración respeta:

  • Remitente = cuenta autenticada. Office 365 rechaza otro remitente. Por eso noreplyaddress es la misma cuenta, emailonlyfromnoreplyaddress = 1 y emailfromvia = 0. El nombre que se muestra es "Academia Deltamontero".
  • Límite de envío. Office 365 acepta unos 30 correos por minuto por buzón. smtpmaxbulk = 1.
  • SMTP AUTH debe estar habilitado para el buzón en Microsoft 365 (error 5.7.139 si no lo está). Lo activa el administrador de Microsoft 365 de la empresa.
  • IPv4. La imagen prefiere IPv4 porque el servidor no tiene salida IPv6.

Si MOODLE_SMTP_HOST está vacío, moodle-config.sh borra smtphosts, smtpuser y smtppass: quitar la variable apaga el correo. El desvío propio de Moodle (divertallemailsto) queda siempre vacío porque el desvío lo hace la Academia sin cambiar el asunto.

Cola, límites y reintentos

ParámetroValorDónde se cambia
Correos por minuto20 por defecto (máximo 30)Correos de la Academia
Correos por día2000 por defecto (máximo 10 000)Correos de la Academia
ReintentosHasta 3 intentos; espera de 5 minutos tras el primero y de 10 tras el segundoCódigo (MAXTRIES)
PausaDetiene todos los envíos; lo pendiente queda en colaCorreos de la Academia → Pausar los envíos
Retención del registro180 díasCódigo

Formas de envío:

  • Inmediato: la página espera el resultado (por ejemplo, para mostrar si se envió).
  • Al terminar la página: se entrega la respuesta al navegador, se libera la sesión y luego se envía; la persona no espera a Office 365.
  • Por la tarea: send_mail en el contenedor moodle-cron, cada minuto.

Cada envío toma un bloqueo por correo, para que dos procesos no envíen el mismo mensaje (cada envío crea un enlace nuevo y anula el anterior). Antes de enviar se comprueba que la cuenta destinataria siga existiendo y no esté suspendida. El motivo de los fallos (email_failed) queda en el registro.

Tipos de correo

ClaveCorreoCuándo
resetRecuperar contraseñaAl usar "¿Olvidó su contraseña?"; enlace válido 1 hora
welcomeBienvenida al personalAl crear la cuenta de un colaborador: su usuario y un enlace para crear la contraseña, válido 7 días
clientwelcomeCuenta de cliente creadaCuando el empleado de una empresa cliente crea su cuenta con el código
clientcodeCódigo para una empresa clienteAl enviar el código de registro desde Clientes
candidatecodeCódigo de prueba técnicaAl enviar el código de acceso desde Postulantes
candidatedonePrueba técnica recibidaCuando el postulante envía su prueba (sin la nota)
moduleMódulo asignadoCuando a alguien que ya entró a la Academia se le asigna un módulo nuevo
completedMódulo terminado y certificadoAl completar un módulo, con el enlace al certificado
reminderRecordatorio de módulos pendientesLos lunes, a quien tiene módulos sin terminar y no entra hace 14 días (como máximo cada 14 días)
testCorreo de pruebaDesde Correos de la Academia

Cada tipo, salvo el de prueba, se puede apagar en Administración del sitio → Usuarios → Correos de la Academia. Además, el respaldo diario envía un correo a los super administradores y al correo de soporte cuando falla (vía backup_status.php). Los correos llevan el logo de Deltamontero incrustado y las cabeceras Auto-Submitted: auto-generated y X-Auto-Response-Suppress: All.

Enlaces de un solo uso

Los correos de bienvenida y de recuperación llevan un enlace para crear la contraseña:

  1. Al poner el correo en cola se guarda un marcador en lugar del enlace: el registro nunca contiene un enlace válido.
  2. Al enviarlo se genera un código aleatorio; en la tabla local_deltamodules_pwtoken se guarda solo su hash SHA-256, con su propósito y su vencimiento.
  3. La página local/deltamodules/setpassword.php guarda el código en la sesión y lo quita de la dirección al instante, pide la contraseña nueva con la política de la Academia, anula el enlace y cierra las otras sesiones de la persona. No inicia sesión por ella.
  4. Los códigos vencidos se borran 30 días después de su vencimiento.

Si se restaura un respaldo anterior, los enlaces enviados después de ese respaldo dejan de servir y hay que reenviarlos (Correos de la Academia → Personal que todavía no entra).

Desvío de pruebas

Con MOODLE_MAIL_DIVERT_TO definido, todos los correos van a esa dirección, sin cambiar el asunto. Sirve para probar en local o en una copia de recuperación sin escribir a personas reales. En pruebas locales, $CFG->noemailever hace que no salga nada.

Una instalación de prueba restaurada desde un respaldo de producción no debe tener las variables MOODLE_SMTP_*, o debe tener el desvío activo: si no, los correos que estaban en cola saldrían dos veces a personas reales. En una mudanza, pausar los envíos en el servidor viejo antes del último respaldo.

Diagnóstico

Correos de la Academia incluye un diagnóstico paso a paso: resolución DNS del servidor, conexión al puerto, saludo, cifrado STARTTLS e inicio de sesión. Nunca muestra la clave. El super administrador puede probar con un usuario y una clave escritos solo para la prueba, que no se guardan. En el registro del despliegue, configure-mail.php informa si el correo está configurado, sin mostrar la clave.

Otros ajustes relacionados

  • emailchangeconfirmation = 0: el cambio de correo se guarda directamente (sin servidor de correo no se podía confirmar). apply-pending-emails.php aplica los cambios que quedaron pendientes.
  • allowaccountssameemail = 0: no puede haber dos cuentas con el mismo correo.
  • Soporte: nombre "Soporte Academia Deltamontero", disponible para usuarios registrados; sin enlace a la documentación de Moodle.

Procedimiento de configuración y problemas conocidos: Operación.

En esta página