Ir al contenido

Resend

Resend es una API de correo moderna, pensada para desarrolladores, con un panel limpio y una configuración de dominios rápida. Encaja muy bien en proyectos nuevos que quieren tener el correo transaccional funcionando en minutos.

Elige Resend si empiezas un proyecto nuevo, te gustan las herramientas sencillas y envías un volumen transaccional de bajo a medio. Su plan gratuito es pequeño, pero suficiente para la mayoría de los formularios de contacto. Para volúmenes muy altos al precio más bajo, mira Amazon SES; para marketing y transaccional alojados en la UE, Brevo o Mailjet. Consulta el resumen de los servicios.

  • Una cuenta de Resend.
  • Un dominio verificado (Domains → Add domain). Sin él solo puedes enviar correos de prueba desde onboarding@resend.dev a la dirección de tu propia cuenta; consulta Sandbox y límites.
  • Una clave de API con «Sending access» (no «Full access»): API Keys → Create API key → Permission: Sending access, restringida si quieres a un solo dominio. Es el permiso mínimo que necesita Frontmail. Probar conexión reconoce una clave solo de envío y la acepta.
  1. Abre Servicios de correo → Añadir servicio → Resend.
  2. Rellena los campos:
Campo Dónde encontrarlo Ejemplo
Clave de API API Keys (se muestra una sola vez) re_123abc456def…
Secreto de firma del webhook Webhooks → tu endpoint → Signing secret whsec_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Máx. de correos por segundo Opcional; por defecto 2/s (el límite predeterminado de equipo de Resend) 2
  1. Haz clic en Verificar y guardar.
  2. El servicio se guarda cuando la comprobación es correcta. Las credenciales se cifran con cifrado de sobre de AWS KMS.

Resend muestra los registros en la página del dominio. Para example.com tienen este aspecto:

; DKIM
resend._domainkey.example.com. TXT "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ…"
; SPF + gestión de rebotes en el subdominio "send" (el remitente del sobre)
send.example.com. MX 10 feedback-smtp.us-east-1.amazonses.com.
send.example.com. TXT "v=spf1 include:amazonses.com ~all"
; DMARC (recomendado por Resend, no se crea automáticamente)
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"
  • El subdominio send lleva el SPF, así que no tienes que tocar el registro SPF de tu dominio principal.
  • El host MX contiene la región que elegiste para el dominio (us-east-1, eu-west-1, …).
  • Algunos proveedores de DNS añaden el dominio automáticamente: introduce resend._domainkey y send como nombres de host, no los nombres completos.
  • Empieza DMARC en p=none y luego endurécelo a p=quarantine / p=reject.

Al añadir un dominio, Resend te deja elegir su región de envío, p. ej. Virginia del Norte (us-east-1), Irlanda (eu-west-1), São Paulo (sa-east-1) o Tokio (ap-northeast-1). El endpoint de la API (api.resend.com) es el mismo para todas las regiones, así que en Frontmail no hay campo de región: la región es una propiedad del dominio. Para cambiarla, vuelve a añadir el dominio con la nueva región y actualiza el DNS.

  • Sin un dominio verificado solo puedes enviar desde onboarding@resend.dev y solo a la dirección de correo de tu cuenta de Resend. Cualquier otro envío falla con 403 – You can only send testing emails to your own email address, que Frontmail trata como un error de auth.
  • Plan gratuito: 3000 correos al mes, 100 al día, 1 dominio.
  • Límite de velocidad: 2 solicitudes por segundo por equipo por defecto; por eso el valor predeterminado de Frontmail para Resend es 2/s. Resend puede subirlo si lo pides.
  • Si superas la cuota diaria o mensual, se devuelve 429 daily_quota_exceeded / monthly_quota_exceeded; los reintentos no sirven hasta que se renueva la cuota, así que esos mensajes suelen acabar como failed y se devuelve el crédito.
  1. Copia la URL del webhook de la página del servicio en Frontmail (botón de copiar):

    https://api.frontmail.dev/webhooks/providers/resend/<token>
  2. En Resend, abre Webhooks → Add endpoint, pega la URL y selecciona los eventos:

Evento de Resend Evento de Frontmail
email.delivered delivered
email.bounced (Permanent) bounced: se añade a la lista de supresión
email.bounced (Transient / otros) se registra como rebote temporal
email.delivery_delayed se registra en el mensaje
email.complained complained: se añade a la lista de supresión
email.opened opened (activa el seguimiento de aperturas en el dominio)
email.clicked clicked (activa el seguimiento de clics en el dominio)
  1. Abre el endpoint, copia el Signing secret (whsec_…) y pégalo en el campo Secreto de firma del webhook de Frontmail.

Verificación de la firma: Resend entrega los webhooks a través de Svix. Frontmail comprueba las cabeceras svix-id, svix-timestamp y svix-signature (HMAC-SHA256 de id.timestamp.body con tu secreto de firma) y rechaza las solicitudes cuya marca de tiempo se desvía más de 5 minutos. Sin el secreto, los eventos no se verifican y se ignoran.

Frontmail añade a cada correo una etiqueta con su ID de mensaje para poder asociar los eventos.

  • auth: el servicio no funciona (clave no válida o eliminada, dominio sin verificar, restricciones del modo de prueba, 401/403). El servicio se marca como unhealthy; el propietario recibe un correo y un aviso en el panel. Si la plantilla tiene un servicio de respaldo, este toma el relevo; si no, se devuelve el crédito y el mensaje espera en la cola de correos retenidos como held_service_error y se envía automáticamente cuando arreglas el servicio (se vuelve a comprobar al guardar y en la comprobación de estado diaria).
  • permanent: este mensaje no se puede enviar (destinatario no válido, error de validación 422). Servicio de respaldo si está configurado; si no, failed y se devuelve el crédito.
  • transient: 5xx, 429, tiempos de espera agotados. Se reintenta con espera exponencial; tras el último intento, failed y se devuelve el crédito.
Respuesta de Resend Clase Qué hacer
401 missing_api_key / 403 invalid_api_key auth Crea una nueva clave con Sending access y actualiza el servicio.
403 validation_error – The example.com domain is not verified auth Completa la verificación del dominio en Resend o corrige el dominio del From en la plantilla.
403 validation_error – You can only send testing emails to your own email address auth Verifica tu propio dominio; el remitente de prueba resend.dev es solo para tu propia bandeja de entrada.
422 validation_error – Invalid to field permanent Consulta destinatario no válido.
422 invalid_attachment / 422 validation_error (otros campos) permanent Corrige la plantilla o el adjunto; consulta Plantillas HTML.
429 rate_limit_exceeded transient Demasiadas solicitudes por segundo; mantén Máx. de correos por segundo en 2 o pide más a Resend.
429 daily_quota_exceeded / monthly_quota_exceeded transient Cuota agotada; mejora el plan.
500 internal_server_error, tiempo de espera agotado transient Caída de Resend: Frontmail reintenta.
  • Dominio verificado: TXT resend._domainkey + MX y TXT de send
  • Registro DMARC publicado (p=none para empezar)
  • Clave de API solo con Sending access
  • Probar conexión funciona
  • Dirección From de la plantilla en el dominio verificado (no resend.dev)
  • Endpoint de webhook con delivered, bounced, complained (+ opened/clicked)
  • Secreto de firma (whsec_…) copiado en Frontmail