# Canales de notificación

Para una conexión telefónica paso a paso, consulte [Conecte la aplicación](connect-app.md).

## Configurar en la consola

1. Abra **Notificaciones** y elija la aplicación Bark, Pushover, Webhook o Mailwake.
2. Complete los campos del canal seleccionado a continuación. Para la aplicación Mailwake, primero [emparejar el teléfono](connect-app.md), luego elija el teléfono receptor.
3. Elija la vista previa, el idioma de notificación y el recuento de reintentos. Un recuento de reintentos de 0 hace un intento.
4. Guarde y luego envíe explícitamente una notificación de prueba. Verifique el teléfono o el receptor del webhook y el resultado de la entrega.

La configuración se aplica a todos los buzones. Cambiar la configuración preserva el trabajo en cola de acuerdo con su plan de entrega existente; verificar el comportamiento futuro con un nuevo mensaje.

## Configuración de canales

Configurar el canal global a través de `/api/v1/settings/delivery`, enviando su `revision` actual. El canal, la vista previa, el recuento de reintentos y el idioma de notificación se aplican a todos los buzones. Todas las credenciales están cifradas y son de solo escritura; Las credenciales omitidas se conservan si el destino no cambia. Al cambiar una dirección de Bark guardada, debe volver a introducir la clave del dispositivo.

| Canal      | Parámetros                                                                                                                                           | Credenciales                                                                             |
| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| `bark`     | `bark.endpoint`, predeterminado `https://api.day.app`                                                                                                | `bark.key`                                                                               |
| `pushover` | ninguno                                                                                                                                              | `pushover.token` , `pushover.user`                                                       |
| `webhook`  | HTTPS, consulta permitida                                                                                                                            | `webhook.url` y `webhook.secret` (al menos 32 caracteres que no sean espacios en blanco) |
| `native`   | Servicio oficial de entrega push de producción por defecto; anular con `MAILWAKE_RELAY_URL`; emparejar teléfonos en la autorización de la aplicación | Identidad de puesto cifrada y generada localmente                                        |

Las URL de webhook son de solo escritura porque las rutas y consultas pueden contener credenciales de enrutamiento. `preview` acepta `off` o `subject`; `retry_count` acepta 0–9 y el valor predeterminado es 0; `language` acepta [nueve códigos de catálogo y sus alias regionales](api.md#idiomas-y-códigos-de-error) y el valor predeterminado es `en`. Bark y Pushover muestran solo el asunto con `subject`; Webhook conserva el remitente y el asunto estructurados, mientras que su `message` también contiene solo el asunto. `off` (y un asunto vacío) utiliza el mensaje localizado "Correo nuevo". Los títulos permanecen `{display name} · {folder}`; Bark agrupa las notificaciones con ese mismo título truncado. El texto de notificación de prueba no ha cambiado. La entrada API `sender_subject` devuelve 400 `config_preview_invalid`. Para canales de terceros, cambiar de `subject` a `off` elimina atómicamente al remitente y al asunto de todos los registros pendientes y fallidos; Las colas posteriores también siguen la política de privacidad guardada. El envío de notificaciones nativas siempre registra el remitente y el asunto conservando la preferencia de vista previa de terceros.

La retención del historial de Bark sigue la configuración del historial de guardado de la aplicación Bark para notificaciones de correo y de prueba.

### Carga útil del webhook

El puesto envía un `POST` con un cuerpo JSON y nunca sigue redirecciones:

```json
{
  "version": 1,
  "id": "3f9c…",
  "test": false,
  "mailbox_id": "mbx_example",
  "account": "Work mailbox",
  "folder": "Clients",
  "sender": "anna@example.org",
  "subject": "Re: Q4 proposal",
  "received_at": "2026-09-28T10:32:00Z",
  "title": "Work mailbox · Clients",
  "message": "Re: Q4 proposal"
}
```

`mailbox_id` es el ID del buzón estable; `account` es su nombre para mostrar en el momento de la puesta en cola. Las notificaciones ordinarias de Bark, Pushover y Webhook utilizan el título `{display name} · {folder}` en todos los idiomas compatibles. Cambiar el nombre o eliminar un buzón conserva los metadatos de identidad de las tareas que ya están en cola. Las notificaciones de prueba utilizan texto separado y omiten campos de buzón.

`sender` y `subject` aparecen solo con la vista previa de `subject`. `title` y `message` están localizados y listos para reenviar a ntfy, Gotify y servicios similares. El nombre para mostrar y la carpeta se envían incluso con la vista previa desactivada; Elija una etiqueta adecuada para compartir con su proveedor de notificaciones.

| Encabezado             | Significado                                                                                           |
| ---------------------- | ----------------------------------------------------------------------------------------------------- |
| `X-Mailwake-Event`     | ID de evento, igual a `id`; sin cambios en los reintentos, úselo para deduplicar                      |
| `X-Mailwake-Timestamp` | Tiempo de envío en segundos Unix                                                                      |
| `X-Mailwake-Signature` | `sha256=` seguido de la representación hexadecimal de `HMAC-SHA256(secret, "<timestamp>.<raw body>")` |

Verifique la firma con el mismo secreto usando una comparación de tiempo constante y rechace marcas de tiempo con más de cinco minutos de diferencia:

```python
import hashlib, hmac, time

def verify(secret: bytes, timestamp: str, body: bytes, signature: str) -> bool:
    expected = "sha256=" + hmac.new(secret, timestamp.encode() + b"." + body, hashlib.sha256).hexdigest()
    return abs(time.time() - int(timestamp)) <= 300 and hmac.compare_digest(expected, signature)
```

Cualquier respuesta 2xx cuenta como aceptada. 429 y 5xx siguen la configuración de reintento; otros estados finalizan el intento y registran un fracaso.

Guardar la configuración de notificación valida campos, direcciones, estado de emparejamiento y revisión sin enviar una prueba. Utilice el botón de prueba explícito después de guardar. Las pruebas nativas utilizan el punto final de prueba gratuito fijo del servicio de envío de notificaciones y comparten la cuota de prueba de la aplicación; las notificaciones ordinarias por correo electrónico requieren el derecho de Native Push.
