Archivos adjuntos
attachments es un array de hasta 50 objetos. Cada archivo adjunto necesita un filename y exactamente uno de content o path.
filenamestringobligatorioDe 1 a 255 caracteres. Se muestra al destinatario.
contentstringopcionalBytes del archivo en base64. El SDK también acepta un Buffer/Uint8Array y lo codifica por ti. Usa este campo o path.
pathstringopcionalUna URL https pública. SpacePost la descarga cuando se envía el correo. Usa este campo o content.
content_typestringopcionalTipo MIME, como application/pdf. Alias contentType en el SDK.
content_idstringopcionalHace que el adjunto sea en línea, referenciable como cid:<content_id> en tu HTML. Alias contentId en el SDK.
Límites
Sección titulada «Límites»- El mensaje completo, incluidos todos los archivos adjuntos tras la codificación en base64, debe pesar menos de 40 MB. Base64 aumenta el tamaño de los archivos en un 33 % aproximadamente, así que mantén el total sin codificar por debajo de unos 30 MB.
- Los adjuntos por URL (
path) deben usarhttps, deben resolver a una dirección pública (las redes privadas se rechazan), se descargan con un tiempo de espera de 10 segundos y no deben redirigir. Si la descarga falla, el correo se marca comofailed. - Los bytes de los archivos adjuntos se eliminan del almacenamiento una vez enviado el correo; en el registro solo se conservan los metadatos (nombre, tipo, tamaño).
Adjuntar un archivo por contenido
Sección titulada «Adjuntar un archivo por contenido»import { readFile } from "node:fs/promises";import { SpacePost } from "@spacepost/node";
const spacepost = new SpacePost(process.env.SPACEPOST_API_KEY);
const { data, error } = await spacepost.emails.send({ from: "Acme <billing@acme.com>", to: "user@example.com", subject: "Invoice 1042", text: "Your invoice is attached.", attachments: [{ filename: "invoice-1042.pdf", content: await readFile("invoice-1042.pdf"), contentType: "application/pdf" }],});
console.log(error ?? data);curl -X POST https://api.spacepost.dev/emails \ -H "Authorization: Bearer $SPACEPOST_API_KEY" -H "Content-Type: application/json" \ -d "{ \"from\": \"Acme <billing@acme.com>\", \"to\": [\"user@example.com\"], \"subject\": \"Invoice 1042\", \"text\": \"Your invoice is attached.\", \"attachments\": [{ \"filename\": \"invoice-1042.pdf\", \"content_type\": \"application/pdf\", \"content\": \"$(base64 -w0 invoice-1042.pdf)\" }] }"En macOS usa base64 -i invoice-1042.pdf (sin -w0).
import base64
with open("invoice-1042.pdf", "rb") as f: content = base64.b64encode(f.read()).decode()
requests.post( "https://api.spacepost.dev/emails", headers={"Authorization": f"Bearer {os.environ['SPACEPOST_API_KEY']}"}, json={ "from": "Acme <billing@acme.com>", "to": ["user@example.com"], "subject": "Invoice 1042", "text": "Your invoice is attached.", "attachments": [{"filename": "invoice-1042.pdf", "content_type": "application/pdf", "content": content}], },)Adjuntar un archivo por URL
Sección titulada «Adjuntar un archivo por URL»{ "from": "Acme <billing@acme.com>", "to": ["user@example.com"], "subject": "Your report", "text": "Report attached.", "attachments": [{ "filename": "report.pdf", "path": "https://files.acme.com/reports/2026-10.pdf" }]}Imágenes en línea
Sección titulada «Imágenes en línea»Define un content_id y referéncialo con una URL cid: en tu HTML.
import { readFile } from "node:fs/promises";import { SpacePost } from "@spacepost/node";
const spacepost = new SpacePost(process.env.SPACEPOST_API_KEY);
await spacepost.emails.send({ from: "Acme <hello@acme.com>", to: "user@example.com", subject: "Welcome", html: '<img src="cid:logo" alt="Acme" width="120" /><p>Welcome aboard.</p>', attachments: [{ filename: "logo.png", content: await readFile("logo.png"), contentType: "image/png", contentId: "logo" }],});Las imágenes en línea se envían como parte del mensaje y se muestran sin una petición de red, pero muchos clientes (Gmail en la web en particular) las muestran mejor cuando son pequeñas. Para imágenes grandes, alójalas en tu propia CDN y usa una URL normal https://.