2026-09-27 — Alta de dominios en Resend para mailing (camino reutilizable)
Contexto: pedido explícito — “persiste el camino para verificar envío de futuros dominios
para mailing”. Caso de validación: neni.lat (correo de prueba llegó a [usuario]@protonmail).
# ── SCRIPT (ya probado, idempotente) ────────────────────────────────────────
~/nef/bin/resend-link-domain <dominio> [--to=correo] [--poll=6] [--skip-send]
RESEND_API_KEY se lee de ~/nef/surtido/.env si no está en env
CF_ACCOUNT_ID_2 token cfat_ de la cuenta Cloudflare que tiene la zona
(o CF_TOKEN con Zone Read + DNS Write)
hace todo el camino:
1. GET /zones?name=<dominio> → zone id + account id
2. POST /accounts/<aid>/tokens → token con DNS Write, cacheado en
~/.cache/nef/resend-dns-<zoneid> (600)
3. POST https://api.resend.com/domains → devuelve los 4 registros (DKIM/SPF/MX/CNAME)
4. POST /zones/<zid>/dns_records → crea los que falten (CNAME SIN nube naranja)
5. POST /domains/<id>/verify + GET → hasta status=verified (--poll/--sleep)
6. POST /emails → correo de prueba desde <dominio>
# ── PASO A PASO A MANO (si no hay script) ───────────────────────────────────
R=$(grep -E '^RESEND_API_KEY=' ~/nef/surtido/.env | sed 's/^[^=]*=//')
curl -s -A "curl/8.7.1" -X POST -H "Authorization: Bearer $R" \
-H 'Content-Type: application/json' \
-d '{"name":"tudominio.com","region":"us-east-1"}' https://api.resend.com/domains
# → resp.records trae los 4 valores; cárgalos en la zona CF (DNS Write obligatorio)
curl -s -A "curl/8.7.1" -X POST -H "Authorization: Bearer $R" \
https://api.resend.com/domains/<id>/verify
curl -s -A "curl/8.7.1" -H "Authorization: Bearer $R" https://api.resend.com/domains/<id>
# ── GOTCHAS (costaron tiempo el 2026-09-27) ─────────────────────────────────
* Resend rechaza el UA por defecto de urllib → **siempre -A "curl/8.7.1"** (403/1010).
* Token Cloudflare "Account API token" (prefijo cfat_) NO pasa por endpoints de
usuario: /user y /user/tokens/verify dan 9109 aunque sea válido → probar en /accounts.
* Para acuñar token con DNS Write el resource debe ser
{"com.cloudflare.api.account.<aid>":"*"} — "com.cloudflare.api.zone.<zid>" da error 10000.
Permiso DNS Write id: 4755a26eedb94da69e1066d98aa820be · Zone Read: c8fed203ed3043cba015a93ad1616f1f
* CNAME `rsend` **sin proxy** (nube naranja) — con proxy la verificación no cierra.
* Verificación: suele ser ≤15 min, puede tardar hasta 72 h. Resend no re-verifica
dominios ya verified aunque después borres los registros (caso surtido.xyz).
* Correo de prueba aceptado ≠ entregado: revisar inbox+spam y
GET /emails/<id> (errors debe ser None).
# ── EVIDENCIA ───────────────────────────────────────────────────────────────
neni.lat → zona 4f6ccb02798ac15cb165627cd4d77396, cuenta 543d69fcf988942b1053c21adc64a607
alta Resend id c2804b66-a66b-4bd6-9556-44aa80bedff2
registros: TXT resend._domainkey de08623d… · MX send 0dbe245b… · TXT send 4a40169d… ·
CNAME rsend 6b3280ac…
propagación verificada en [IP] / [IP] / [IP] / [IP] + DoH Google/Cloudflare
estado 2026-09-27 15:55: CNAME verified; TXT/MX pending en Resend (re-ejecutar el script)
prueba: 01a0e4c5-9566-736d-83bc-5ac4a25b9f57 (from [ID-EMAIL]) → llegó a [usuario]@protonmail
token DNS cacheado: ~/.cache/nef/[CREDENCIAL] (600)
(copia en ~/nef/neni_lat/.env_cf_dns_token; id d84886e6ff279d91358efc63c49a17d6)
revocar: DELETE /accounts/543d69fcf988942b1053c21adc64a607/tokens/d84886e6ff279d91358efc63c49a17d6
# ── PENDIENTE ───────────────────────────────────────────────────────────────
* que neni.lat pase a verified (re-correr resend-link-domain neni.lat --poll=8)
* DMARC cuando esté verified: TXT _dmarc.neni.lat "v=DMARC1; p=none; rua=mailto:..."
* otras zonas disponibles en la misma cuenta: neni.boutique, neni.online, neni.store