不需要 SDK。Rovela 的 API 只有一个 POST 端点,完整的集成代码不超过 20 行 JavaScript。下面的指南先介绍最简情况,再加入重试和幂等性——这是大多数团队在第一次生产事故后补充的两样东西。
前提条件
您需要一个 Rovela 账号(免费,无需绑卡)、仪表板中的 API Key,以及一个已验证的发信域名。以下示例假设使用 Node.js 18 或更高版本,因为它内置了全局 fetch。相同的代码在安装 node-fetch 后可用于 Node 16,在 Deno 或 Bun 中无需任何修改。
最简发送
向 /emails 发送一个 POST 请求,在 Authorization 头中包含您的 API Key,请求体为 JSON。响应中包含消息 ID,可供后续查询使用。
const res = await fetch('https://api.rovela.dev/emails', {
method: 'POST',
headers: {
'Authorization': 'Bearer re_your_api_key',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
from: 'hello@yourdomain.com',
to: 'user@example.com',
subject: 'Welcome aboard',
html: '<p>Thanks for signing up. Your account is ready.</p>',
}),
})
const { id } = await res.json()
console.log('Sent:', id)添加重试和幂等性
在循环之前生成一次幂等键,并在每次尝试中复用它。这样,网络错误或 5xx 响应都会触发重试,但无论有多少次尝试在服务器端成功,同一封邮件永远只会被发送一次。
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
async function sendWithRetry(payload, retries = 3) {
const key = crypto.randomUUID()
for (let i = 0; i <= retries; i++) {
const res = await fetch('https://api.rovela.dev/emails', {
method: 'POST',
headers: {
'Authorization': 'Bearer re_your_api_key',
'Content-Type': 'application/json',
'Idempotency-Key': key, // same key on every attempt
},
body: JSON.stringify(payload),
})
if (res.status < 500) return res // 2xx or 4xx — stop
await sleep(Math.min(1000 * 2 ** i, 8000)) // backoff, capped
}
throw new Error('send failed after ' + retries + ' retries')
}存储消息 ID
Rovela 返回的 ID 将发送操作与 Webhook 和日志中的投递事件关联起来。请在您自己的数据库中将它与相应的业务记录关联存储。当收到 email.bounced 或 email.complained 的 Webhook 时,payload 中的消息 ID 会告诉您确切对应哪次发送,以及需要更新哪位用户的状态。
环境变量
永远不要将 API Key 写入源代码。使用 process.env.ROVELA_API_KEY,在开发环境中通过 dotenv 从 .env 文件加载,在生产环境中从部署平台的密钥存储中加载。如果 Key 意外泄露,立即在 Rovela 仪表板中轮换;新 Key 立即生效,旧 Key 同时失效。
常见问题
- 我需要使用 Rovela SDK,还是原生 fetch 就够了?
- 原生 fetch 完全可以。Rovela 的 API 是单一 JSON 端点,不需要 SDK。如果您使用 TypeScript 集成,SDK 可以减少样板代码,但它是可选的。
- 需要什么版本的 Node.js?
- Node 18 或更高版本可使用原生全局 fetch。在 Node 16 中,安装 node-fetch 并导入即可。API 本身对版本没有要求,只需支持 HTTPS。
- 如何发送给多个收件人?
- 在 'to' 字段中传入数组,例如 ["alice@example.com", "bob@example.com"]。每个地址会收到邮件的独立副本;各收件人之间互不可见。to、cc 和 bcc 字段均支持字符串或数组。
- 如何同时发送 HTML 和纯文本备选内容?
- 在请求体中同时包含 'html' 和 'text' 字段。无法渲染 HTML 的邮件客户端会显示纯文本版本。Rovela 会自动将两部分打包为 multipart/alternative 格式发送。