DNS del correo

Ver en Markdown

Planifica los registros MX, SPF, DKIM y DMARC de tus proveedores de correo y comprueba los registros de correo de una zona.

En esta página

El asistente de correo calcula los registros que necesita una zona para los proveedores de buzón y de envío elegidos (un único SPF, MX, DKIM, DMARC) y comprueba lo que muestra el DNS público. Estas rutas no aplican nada; un plan se aplica con Lote de registros.

OperaciónRuta
Listar proveedores de correoGET /v1/orgs/{org}/zones/{zone}/email/providers
Planificar los registros de correoPOST /v1/orgs/{org}/zones/{zone}/email/plan
Comprobar los registros de correoGET /v1/orgs/{org}/zones/{zone}/email/check

Listar proveedores de correo

GET /v1/orgs/{org}/zones/{zone}/email/providers

Lista las plantillas de proveedores del asistente de correo, de buzón (mailbox, p. ej. Google Workspace, Microsoft 365, Zoho Mail, Proton Mail, Fastmail), de envío (sending, p. ej. Amazon SES, Resend, Mailgun, SendGrid, Brevo) y other, con los parámetros que pide cada una (con los valores por defecto ya calculados para la zona).

Rol necesario: readonly o superior.

Parámetros

NombreEnTipoObligatorioDescripción
orgrutastring (uuid)SíId de la organización. Cada ruta comprueba que es la del token (si no, 404).
zonerutastring (uuid)SíId de la zona (consulta Listar zonas).

Respuesta

CampoTipoDescripción
items[].idstringId.
items[].namestringNombre.
items[].kindstringUno de mailbox, sending, other.
items[].docsstring
items[].spfarray de stringMecanismos que añade al SPF del dominio.
items[].paramsarray de object
items[].params[].keystring
items[].params[].kindstringUno de text, dkim, cname, select, list.
items[].params[].requiredboolean
items[].params[].defaultstring
items[].params[].selectorstringSelector DKIM donde va el valor (kind dkim/cname).
items[].params[].optionsarray de string
items[].params[].placeholderstring

Errores

EstadoDescripción
404No existe o el token no lo ve (not_found).

Ejemplo

curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/email/providers" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "items": [
    {
      "id": "example",
      "name": "example.com",
      "kind": "mailbox",
      "docs": "example",
      "spf": [
        "example"
      ],
      "params": [
        {}
      ]
    }
  ]
}

Planificar los registros de correo

POST /v1/orgs/{org}/zones/{zone}/email/plan

Calcula los registros de correo que necesita la zona para los proveedores elegidos, comparados con sus registros actuales (el DNS público en una zona externa): un único SPF que une los mecanismos de los proveedores con los existentes (conservando el ~all/-all que hubiera), los MX del proveedor de buzón, las claves DKIM pegadas por el usuario (validadas), los registros de verificación, los subdominios de envío y DMARC (p=none por defecto). También cuenta las búsquedas DNS del SPF resultante (más de 10 es un error).

No aplica nada. Los problemas van en issues (los errores dejan batch nulo). batch se envía tal cual a Lote de registros, primero con dry_run=1. En zonas externas applicable es falso y las acciones son manual.

Rol necesario: readonly o superior.

Parámetros

NombreEnTipoObligatorioDescripción
orgrutastring (uuid)SíId de la organización. Cada ruta comprueba que es la del token (si no, 404).
zonerutastring (uuid)SíId de la zona (consulta Listar zonas).

Cuerpo de la petición

Tipo de contenido application/json. Esquema: EmailPlanInput.

CampoTipoObligatorioDescripción
providersarray de objectSí
providers[].idstringSíId.
providers[].paramsmapa de stringNo
dmarcobject o nullNoNulo conserva el DMARC existente (o añade p=none si no hay).
dmarc.policystringNoUno de none, quarantine, reject.
dmarc.ruastringNoDirección para los informes agregados: ausente conserva la del registro existente, vacía la quita.
spf_allstringNoUno de "", ~all, -all.

Respuesta

CampoTipoDescripción
zonestring
dns_modestringUno de delegated, external.
applicableboolean
recordsarray de object
records[].typestring
records[].namestringRelativo a la zona (@ = la zona).
records[].fqdnstring
records[].contentstring
records[].priorityintegerPrioridad de MX y SRV (null en los demás tipos).
records[].purposestringUno de mx, spf, dkim, dmarc, verification, autoconfig, return_path, tracking.
records[].providerstring
records[].actionstringUno de create, update, keep, manual.
records[].record_idstring
records[].currentstring
deletearray de object
delete[].record_idstring
delete[].typestring
delete[].namestringNombre.
delete[].contentstring
delete[].priorityintegerPrioridad de MX y SRV (null en los demás tipos).
delete[].reasonstringMotivo del cambio. Uno de replaced_mx, duplicate_spf, replaced_dmarc, replaced_record.
batchobject o nullCuerpo para POST …/records/batch.
issuesarray de object
issues[].severitystringUno de error, warning.
issues[].codestring
issues[].fieldstring
issues[].messagestring
issues[].paramsmapa de string
spfobject o null
spf.valuestring
spf.lookupsinteger-1 si no se contaron.
spf.errorstring
dmarcstring

Errores

EstadoDescripción
400Petición mal formada (bad_request).
404No existe o el token no lo ve (not_found).
502dns_unavailable: el DNS público no respondió (zona externa).
503La comprobación no está disponible ahora (zona externa), o busy: demasiadas comprobaciones en curso.

Ejemplo

curl -X POST "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/email/plan" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{
    "providers": [
      {
        "id": "google"
      }
    ],
    "dmarc": {
      "policy": "none"
    }
  }'
200
{
  "zone": "example.com",
  "dns_mode": "delegated",
  "applicable": false,
  "records": [
    {
      "type": "A",
      "name": "example.com",
      "fqdn": "example",
      "content": "203.0.113.10",
      "priority": 0,
      "purpose": "mx",
      "provider": "example",
      "action": "block",
      "record_id": "aa747ff3-b956-4f78-aa3e-6502aeccf60a",
      "current": "example"
    }
  ],
  "delete": [
    {
      "record_id": "aa747ff3-b956-4f78-aa3e-6502aeccf60a",
      "type": "A",
      "name": "example.com",
      "content": "203.0.113.10",
      "priority": 0,
      "reason": "Point www at the new origin"
    }
  ],
  "batch": {},
  "issues": [
    {
      "severity": "error",
      "code": "example",
      "field": "example",
      "message": "",
      "params": {
        "key": "example"
      }
    }
  ],
  "spf": {
    "value": "4f1c2e9a7b3d",
    "lookups": 0,
    "error": ""
  },
  "dmarc": "example"
}

Comprobar los registros de correo

GET /v1/orgs/{org}/zones/{zone}/email/check

Comprueba en resolvedores públicos los registros de correo de la zona, MX presentes y coherentes, un único SPF y sus búsquedas DNS (como mucho 10 con los include y redirect anidados), claves DKIM, DMARC, nombres de correo con proxy, conflictos CNAME y, en zonas delegadas, si el mundo ve los registros de la zona. Cada comprobación es ok, warn, fail o info con un code estable y sus params. El resultado se guarda 60 segundos.

Rol necesario: readonly o superior. refresh=true exige tech.

Parámetros

NombreEnTipoObligatorioDescripción
orgrutastring (uuid)SíId de la organización. Cada ruta comprueba que es la del token (si no, 404).
zonerutastring (uuid)SíId de la zona (consulta Listar zonas).
selectorsconsultastringNoSelectores DKIM adicionales separados por comas (máx. 10).
refreshconsultabooleanNoComprobar de nuevo sin usar el resultado guardado (rol tech).

Respuesta

CampoTipoDescripción
zonestring
dns_modestringUno de delegated, external.
checked_atstring (date-time)Última comprobación.
summaryobject
summary.statusstringUno de ok, warn, fail.
summary.okinteger
summary.warninteger
summary.failinteger
summary.infointeger
providersarray de string
checksarray de object
checks[].idstringId. Uno de mx, spf_record, spf_lookups, spf_policy, dkim, dmarc, proxied, conflicts, world.
checks[].statusstringUno de ok, warn, fail, info.
checks[].codestring
checks[].subjectstring
checks[].messagestring
checks[].paramsmapa de string
publicobject
public.mxarray de string
public.spfarray de string
public.dmarcarray de string
public.dkimarray de object
spfobject o null
spf.lookupsinteger
spf.void_lookupsinteger
spf.truncatedbooleanEl recuento se detuvo en 30 búsquedas.
spf.allstring
spf.treearray de object
spf.problemsarray de object

Errores

EstadoDescripción
403refresh=1 necesita el rol tech.
404No existe o el token no lo ve (not_found).
503La comprobación no está disponible ahora, o busy: demasiadas comprobaciones en curso.

Ejemplo

curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/email/check" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "zone": "example.com",
  "dns_mode": "delegated",
  "checked_at": "2026-10-27T09:30:00Z",
  "summary": {
    "status": "ok",
    "ok": 0,
    "warn": 0,
    "fail": 0,
    "info": 0
  },
  "providers": [
    "example"
  ],
  "checks": [
    {
      "id": "mx",
      "status": "ok",
      "code": "example",
      "subject": "example",
      "message": "",
      "params": {
        "key": "example"
      }
    }
  ],
  "public": {
    "mx": [
      "example"
    ],
    "spf": [
      "example"
    ],
    "dmarc": [
      "example"
    ],
    "dkim": [
      {
        "selector": "google",
        "name": "example.com",
        "value": "4f1c2e9a7b3d",
        "cname": "example"
      }
    ]
  },
  "spf": {
    "lookups": 0,
    "void_lookups": 0,
    "truncated": false,
    "all": "example",
    "tree": [
      {}
    ],
    "problems": []
  }
}

Última actualización:

↑↓ para moverte↵ para abriresc para cerrar