跳转到内容

批量发送

POST https://api.spacepost.dev/emails/batch

请求体是最多包含 100 个对象的 JSON 数组,每个对象的字段与发送邮件相同。批量发送可以节省往返次数,并且只占用一次速率限制。

batch.ts
import { SpacePost } from "@spacepost/node";
const spacepost = new SpacePost(process.env.SPACEPOST_API_KEY);
const { data, error } = await spacepost.batch.send(
[
{ from: "Acme <hello@acme.com>", to: ["a@example.com"], subject: "Hi Ada", html: "<p>Hi Ada</p>" },
{ from: "Acme <hello@acme.com>", to: ["b@example.com"], subject: "Hi Bob", html: "<p>Hi Bob</p>" },
],
{ idempotencyKey: "weekly-digest-2026-w43" },
);
if (error) console.error(error);
else console.log(data.data.map((e) => e.id)); // ids in input order
Response (200)
{
"data": [
{ "id": "0192e1c4-7a3b-7c1e-9d2f-3b5a8e6f4c10" },
{ "id": "0192e1c4-7a3c-7a02-8e10-6c0f9d7a2b31" }
]
}

返回的 id 顺序与输入数组的顺序一致。

  • 要么全部成功,要么全部失败。 只要数组中有任何一封邮件无效,整个请求就会以 validation_error 失败,且不会存储任何内容。message 会指出是哪一封邮件((email 1))。
  • 配额只检查一次,按收件人总数计算。如果会超出你的限额,整个批次都会被拒绝。
  • 每封邮件都支持完整功能:附件、标签、自定义标头、scheduled_at 和 tenant_id。如果有租户被暂停或超出上限,整个批次都会失败。
  • 幂等键适用于整个批次。使用相同的键可以安全重试。
  • 批次大小上限为 100 封邮件;更大的数组会返回 422。较大的列表请分块发送。
chunks.ts
import { SpacePost, type SendEmailOptions } from "@spacepost/node";
const spacepost = new SpacePost(process.env.SPACEPOST_API_KEY);
export async function sendAll(emails: SendEmailOptions[], jobId: string) {
for (let i = 0; i < emails.length; i += 100) {
const chunk = emails.slice(i, i + 100);
const { error } = await spacepost.batch.send(chunk, { idempotencyKey: `${jobId}-chunk-${i / 100}` });
if (error) throw new Error(`${error.name}: ${error.message}`);
}
}