MailerWire 开发者 API 文档
单套 API 统一接入事务邮件,具备确定性配额避让、24小时幂等防重与全链路审计追溯能力。
最后更新:2026 年 9 月 13 日
概述与架构理念
MailerWire 是定位关键业务的事务邮件路由控制面。连接您现有的 Resend 或 Brevo 供应商后,业务系统只需对接一套 API。当首选供应商用尽每日或每月限额时,MailerWire 自动按策略切换至备用出口;当供应商抛出业务异常或网络未明时,严格坚持“不盲目重投”,从根源杜绝重复发信。
请求基础地址 (Base URL)
所有事务发信请求均统一提交至 MailerWire API 接口地址:
POST
/v1/emails基于标准 HTTPS 443 端口与 TLS 加密传输。
鉴权与认证机制
所有的 API 请求均需携带在控制台「项目与 API Key」(/app/api-keys) 中生成的密钥。密钥格式为 mw_live_<public_id>_<secret>,创建时仅展示一次。
Authorization 请求头
Authorization: Bearer mw_live_<public_id>_<secret>
安全须知: 请妥善保管私密 API Key。切勿在前端网页、移动端 App 等客户端环境中明文暴露。
幂等防重保障 (Idempotency)
针对验证码、交易凭据、密码重置等关键事务场景,MailerWire 强制要求携带 Idempotency-Key 请求头,防止因网络波动、客户端重发导致用户收到多封邮件。
- 必填请求头:Idempotency-Key(最大 128 字符)。
- 单 API Key 维度拥有 24 小时幂等缓存窗口。
- 相同 Key 在窗口内重复提交时,直接返回首次受理记录,绝不会向供应商触发二次投递。
Header Example
Idempotency-Key: order_20260906_983210
发送事务邮件 (Send Email)
提交一封邮件进入调度队列,按当前路由策略择机投递。
POST
/v1/emails请求头要求 (Request Headers)
| 参数字段 | 类型 | 是否必填 | 详细说明 |
|---|---|---|---|
| Authorization | string | 必填 | Bearer mw_live_... |
| Idempotency-Key | string | 必填 | 业务唯一防重标识(最长 128 字符) |
| Content-Type | string | 必填 | application/json |
请求体参数 (Body Parameters)
| 参数字段 | 类型 | 是否必填 | 详细说明 |
|---|---|---|---|
| from | string | 必填 | 发件人地址。格式如 notify@acme.com 或 Acme <notify@acme.com>。需在供应商后台通过域名校验。 |
| to | string | 必填 | 单个收件人邮箱。为了保证事务邮件确定性与幂等追踪,单次请求仅支持单个收件人。 |
| subject | string | 必填 | 邮件标题(最大 500 字符)。 |
| text | string | 可选* | 纯文本格式邮件正文(最大 100KB)。text 与 html 至少填写一项。 |
| html | string | 可选* | HTML 富文本格式邮件正文(最大 100KB)。text 与 html 至少填写一项。 |
响应结果 (202 Accepted)
为了保障极致的高吞吐与低延迟,MailerWire 采用异步排队机制。返回 202 状态码即代表系统已完成校验、幂等登记并进入投递队列。
HTTP 202 Accepted
{
"id": "b4d1d94c-87d2-4328-971c-7f55f24209bf",
"status": "accepted",
"submitted_at": "2026-09-06T12:00:00.000Z"
}多语言调用代码示例
curl -X POST https://api.mailerwire.com/v1/emails \
-H "Authorization: Bearer mw_live_your_api_key" \
-H "Idempotency-Key: req_$(date +%s)_order9823" \
-H "Content-Type: application/json" \
-d '{
"from": "Acme Notification <notify@acme.com>",
"to": "alex@example.com",
"subject": "Your verification code: 629103",
"text": "Your verification code is 629103. It expires in 10 minutes.",
"html": "<p>Your code is <strong>629103</strong>.</p>"
}'投递状态与生命周期
每封邮件从提交到最终完成,状态严格遵循确定性状态机流转:
| Status | 状态指示 | 详细说明 |
|---|---|---|
| accepted | 已受理 | 请求已通过鉴权、校验与幂等检查,已进入投递队列等待调度。 |
| sent | 已发送 | 首选供应商连接正常且未达限额,邮件已成功投递。 |
| sent_after_limit_failover | 限额切换后已发送 | 首选供应商达到日或月配额,MailerWire 自动避让并顺利由备选供应商送达。 |
| failed | 发送失败 | 供应商拒绝接收或凭据失效。MailerWire 记录详细原因并停止,绝不跨厂商盲目重投造成重复发信。 |
| limit_rejected | 限额拒发 | 路由策略中的所有供应商均已达配额上限,邮件被安全拒发。 |
Webhook 状态回调与流水同步
在供应商(Resend / Brevo)管理后台配置以下 Webhook 地址,可将真实的“已送达”、“拒收/退信”、“打开”等事件实时回写至 MailerWire 发送记录流水。
Brevo (Transactional Webhooks)
Webhook URL:
https://<your-domain>/api/v1/webhooks/brevoResend (Webhooks)
Webhook URL:
https://<your-domain>/api/v1/webhooks/resend系统错误码速查表
MailerWire 遵循标准 HTTP 规范与结构化错误返回格式:
| 错误代码 (code) | HTTP 状态码 | 含义与解决建议 |
|---|---|---|
| INVALID_API_KEY | 401 | API Key 格式不正确、已被撤销或不存在。 |
| INVALID_INPUT | 400 | 请求参数缺失或格式不合法(如缺少收件人、标题或内容)。 |
| NO_ELIGIBLE_ROUTE | 422 | 当前账户尚未配置并保存任何已启用的邮件供应商连接。 |
| DAILY_LIMIT_REACHED | 422 / Internal | 该供应商已达到配置的单日发信配额上限。 |
| MONTHLY_LIMIT_REACHED | 422 / Internal | 该供应商已达到配置的当月发信配额上限。 |
| PROVIDER_REJECTED | 422 / Attempt | 上游供应商明确拒收该请求或上报凭据失效。 |
