Documentación de Mentat — en evolución continua.
IngenieríaNotificaciones por email

Notificaciones por email

Mentat manda emails transaccionales con Resend en dos situaciones: la notificación de una solicitud de acceso (al admin) y los side effects de tipo notification de las Actions.

El remitente (FROM)

El FROM se configura con la env var MENTAT_FROM_EMAIL de las Cloud Functions. Por defecto usa el sandbox de Resend (onboarding@resend.dev), que solo entrega al owner de la cuenta. Para entregar a destinatarios reales hay que verificar un dominio propio.

Verificar el dominio (una vez)

⚠️

Esto entrega correos a usuarios reales en vez de que caigan en spam. Es un paso de ops que se hace una sola vez por dominio.

  1. En Resend → Domains → Add Domain: agregá un subdominio de envío (recomendado, ej. send.tudominio.com) para no chocar con el correo existente del dominio raíz.
  2. Resend genera ~3 registros DNS (MX, SPF, DKIM). Cargalos en tu proveedor de DNS exactamente como los da (en el campo “name” poné solo el prefijo; el proveedor le agrega el dominio).
  3. Verificá en Resend (propaga en minutos).
  4. Seteá MENTAT_FROM_EMAIL="Mentat <noreply@send.tudominio.com>" en apps/functions/.env y redeployá la función que envía (onAccessRequestCreated, y las que corran side effects de notificación).

MENTAT_FROM_EMAIL vive en apps/functions/.env (no versionado). El valor queda aplicado en la función desplegada; si se redeploya desde un clon sin esa línea, el FROM vuelve al sandbox — re-setearla.

Side effects de notificación (Actions)

Una Action puede mandar un email cuando se ejecuta, declarando un side effect:

{ "type": "notification", "config": {
    "to": ["soporte@cliente.com"],
    "subject": "Ticket {{ticket}} cerrado",
    "body": "El ticket fue cerrado por el operador." } }

El body/subject admiten placeholders {{nombreParametro}}. Es best-effort: si el envío falla, el cambio del modelo igual se aplicó y la ejecución queda partial (no se pierde el trabajo). Ver Actions.

Resiliencia

El email de solicitud de acceso está desacoplado del submit (corre en un trigger aparte): si Resend está caído, la solicitud igual se guarda y el admin puede verla.