Relé SMTP
El relé SMTP permite que el software que solo habla SMTP (CMS, proveedores de autenticación, frameworks, apps heredadas) envíe a través de SpacePost. Los mensajes pasan por el mismo flujo que la API: comprobaciones de dominio, lista de supresión, cuotas, seguimiento y webhooks.
| Ajuste | Valor |
|---|---|
| Host | smtp.spacepost.dev |
| Puerto | 25976 |
| Seguridad | STARTTLS, obligatorio antes de autenticarse |
| Usuario | spacepost (el alias resend también se acepta, para migraciones) |
| Contraseña | Tu clave de API (sp_live_...) |
Conéctate sin TLS y actualiza la conexión con STARTTLS antes de iniciar sesión; el certificado es válido para smtp.spacepost.dev. Todavía no se ofrece TLS implícito (puerto 465), así que en la mayoría de los clientes elige “STARTTLS” o “TLS”, no “SSL”.
La dirección From debe pertenecer a un dominio verificado. Basta con una clave sending_access; una clave restringida a un dominio solo puede enviar desde ese dominio.
Encabezados de control
Sección titulada «Encabezados de control»Añade estos encabezados a tu mensaje para usar funciones para las que SMTP no tiene un campo. SpacePost los consume y no se entregan al destinatario.
| Encabezado | Ejemplo | Efecto |
|---|---|---|
X-SpacePost-Tags |
category=welcome, user_id=u_1042 |
Añade etiquetas. Pares name=value separados por comas; mismas reglas de caracteres que en la API. |
X-SpacePost-Scheduled-At |
2026-11-01T09:00:00Z o in 1 hour |
Programa el correo (hasta 30 días). |
Los demás encabezados X-*, List-Unsubscribe, List-Unsubscribe-Post, In-Reply-To y References se reenvían como encabezados personalizados.
Ejemplos
Sección titulada «Ejemplos»import nodemailer from "nodemailer";
const transport = nodemailer.createTransport({ host: "smtp.spacepost.dev", port: 25976, secure: false, // STARTTLS: the connection is upgraded to TLS before login requireTLS: true, auth: { user: "spacepost", pass: process.env.SPACEPOST_API_KEY },});
await transport.sendMail({ from: "Acme <hello@acme.com>", to: "user@example.com", subject: "Hello over SMTP", html: "<p>It works.</p>", headers: { "X-SpacePost-Tags": "category=welcome", "X-SpacePost-Scheduled-At": "in 10 minutes" },});import os, smtplibfrom email.message import EmailMessage
msg = EmailMessage()msg["From"] = "Acme <hello@acme.com>"msg["To"] = "user@example.com"msg["Subject"] = "Hello over SMTP"msg["X-SpacePost-Tags"] = "category=welcome"msg.set_content("It works.")msg.add_alternative("<p>It works.</p>", subtype="html")
with smtplib.SMTP("smtp.spacepost.dev", 25976) as s: s.starttls() s.login("spacepost", os.environ["SPACEPOST_API_KEY"]) s.send_message(msg)swaks --server smtp.spacepost.dev --port 25976 --tls \ --auth-user spacepost --auth-password "$SPACEPOST_API_KEY" \ --from hello@acme.com --to delivered@test.spacepost.dev \ --header "Subject: Hello" --header "X-SpacePost-Tags: category=test" --body "It works."Cómo se asignan los mensajes
Sección titulada «Cómo se asignan los mensajes»To,CcyReply-Tose toman de los encabezados. Los destinatarios del sobre (RCPT TO) que no están enToni enCcpasan a ser Bcc.- Se conservan las partes HTML y de texto. Se admiten los archivos adjuntos, incluidas las imágenes en línea (
Content-ID). - Un mensaje sin asunto recibe el asunto
(no subject). - Cada destinatario cuenta para tu cuota, igual que con la API.
Límites y códigos de error
Sección titulada «Límites y códigos de error»| Límite | Valor |
|---|---|
| Tamaño del mensaje | 40 MB, respuesta 552 |
| Fallos de autenticación | 10 intentos fallidos por IP en 10 minutos; después se bloquea |
Las respuestas SMTP se corresponden con los errores de la API:
| Situación | Respuesta |
|---|---|
| Cuota diaria o mensual superada | 452 (temporal: tu software reintentará más tarde) |
| Límite de tasa alcanzado | 421 |
Dominio de From no verificado |
553 |
| Clave restringida, equipo pausado, errores de validación, contenido bloqueado | 550 |
| Problema temporal de nuestra parte | 451 |