Aller au contenu

Pièces jointes

attachments est un tableau de 50 objets au maximum. Chaque pièce jointe requiert un filename et exactement un des champs content ou path.

filenamestringrequis

De 1 à 255 caractères. Affiché au destinataire.

contentstringfacultatif

Octets du fichier en base64. Le SDK accepte aussi un Buffer/Uint8Array et l'encode pour vous. Utilisez ce champ ou path.

pathstringfacultatif

Une URL https publique. SpacePost la télécharge lors de l'envoi de l'e-mail. Utilisez ce champ ou content.

content_typestringfacultatif

Type MIME, comme application/pdf. Alias contentType dans le SDK.

content_idstringfacultatif

Rend la pièce jointe « en ligne » : elle est référençable sous la forme cid:<content_id> dans votre HTML. Alias contentId dans le SDK.

  • Le message entier, y compris toutes les pièces jointes après encodage base64, doit peser moins de 40 Mo. Le base64 gonfle les fichiers d’environ 33 %, gardez donc le total brut sous 30 Mo environ.
  • Les pièces jointes par URL (path) doivent utiliser https, doivent résoudre vers une adresse publique (les réseaux privés sont refusés), sont récupérées avec un délai d’attente de 10 secondes et ne doivent pas rediriger. Un échec de récupération marque l’e-mail comme failed.
  • Le contenu des pièces jointes est supprimé du stockage une fois l’e-mail envoyé ; seules les métadonnées (nom, type, taille) sont conservées dans le journal.
attachment.ts
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);
{
"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" }]
}

Définissez un content_id et référencez-le avec une URL cid: dans votre HTML.

inline-image.ts
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" }],
});

Les images en ligne sont envoyées avec le message et s’affichent sans requête réseau, mais de nombreux clients (Gmail sur le web en particulier) les affichent mieux lorsqu’elles sont petites. Pour les grandes images, hébergez-les sur votre propre CDN et utilisez une URL https:// classique.