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.
| Variable | Valor en producción | Ajuste de Moodle |
|---|---|---|
MOODLE_SMTP_HOST | smtp.office365.com | smtphosts (con el puerto) |
MOODLE_SMTP_PORT | 587 (por defecto) | smtphosts |
MOODLE_SMTP_SECURE | tls = STARTTLS (por defecto) | smtpsecure |
MOODLE_SMTP_USER | la cuenta de envío | smtpuser; autenticación LOGIN |
MOODLE_SMTP_PASSWORD | solo en Coolify, en modo literal | smtppass |
MOODLE_SMTP_FROM | vacío | remitente; si está vacío se usa MOODLE_SMTP_USER |
MOODLE_MAIL_DIVERT_TO | vacío | desvío de pruebas (local_deltamodules/mail_divert_to) |
MOODLE_NOREPLY_EMAIL | noreply@deltamontero.com (ejemplo de .env.example) | noreplyaddress solo si no hay SMTP |
MOODLE_SUPPORT_EMAIL | soporte@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
noreplyaddresses la misma cuenta,emailonlyfromnoreplyaddress = 1yemailfromvia = 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.139si 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ámetro | Valor | Dónde se cambia |
|---|---|---|
| Correos por minuto | 20 por defecto (máximo 30) | Correos de la Academia |
| Correos por día | 2000 por defecto (máximo 10 000) | Correos de la Academia |
| Reintentos | Hasta 3 intentos; espera de 5 minutos tras el primero y de 10 tras el segundo | Código (MAXTRIES) |
| Pausa | Detiene todos los envíos; lo pendiente queda en cola | Correos de la Academia → Pausar los envíos |
| Retención del registro | 180 días | Có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_mailen el contenedormoodle-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
| Clave | Correo | Cuándo |
|---|---|---|
reset | Recuperar contraseña | Al usar "¿Olvidó su contraseña?"; enlace válido 1 hora |
welcome | Bienvenida al personal | Al crear la cuenta de un colaborador: su usuario y un enlace para crear la contraseña, válido 7 días |
clientwelcome | Cuenta de cliente creada | Cuando el empleado de una empresa cliente crea su cuenta con el código |
clientcode | Código para una empresa cliente | Al enviar el código de registro desde Clientes |
candidatecode | Código de prueba técnica | Al enviar el código de acceso desde Postulantes |
candidatedone | Prueba técnica recibida | Cuando el postulante envía su prueba (sin la nota) |
module | Módulo asignado | Cuando a alguien que ya entró a la Academia se le asigna un módulo nuevo |
completed | Módulo terminado y certificado | Al completar un módulo, con el enlace al certificado |
reminder | Recordatorio de módulos pendientes | Los lunes, a quien tiene módulos sin terminar y no entra hace 14 días (como máximo cada 14 días) |
test | Correo de prueba | Desde 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:
- Al poner el correo en cola se guarda un marcador en lugar del enlace: el registro nunca contiene un enlace válido.
- Al enviarlo se genera un código aleatorio; en la tabla
local_deltamodules_pwtokense guarda solo su hash SHA-256, con su propósito y su vencimiento. - La página
local/deltamodules/setpassword.phpguarda 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. - 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.phpaplica 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.
Seguridad
HTTPS y proxy, cabeceras y límites, contraseñas, MFA, políticas y LOPDP, derechos sobre los datos, datos enviados a la IA, seguridad de exámenes, secretos y datos personales en respaldos.
Inteligencia artificial
Chat de IA actual con local_ai_manager, block_ai_chat y Groq; niveles por perfil, persona, agente de acciones, servicio MCP y plan de la Fase 5 con Dify.