# Servicios locales de desarrollo (SOLO PC local con Docker/Sail)

> Movido desde `CLAUDE.md`, que solo conserva el resumen de una línea. Aplica **únicamente al
> entorno local** (Docker/Sail) — en prod el correo y la cola se gestionan aparte.

## Correo local — Mailpit (para probar correos sin límites)

- Servidor de correo local definido en `docker-compose.yml` como servicio **`mailpit`**
  (`axllent/mailpit`): SMTP en `1025`, UI web en **http://localhost:8025**.
- El `.env` local apunta a Mailpit tanto el mailer principal como el de machinery:
  `MAIL_HOST=mailpit MAIL_PORT=1025` y `MACHINERY_MAIL_HOST=mailpit MACHINERY_MAIL_PORT=1025`.
- Captura **todos** los correos salientes (no llegan a destinatarios reales), sin tope mensual.
  Reemplazó a Mailtrap (que limitaba ~100/mes). La bandeja se vacía al reiniciar el contenedor.
- Arranca solo con `./vendor/bin/sail up -d` (por el `depends_on: mailpit` de `laravel.test`).
- Tras tocar `.env`: `./vendor/bin/sail artisan config:clear` (o `config:cache` de nuevo si estaba
  cacheada).

## Cola de correos — hay que tener el worker corriendo

- `QUEUE_CONNECTION=database`. Los correos de `app/Services/EmailTicket/**` usan
  `Mail::to(...)->queue(...)`, así que **se encolan**: sin worker se quedan en la tabla `jobs` y
  **nunca llegan a Mailpit**.
- Para probar correos, dejar corriendo el worker: `./vendor/bin/sail artisan queue:work --tries=3`.
- Las **notificaciones campanita** (`app/Notifications/**`, `BaseTicketNotification`) NO implementan
  `ShouldQueue` → se envían **síncronas**, no dependen del worker.
