Ir al contenido

Registro de cambios

Aquí se recogen los cambios que afectan a la API pública o a los SDK. Los paquetes de los SDK siguen el versionado semántico; sus registros de cambios detallados se publican con cada versión en npm.

SendGrid deja de ser compatible (octubre de 2026)

Sección titulada «SendGrid deja de ser compatible (octubre de 2026)»

Desde el 1 de octubre de 2026, SendGrid ya no está disponible como proveedor de correo. Si enviabas a través de un servicio de SendGrid, cámbiate a otro proveedor de API como Resend, Postmark, Mailgun, Brevo o Mailjet y luego elige el nuevo servicio en tus plantillas (también como servicio de respaldo, si lo usabas ahí).

Traducciones de plantillas (septiembre de 2026)

Sección titulada «Traducciones de plantillas (septiembre de 2026)»

Una misma plantilla ya se puede enviar en muchos idiomas; consulta Traducciones de plantillas.

  • Panel: una barra Idiomas en el editor de plantillas. Añade hasta 29 variantes de idioma por plantilla (cualquier idioma BCP 47, p. ej. hu o pt-BR): como copia del idioma predeterminado, vacías o mediante traducción automática. Las variantes traducen el asunto, el HTML, el texto y el nombre del remitente; los destinatarios, los parámetros y los ajustes siguen siendo comunes. Cada variante tiene sus propias versiones y su reversión, y las etiquetas Desactualizada / Automática. El idioma predeterminado de la plantilla puede ser cualquier idioma (Ajustes → General → Idioma predeterminado). La exportación y la importación incluyen las variantes.
  • Traducción automática con tu propia clave: OpenAI, Anthropic, Google Gemini o DeepL con la clave API propia de tu organización (Ajustes → Traducción automática, propietarios y administradores). Frontmail comprueba que los parámetros, los enlaces y la estructura HTML se mantienen (translation_invalid). 30 traducciones por hora y organización, hasta 60 000 caracteres. Nuevos códigos de error translation_not_configured, translation_invalid, translation_provider_auth y translation_provider_error.
  • API: locale opcional en POST /v1/send y en los elementos de /v1/send-batch, campo de formulario fm_locale en POST /v1/send-form (un campo llamado locale sigue siendo un parámetro de la plantilla). Resolución: idioma exacto → mismo idioma base (de-AT → de) → idioma predeterminado; una etiqueta mal formada da 400 invalid_body. Las respuestas de envío y los resultados por lotes devuelven el locale usado; GET /v1/templates devuelve locales. Las respuestas automáticas siguen el idioma del mensaje original y Reenviar lo mantiene. Las rutas compatibles con EmailJS usan siempre el idioma predeterminado.
  • Formato: las fechas, los números, los importes y el pie del plan Free siguen ahora el idioma en que se envía el correo (antes, el idioma de la organización).
  • SDK de JavaScript (próxima versión, 0.2.0, junto con el refuerzo de seguridad de los SDK que se describe más abajo): opción locale en send / sendForm (sendForm la envía como fm_locale), prop locale en <FrontmailForm> (React, Vue, Svelte) y en use:frontmailForm, result.locale; @frontmail/node: locale en send y en los elementos de sendBatch, templates.list() devuelve locales y frontmail types genera los idiomas de cada plantilla y un tipo <TemplateName>Locale. @frontmail/emailjs-compat no cambia (solo idioma predeterminado).
  • SDK de Android / Kotlin 0.2.0: SendOptions(locale = "de"), SendResult.locale.
  • SDK de iOS / Swift 0.2.0: SendOptions(locale: "de"), SendResult.locale.

Refuerzo de seguridad: borde de la API pública y claves (septiembre de 2026)

Sección titulada «Refuerzo de seguridad: borde de la API pública y claves (septiembre de 2026)»

Cambios de comportamiento; revisa tu integración:

  • Las solicitudes sin Origin ni Referer (servidores, curl, apps nativas) con la clave pública ahora necesitan Permitir apps móviles, también cuando tu lista de sitios web permitidos está vacía. Antes, una lista vacía las aceptaba. A las organizaciones que enviaron solicitudes de este tipo en los últimos 30 días se les activó el interruptor automáticamente. En caso contrario: 403 origin_not_allowed (details.reason: "no_origin"). En servidores, usa una clave privada.
  • Se rechazan las claves privadas desde navegadores: una solicitud con clave privada (Authorization: Bearer o el campo accessToken al estilo de EmailJS) que lleve la cabecera Origin recibe el nuevo error 403 private_key_in_browser. Para herramientas internas se puede habilitar en Seguridad → Permitir claves privadas en navegadores.
  • La CAPTCHA de las solicitudes sin Origin se verifica con el widget móvil compartido de Frontmail solo si Permitir apps móviles está activado. Las claves de prueba de Cloudflare se rechazan en producción.
  • Consulta del estado: envía el token de estado en la cabecera X-Frontmail-Status-Token; ?token= sigue funcionando para los SDK antiguos.
  • Límites de frecuencia: los clientes IPv6 comparten el límite por IP por cada red /64. Los límites por clave y por organización y la detección de anomalías ahora solo cuentan las solicitudes que han superado las comprobaciones de plantilla y CAPTCHA, así que una avalancha de solicitudes no válidas ya no bloquea a tus visitantes reales.
  • Adjuntos: se limpian los nombres de archivo (caracteres invisibles o bidireccionales, puntos finales) y se rechazan más tipos peligrosos (HTML, SVG, imágenes de disco, OneNote, Office con macros, .url, .lnk, …). Las subidas con clave pública (POST /v1/uploads) necesitan una plantilla que acepte adjuntos y tienen un presupuesto diario de bytes por organización.
  • template_id / service_id multipart de más de 64 caracteres → 400 invalid_body (antes 500).
  • La API, la API del panel y el inicio de sesión solo aceptan tráfico que pase por el CDN de Frontmail.
  • POST /v1/send, /v1/send-form, /v1/send-batch, /v1/uploads, GET /v1/messages/:id, GET /v1/history, GET /v1/templates y alias compatibles con EmailJS.
  • Formato de error unificado con docs_url; soporte de Idempotency-Key (24 h).
  • Cola de correos retenidos con los estados held / held_service_error y los modos hold / reject.
  • Bloqueo de contenido para los envíos con clave pública a plantillas con destinatario dinámico: CAPTCHA obligatoria (dynamic_recipient_requires_captcha), campos de remitente fijos (dynamic_field_not_allowed), sin parámetros HTML y textos de ≤ 500 caracteres, enlaces solo a dominios permitidos (link_not_allowed) y como máximo 5 correos por destinatario y día. Una dirección From tomada de los parámetros se rechaza en cualquier envío con clave pública. Las respuestas automáticas también están bloqueadas. Nuevos ajustes: security.allowedLinkDomains, security.recipientDailyLimit, enforceLinkAllowlist en la plantilla. Consulta Lista de enlaces permitidos y bloqueo de contenido.
  • @frontmail/browser 0.x (ESM + UMD, fija la versión con SRI), @frontmail/react, @frontmail/react-native, @frontmail/vue, @frontmail/svelte, @frontmail/node con la CLI frontmail types, @frontmail/emailjs-compat.
  • Reintentos automáticos con backoff exponencial y claves de idempotencia; errores tipados.
  • La verificación en dos pasos ahora se exige en todos los métodos de inicio de sesión (incluidos los enlaces de inicio de sesión por correo y Google / GitHub) y solo se puede activar con una dirección de correo verificada.
  • Los enlaces de inicio de sesión y de verificación abiertos en otro navegador piden confirmación (o no inician sesión en ese navegador), así que un enlace que te envíe otra persona no puede iniciar tu sesión en su cuenta.
  • Cambiar el correo de inicio de sesión requiere tu contraseña y la aprobación desde la dirección actual.
  • Los administradores ya no pueden asignar el rol de Facturación; solo el propietario gestiona a los administradores y a los miembros de facturación.
  • Las URL de webhook de los proveedores se ocultan a los lectores y a los miembros de facturación y se pueden regenerar (Generar una nueva URL de webhook).
  • Los servidores SMTP propios deben usar una dirección pública y el puerto 25, 465, 587 o 2525.
  • Los adjuntos de las plantillas solo pueden usar archivos subidos por la misma organización.
  • Las invitaciones al equipo están limitadas por destinatario y por organización; los nombres de organización no pueden contener enlaces.
  • Los datos de seguimiento de clics exportados a analítica ya no contienen query strings (tokens, correos).

Refuerzo de seguridad de los SDK (próxima versión, 0.2.0)

Sección titulada «Refuerzo de seguridad de los SDK (próxima versión, 0.2.0)»
  • Cambio incompatible: los SDK de navegador (@frontmail/browser, React, Vue, Svelte, @frontmail/emailjs-compat) lanzan private_key_in_browser cuando se usa una clave privada (privateKey, accessToken en compat) en un navegador web; @frontmail/node se niega a ejecutarse allí. Para desactivarlo: dangerouslyAllowPrivateKeyInBrowser: true.
  • sendForm omite los campos de contraseña, los campos anti-CSRF y los nombres reservados; nuevo formFields: { include, exclude }.
  • getStatus envía el token de estado en la cabecera X-Frontmail-Status-Token en lugar de ?token=.
  • <TurnstileWebView> de React Native está restringido a la página del widget (orígenes, navegación, mensajes).
  • CDN: sri.json con hashes integrity junto a cada bundle versionado; la documentación usa URL con la versión fijada y Subresource Integrity.
  • Editor de plantillas HTML con vista previa en vivo, parámetros tipados, comprobaciones, versiones y galería (EN/CS).
  • Servicios para SMTP, Mailgun, Amazon SES, Postmark, SendGrid, Mailjet, Brevo, Resend, Gmail y Outlook / Microsoft 365, con conmutación por error (failover) y comprobaciones de estado.
  • Créditos: planes, paquetes de créditos, sobregiro, recarga automática; estadísticas de consumo.

Facturación y créditos (correcciones de seguridad)

Sección titulada «Facturación y créditos (correcciones de seguridad)»
  • Los planes anuales ahora reciben su cuota mensual y su margen de sobregiro en cada mes del periodo (antes solo en el primer mes).
  • El sobregiro usado en los planes anuales se factura cada mes en una factura aparte; el sobregiro usado antes de que termine una suscripción (cancelación, eliminación de la organización) se factura de inmediato.
  • Al pasar de mensual a anual se trasladan los créditos usados en el mes en curso.
  • Los cambios de plan se rechazan mientras la suscripción tenga una factura impagada (409 conflict, details.reason: "subscription_not_active").
  • Los pagos disputados (contracargos) retiran los créditos que compraron; se restauran si se gana la disputa. Los reembolsos se procesan uno a uno.
  • Nuevo: la cola de correos retenidos está limitada por organización; por encima del límite, las solicitudes reciben 402 insufficient_credits con details.reason: "hold_queue_full".
  • Nuevo: los correos enviados con la clave pública no usan el sobregiro ni activan la recarga automática salvo que lo habilites en Facturación → Comprar créditos → Gasto del tráfico con clave pública (desactivado por defecto, también en las organizaciones existentes).
  • Servidores SMTP propios: los fallos que ocurren después de que el servidor haya recibido el mensaje ya no se reembolsan; una protección de la tasa de reembolsos por organización detiene los reembolsos cuando los fallos son anormalmente frecuentes.
  • Los webhooks de los proveedores solo suprimen a los destinatarios reales del mensaje; los webhooks de Amazon SES fijan el tema SNS del primer mensaje firmado. Resend rechaza las plantillas congeladas por una bajada de plan.