RFC 8058: Cancelación de suscripción con un clic para correo electrónico
Por Qué Existe
El encabezado List-Unsubscribe de RFC 2369 tenía un problema fundamental: los clientes de correo no podían actuar de forma segura en la URL automáticamente. Una URL HTTPS podría llevar a una página con CAPTCHA, un formulario de inicio de sesión, un paso de confirmación, o incluso un sitio malicioso. Los clientes tenían que abrir un navegador y dejar que el usuario lo manejara — añadiendo fricción que desalentaba su uso.
RFC 8058 resuelve esto introduciendo el encabezado List-Unsubscribe-Post. Cuando está presente junto a una URL List-Unsubscribe HTTPS, señala que el cliente de correo puede enviar una solicitud HTTP POST directamente para desuscribir al usuario — sin navegador, sin confirmación, un clic.
Desde febrero de 2024, Gmail y Yahoo requieren cumplimiento con RFC 8058 para remitentes masivos (aquellos que envían más de 5,000 mensajes por día a sus usuarios). Esto ya no es opcional para correo comercial.
Cómo Funciona
El mecanismo requiere dos encabezados trabajando juntos:
Encabezados Requeridos
List-Unsubscribe: <https://example.com/unsub?id=abc123>, <mailto:unsub-abc123@example.com> List-Unsubscribe-Post: List-Unsubscribe=One-Click
Cuando el cliente de correo ve ambos encabezados:
- Muestra un botón "Desuscribirse" prominente en la interfaz.
- Cuando el usuario lo hace clic, el cliente envía un HTTP POST a la URL HTTPS de
List-Unsubscribe. - El cuerpo POST es exactamente:
List-Unsubscribe=One-Click - El servidor del remitente procesa el POST y desuscribe al usuario.
La Solicitud HTTP POST
POST /unsub?id=abc123 HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded Content-Length: 26 List-Unsubscribe=One-Click
La Respuesta del Servidor
El servidor debe devolver un estado 200 OK para confirmar que la desuscripción fue exitosa. Cualquier respuesta 2xx indica éxito. El cuerpo de la respuesta no se muestra al usuario, por lo que puede estar vacío o contener una confirmación simple.
Detalles Técnicos Clave
Requisitos de Encabezado
- El valor del encabezado
List-Unsubscribe-Postdebe ser exactamenteList-Unsubscribe=One-Click— sin variaciones. - El encabezado
List-Unsubscribedebe incluir al menos una URL HTTPS (no HTTP). El URI mailto es opcional pero recomendado como alternativa. - Ambos encabezados deben estar presentes en el mismo mensaje.
List-Unsubscribe-PostsinList-Unsubscribeno tiene sentido.
Requisito DKIM
El mensaje debe pasar autenticación DKIM, y la firma DKIM debe cubrir ambos encabezados List-Unsubscribe y List-Unsubscribe-Post. Esto previene que atacantes inyecten o modifiquen URLs de desuscripción en tránsito. Gmail verifica esto explícitamente.
Implementación del Endpoint
; Manejador del servidor mínimo (pseudocódigo) function handleUnsubscribe(request): if request.method != "POST": return 405 Method Not Allowed if request.body != "List-Unsubscribe=One-Click": return 400 Bad Request subscriberId = request.queryParams["id"] suppressRecipient(subscriberId) return 200 OK
Ejemplo de Encabezados de Mensaje Completo
From: newsletter@example.com To: user@gmail.com Subject: Your Weekly Update MIME-Version: 1.0 DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=sel1; h=from:to:subject:list-unsubscribe:list-unsubscribe-post; b=... List-Unsubscribe: <https://example.com/unsub?id=abc123>, <mailto:unsub-abc123@example.com> List-Unsubscribe-Post: List-Unsubscribe=One-Click Content-Type: text/html; charset=utf-8
Errores Comunes
-
Usar HTTP en lugar de HTTPS. La URL en
List-Unsubscribedebe usar HTTPS. Los clientes de correo no enviarán solicitudes POST a endpoints HTTP simples. - Requerir confirmación después del POST. El punto de un clic es un clic. El POST solo debe completar la desuscripción. No envíes un correo de confirmación pidiendo al usuario que "haga clic para confirmar" — esto anula el propósito.
-
No cubrir encabezados en firma DKIM. Si tu firma DKIM no incluye
list-unsubscribeylist-unsubscribe-posten la etiquetah=, Gmail no confiará en los encabezados y no mostrará el botón de un clic. - Devolver errores o redirecciones. El endpoint debe devolver un código de estado 2xx. Devolver redirecciones 301/302, 403 Prohibido, o errores 500 causará que la desuscripción falle y puede desencadenar que el usuario reporte spam en su lugar.
- Expiración de URL. Algunos remitentes usan URLs firmadas con tiempos de expiración cortos. Si la URL expira antes de que el usuario haga clic en "Desuscribirse" (lo que podría ser semanas después de recibir el mensaje), la desuscripción falla. Usa tokens de larga duración o no expiables.
- Desuscripción basada en GET. El endpoint debe manejar POST, no GET. Una URL de desuscripción basada en GET puede ser activada por escáneres de enlaces de correo, bots de vista previa, o herramientas de seguridad — desuscribiendo usuarios que nunca hicieron clic en nada.
-
Omitir la alternativa mailto. Mientras la URL HTTPS maneja un clic, un URI
mailto:proporciona una alternativa para clientes de correo que no soportan RFC 8058. Incluye ambos.
Impacto en Entrega
- Mandato Gmail/Yahoo. Los remitentes masivos (5,000+ mensajes/día) deben implementar RFC 8058. El incumplimiento lleva a aumento del filtrado de spam y posible rechazo. Este es el requisito de entrega más impactante introducido en años recientes.
- Reducción de quejas de spam. La desuscripción de un clic proporciona una alternativa sin fricción a "Reportar Spam". Los usuarios que pueden optar fácilmente no necesitan quejarse, bajando directamente tu tasa de quejas.
- Señal de reputación positiva. La desuscripción de un clic implementada adecuadamente le dice a los proveedores de buzón que eres un remitente responsable que respeta las preferencias del usuario. Esto contribuye a reputación positiva del remitente.
- Experiencia del usuario. Los destinatarios ven un vínculo "Desuscribirse" claro y prominente en Gmail, Yahoo Mail y Apple Mail. Esto genera confianza — los usuarios son más propensos a interactuar con correo cuando saben que pueden detenerlo fácilmente.
- La velocidad de procesamiento importa. Gmail puede verificar que el endpoint POST funciona realmente probándolo. Si tu endpoint es lento o poco confiable, el botón de un clic podría no aparecer. Mantén tiempos de respuesta por debajo de 1 segundo.