Anexos
attachments é um array com até 50 objetos. Cada anexo precisa de um filename e de exatamente um entre content e path.
filenamestringobrigatórioDe 1 a 255 caracteres. Exibido ao destinatário.
contentstringopcionalBytes do arquivo em base64. O SDK também aceita um Buffer/Uint8Array e o codifica para você. Use este campo ou path.
pathstringopcionalUma URL https pública. O SpacePost a baixa quando o e-mail é enviado. Use este campo ou content.
content_typestringopcionalTipo MIME, como application/pdf. Alias contentType no SDK.
content_idstringopcionalTorna o anexo inline, referenciável como cid:<content_id> no seu HTML. Alias contentId no SDK.
Limites
Seção intitulada “Limites”- A mensagem inteira, incluindo todos os anexos após a codificação em base64, deve ter menos de 40 MB. O base64 aumenta os arquivos em cerca de 33%, então mantenha o total bruto abaixo de aproximadamente 30 MB.
- Os anexos por URL (
path) devem usarhttps, devem resolver para um endereço público (redes privadas são recusadas), são buscados com um timeout de 10 segundos e não podem redirecionar. Falhas na busca marcam o e-mail comofailed. - Os bytes dos anexos são removidos do armazenamento assim que o e-mail é enviado; apenas os metadados (nome, tipo, tamanho) permanecem no log.
Anexar um arquivo por conteúdo
Seção intitulada “Anexar um arquivo por conteúdo”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)\" }] }"No macOS, use base64 -i invoice-1042.pdf (sem -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}], },)Anexar um arquivo por URL
Seção intitulada “Anexar um arquivo 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" }]}Imagens inline
Seção intitulada “Imagens inline”Defina um content_id e referencie-o com uma URL cid: no seu 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" }],});As imagens inline são enviadas como parte da mensagem e aparecem sem uma requisição de rede, mas muitos clientes (o Gmail na web, em particular) as exibem melhor quando são pequenas. Para imagens grandes, hospede-as na sua própria CDN e use uma URL https:// normal.