Anhänge
attachments ist ein Array mit bis zu 50 Objekten. Jeder Anhang braucht einen filename und genau eines von content oder path.
filenamestringerforderlich1 bis 255 Zeichen. Wird dem Empfänger angezeigt.
contentstringoptionalDateiinhalt als Base64. Das SDK akzeptiert auch einen Buffer/Uint8Array und kodiert ihn für dich. Verwende dieses Feld oder path.
pathstringoptionalEine öffentliche https-URL. SpacePost lädt sie herunter, wenn die E-Mail gesendet wird. Verwende dieses Feld oder content.
content_typestringoptionalMIME-Typ, etwa application/pdf. Alias contentType im SDK.
content_idstringoptionalMacht den Anhang zu einem Inline-Anhang, den du in deinem HTML als cid:<content_id> referenzieren kannst. Alias contentId im SDK.
- Die gesamte Nachricht muss einschließlich aller Anhänge nach der Base64-Kodierung unter 40 MB liegen. Base64 bläht Dateien um etwa 33 % auf, halte die Rohgröße deshalb insgesamt unter etwa 30 MB.
- URL-Anhänge (
path) müssenhttpsverwenden, auf eine öffentliche Adresse auflösen (private Netzwerke werden abgelehnt), werden mit einem Timeout von 10 Sekunden abgerufen und dürfen nicht weiterleiten. Schlägt der Abruf fehl, wird die E-Mail alsfailedmarkiert. - Die Bytes der Anhänge werden aus dem Speicher entfernt, sobald die E-Mail gesendet wurde; im Log bleiben nur Metadaten (Name, Typ, Größe) erhalten.
Datei per Inhalt anhängen
Abschnitt betitelt „Datei per Inhalt anhängen“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)\" }] }"Unter macOS verwendest du base64 -i invoice-1042.pdf (ohne -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}], },)Datei per URL anhängen
Abschnitt betitelt „Datei per URL anhängen“{ "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" }]}Inline-Bilder
Abschnitt betitelt „Inline-Bilder“Setze eine content_id und referenziere sie in deinem HTML mit einer cid:-URL.
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" }],});Inline-Bilder werden als Teil der Nachricht gesendet und ohne Netzwerkanfrage angezeigt, doch viele Clients (insbesondere Gmail im Web) stellen sie am besten dar, wenn sie klein sind. Hoste große Bilder auf deinem eigenen CDN und verwende eine normale https://-URL.