Allegati
attachments è un array di fino a 50 oggetti. Ogni allegato richiede un filename e esattamente uno tra content e path.
filenamestringobbligatorioDa 1 a 255 caratteri. Mostrato al destinatario.
contentstringopzionaleI byte del file in base64. L'SDK accetta anche un Buffer/Uint8Array e lo codifica per te. Usa questo oppure path.
pathstringopzionaleUn URL https pubblico. SpacePost lo scarica quando l'email viene inviata. Usa questo oppure content.
content_typestringopzionaleTipo MIME, ad esempio application/pdf. Alias contentType nell'SDK.
content_idstringopzionaleRende l'allegato inline, referenziabile come cid:<content_id> nel tuo HTML. Alias contentId nell'SDK.
- L’intero messaggio, inclusi tutti gli allegati dopo la codifica base64, deve pesare meno di 40 MB. Base64 gonfia i file di circa il 33%, quindi tieni il totale grezzo sotto i 30 MB circa.
- Gli allegati via URL (
path) devono usarehttps, devono risolvere a un indirizzo pubblico (le reti private vengono rifiutate), vengono scaricati con un timeout di 10 secondi e non devono fare redirect. Se il download fallisce, l’email viene contrassegnata comefailed. - I byte degli allegati vengono rimossi dall’archivio una volta inviata l’email; nel log restano solo i metadati (nome, tipo, dimensione).
Allegare un file per contenuto
Sezione intitolata “Allegare un file per contenuto”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)\" }] }"Su macOS usa base64 -i invoice-1042.pdf (senza -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}], },)Allegare un file tramite URL
Sezione intitolata “Allegare un file tramite 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" }]}Immagini inline
Sezione intitolata “Immagini inline”Imposta un content_id e referenzialo con un URL cid: nel tuo 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" }],});Le immagini inline vengono inviate come parte del messaggio e si visualizzano senza una richiesta di rete, ma molti client (Gmail sul web in particolare) le mostrano meglio quando sono piccole. Per le immagini grandi, ospitale sulla tua CDN e usa un normale URL https://.