# Correo Microsoft 365 / Outlook con OAuth 2.0

En Configuración → Correo del sistema, el tipo Microsoft 365 permite enviar mediante Microsoft Graph y recibir respuestas de tareas. SMTP sigue disponible.

## Activación en Microsoft Entra

1. Registre una aplicación en Microsoft Entra → Registros de aplicaciones. Para una organización, prefiera una aplicación de un solo directorio.
2. En Autenticación agregue una plataforma **Web**, con la URI exacta que muestra el formulario del sistema. Para el hosting actual:
   `https://www.trust360ec.com/sistema/public/admin/correo-microsoft/callback`
3. Agregue permisos **delegados** de Microsoft Graph: `User.Read`, `Mail.Send`, `Mail.Read` y `offline_access`. Conceda consentimiento administrativo si la política del directorio lo exige.
4. Cree un secreto de cliente. Copie su **valor**, no su identificador. Registre su vencimiento para renovarlo antes de que expire.
5. En el sistema cree o edite la configuración de la empresa. Seleccione Microsoft 365 y complete Tenant ID, Client ID, valor del secreto y correo remitente.
6. El remitente debe coincidir con el correo, el nombre de inicio de sesión o una dirección SMTP verificada que Microsoft devuelva para la cuenta que autoriza. La conexión ignora espacios y diferencias entre mayúsculas y minúsculas. Enviar desde un alias depende también de la configuración de Microsoft 365; comprueba el envío con Probar. Esta versión no permite elegir buzones compartidos.
7. Active «Recibir respuestas de tareas» si corresponde. Guarde y pulse «Conectar Microsoft 365»; inicie sesión en Microsoft con ese mismo buzón y autorice los permisos.
8. Use «Probar» para enviar un correo de prueba. Esta acción envía un correo real al destinatario indicado.

OAuth usa código de autorización, PKCE y estado de un solo uso, ligado al usuario administrador y con caducidad de diez minutos. Tokens y secreto se cifran en la base de datos y no se muestran en el formulario. La renovación se realiza automáticamente. Cambiar empresa, remitente o credenciales requiere reconectar.

## Respuestas de tareas

Los avisos nuevos incluyen una referencia aleatoria por destinatario y tarea cuando la recepción está habilitada. El usuario debe responder desde su correo registrado y conservar esa referencia en el asunto. Los correos enviados anteriormente no pueden vincularse automáticamente.

El programador consulta la bandeja de entrada desde la fecha de conexión, en páginas pequeñas. Procesa una página por buzón y ejecución; un volumen elevado puede tardar varias ejecuciones. No modifica ni elimina mensajes del buzón, no importa correos ajenos a las tareas y no consulta carpetas de spam ni otras carpetas. Evite reglas que muevan estas respuestas fuera de Entrada.

Se verifica la referencia, el correo del destinatario original, el acceso actual a la tarea y la empresa del buzón. Respuestas automáticas y fallos explícitos de autenticación se rechazan. La referencia es confidencial: no reenvíe avisos para que terceros respondan en su nombre. La autenticación del correo también depende de las protecciones antisuplantación de Microsoft 365.

El texto nuevo se registra como **comentario**, con el usuario y la fecha/hora de registro, y queda en la auditoría existente. No interpreta instrucciones ni cambia automáticamente estados, horas, asignaciones o campos. Los adjuntos deben cargarse desde la tarea. Respuestas vacías, HTML sin versión de texto o textos de más de 9800 caracteres no se importan. La recepción se registra por identificador para evitar duplicados y se confirma en la misma transacción que el comentario.

La tabla de configuraciones muestra el buzón conectado, última sincronización y errores legibles. La tabla interna `task_mail_receipts` registra `commented` o `rejected`, sin almacenar cuerpos de correos rechazados. Si Microsoft caduca la sincronización o revoca el acceso, vuelva a conectar. «Desconectar» borra los tokens locales y desactiva la recepción; puede revocar también el consentimiento desde Microsoft.

## Archivos para desplegar

- `app/Console/Commands/ReceiveMicrosoftTaskMail.php`
- `app/Http/Controllers/MicrosoftMailController.php`
- `app/Mail/Transport/MicrosoftGraphTransport.php`
- `app/Mail/WorkTaskNoticeMail.php`
- `app/Models/System/SystemMailConfiguration.php`
- `app/Services/System/MicrosoftMailException.php`
- `app/Services/System/MicrosoftMailService.php`
- `app/Services/System/SystemMailConfigurationService.php`
- `app/Services/Work/TaskMailReceiver.php`
- `app/Jobs/Work/SendWorkTaskNotice.php`
- `app/Filament/Resources/System/SystemMailConfigurationResource.php`
- `app/Providers/AppServiceProvider.php`
- `resources/views/mail/work-task-notice.blade.php`
- `resources/views/filament/navigation/geolocalizacion-flyout.blade.php`
- `routes/web.php`
- `routes/console.php`
- `database/migrations/2026_09_11_000002_add_microsoft_mail_oauth.php`

No hay dependencias Composer nuevas. Conserve el mismo APP_KEY para poder descifrar las credenciales existentes. Configure APP_URL con la URL HTTPS real del sistema.

Desde la raíz del proyecto en el hosting:

```bash
php artisan migrate --force
php artisan optimize:clear
php artisan queue:restart
```

El cron existente debe ejecutar `php artisan schedule:run` cada minuto. No agregue otro si ya existe. La agenda ejecuta `correo:recibir-microsoft` y el procesador de la cola `work-tasks`. No basta con tener la página abierta. El hosting debe permitir HTTPS saliente a login.microsoftonline.com y graph.microsoft.com.

Para una verificación manual, después de conectar y habilitar el buzón:

```bash
php artisan correo:recibir-microsoft
```

Este comando registra comentarios reales para respuestas válidas. Una aceptación HTTP 202 de Graph significa que Microsoft aceptó procesar el envío; no garantiza entrega. Ante un timeout, verifique Enviados antes de repetir: los reintentos de la cola pueden duplicar un envío cuyo resultado fue incierto. El envío directo limita el MIME a 2.8 MB; adjuntos mayores requieren otro flujo.

## Referencias oficiales

- [Flujo de autorización Microsoft con PKCE](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow)
- [Envío MIME mediante Graph](https://learn.microsoft.com/en-us/graph/api/user-sendmail?view=graph-rest-1.0)
- [Sincronización incremental de mensajes](https://learn.microsoft.com/en-us/graph/api/message-delta?view=graph-rest-1.0)
- [Lectura del texto nuevo de una respuesta](https://learn.microsoft.com/en-us/graph/api/message-get?view=graph-rest-1.0)
