API v1
邮件分发接口文档
用一次 HTTP 请求,把邮件交给你的 QQ / 163 / 企业邮箱完成投递。接口遵循简单 JSON 约定,成功返回 code: 0。
1. 快速开始
- 注册账号,在控制台「API 密钥」中复制密钥;
- 在「发信邮箱」中添加至少一个 QQ / 163 邮箱,并测试连接;
- 调用
POST /api/v1/send,把收件人、主题、正文传过来。
提示:单次 1-3 个收件人默认同步发送并直接返回结果;超过 3 个或指定
async: true 会进入队列,返回 request_id 供轮询。curl
curl -X POST https://smtp.xueyuanpie.com/api/v1/send \
-H "X-API-Key: sk_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"to": "user@example.com",
"subject": "订单已发货",
"html": "你好,你的包裹已发出。
",
"provider": "qq"
}'
PHP
$ch = curl_init('https://smtp.xueyuanpie.com/api/v1/send');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: sk_live_xxxxxxxxxxxxxxxx',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'to' => 'user@example.com',
'subject' => '订单已发货',
'html' => '你好,你的包裹已发出。
',
'provider'=> 'qq',
]),
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
Python
import requests
resp = requests.post(
'https://smtp.xueyuanpie.com/api/v1/send',
headers={'X-API-Key': 'sk_live_xxxxxxxxxxxxxxxx'},
json={
'to': 'user@example.com',
'subject': '订单已发货',
'html': '你好,你的包裹已发出。
',
'provider': 'qq',
},
timeout=30,
)
print(resp.json())
Node.js
const res = await fetch('https://smtp.xueyuanpie.com/api/v1/send', {
method: 'POST',
headers: {
'X-API-Key': 'sk_live_xxxxxxxxxxxxxxxx',
'Content-Type': 'application/json',
},
body: JSON.stringify({
to: 'user@example.com',
subject: '订单已发货',
html: '你好,你的包裹已发出。
',
provider: 'qq',
}),
});
console.log(await res.json());
2. 鉴权方式
所有 /api/v1/* 接口都需要携带 API 密钥,二选一:
X-API-Key: sk_live_xxxxxxxxxxxxxxxx # 或 Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx
密钥在控制台「API 密钥」中创建,只在创建时完整展示一次,服务端仅保存哈希。泄露后请立即停用并重建。
每个密钥默认限流 120 次/分钟。超限返回 HTTP 429。
3. 分发邮件
POST /api/v1/send Content-Type: application/json
系统会从你的邮箱池中选择一个可用邮箱投递。可用 provider 指定只用 QQ 或 163,也可用 mailbox_id 指定具体邮箱。
4. 请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
to | string / array | 是 | 收件人。支持 "a@b.com"、"张三 <a@b.com>",或数组/对象数组(含 name、vars)。 |
subject | string | 是 | 主题,最长 200 字;支持 {{name}} 变量。 |
html | string | 否* | HTML 正文,最大 2MB。与 text 至少填一个。 |
text | string | 否* | 纯文本正文。未填 html 时会自动生成简单的 HTML。 |
provider | string | 否 | qq / 163 / 126 / exmail_qq 等,限定从该服务商的邮箱中挑选。 |
mailbox_id | int | 否 | 指定发信邮箱 ID,优先级高于 provider。 |
async | bool | 否 | true 时强制入队,立即返回 request_id。 |
interval | int | 否 | 队列内每封间隔毫秒,默认 1500,范围 500-60000。 |
attachments | array | 否 | 附件数组,元素:{"filename","content"(base64),"type"},最多 5 个、合计 8MB。 |
headers | object | 否 | 自定义邮件头,禁止 From / To / Subject 等保留字段。 |
变量替换:正文与主题中的
{{name}}、{{email}} 会按收件人替换;对象数组里的 vars 也可以自定义变量(如 {{order_id}})。5. 返回结构
同步发送:
{
"code": 0,
"msg": "发送完成",
"data": {
"request_id": "req_9f2c1a7b8e3d4c5a",
"mode": "sync",
"accepted": 2,
"queued": 0,
"sent": 2,
"failed": 0,
"task_id": null,
"results": [
{
"to": "a@example.com",
"status": "sent",
"error": "",
"message_id": "<...@qq.com>",
"log_id": 1024
}
]
}
}
异步入队:
{
"code": 0,
"msg": "已进入发送队列",
"data": {
"request_id": "req_9f2c1a7b8e3d4c5a",
"mode": "queue",
"accepted": 50,
"queued": 50,
"sent": 0,
"failed": 0,
"task_id": 18,
"results": []
}
}
HTTP 状态码:200 成功;400/422 参数错误;401 密钥无效;429 限流;500 服务异常。业务结果同时体现在
code 字段。6. 查询进度
GET /api/v1/status/{request_id}
异步任务的逐封状态(最多返回前 100 条):
{
"code": 0,
"data": {
"request_id": "req_9f2c1a7b8e3d4c5a",
"status": "running",
"total": 50,
"sent": 32,
"failed": 1,
"progress": 66,
"items": [
{ "to": "a@example.com", "status": "sent", "error": "", "message_id": "<...>" }
]
}
}
status 取值:pending / running / paused / done / canceled。
7. 发信邮箱列表
GET /api/v1/mailboxes
返回当前账号下已绑定的邮箱、服务商、启用状态与今日用量(不包含授权码)。
{
"code": 0,
"data": {
"items": [
{
"id": 1,
"provider": "qq",
"provider_name": "QQ邮箱",
"email": "notice@qq.com",
"is_default": 1,
"status": 1,
"daily_limit": 200,
"sent_today": 36,
"healthy": true
}
]
}
}
8. 额度查询
GET /api/v1/usage
{
"code": 0,
"data": {
"today_sent": 128,
"daily_limit": 1000,
"remaining": 872,
"key": { "name": "生产环境", "prefix": "sk_live_abc123…" },
"mailboxes": 3,
"requests_today": 42
}
}
9. 错误码
| code | HTTP | 含义 | 处理建议 |
|---|---|---|---|
| 0 | 200 | 成功 | — |
| 1 | 400 | 业务失败 | 查看 msg 与 results[].error |
| 401 | 401 | 缺少或无效密钥 | 检查 X-API-Key 是否停用 |
| 404 | 404 | 资源不存在 | 检查 request_id 是否属于当前账号 |
| 422 | 422 | 参数校验失败 | 按 msg 修正收件人/主题/正文 |
| 429 | 429 | 请求过于频繁 | 降低调用频率,参考限流响应头 |
| 500 | 500 | 服务器异常 | 稍后重试,持续失败请联系管理员 |
常见发送失败原因
- 535 Authentication failed:授权码错误或已失效,重新生成授权码;QQ 邮箱不要填登录密码。
- 550 / 554:被服务商判定为垃圾邮件或收件人不存在,调整内容与收件人。
- Connection timed out:服务器端口 / 加密方式不匹配,QQ 常用 465 + SSL。
- 今日额度已用完:调高邮箱每日额度或增加邮箱,等待次日重置。
10. 服务商配置参考
| 服务商 | SMTP 服务器 | 端口 | 加密 | 密码填写 |
|---|---|---|---|---|
| QQ邮箱 | smtp.qq.com |
465 | ssl | 授权码 |
| 163邮箱 | smtp.163.com |
465 | ssl | 授权码 |
| 126邮箱 | smtp.126.com |
465 | ssl | 授权码 |
| Yeah邮箱 | smtp.yeah.net |
465 | ssl | 授权码 |
| 腾讯企业邮 | smtp.exmail.qq.com |
465 | ssl | 邮箱密码 |
| 网易企业邮 | smtp.qiye.163.com |
465 | ssl | 邮箱密码 |
| 阿里企业邮 | smtp.qiye.aliyun.com |
465 | ssl | 邮箱密码 |
| 新浪邮箱 | smtp.sina.com |
465 | ssl | 授权码 |
| 139邮箱 | smtp.139.com |
465 | ssl | 授权码 |
| Gmail | smtp.gmail.com |
465 | ssl | 应用专用密码 |
| Outlook | smtp-mail.outlook.com |
587 | tls | 邮箱密码 |
添加邮箱时选择对应服务商即可自动填好以上参数,无需手动输入。
11. 最佳实践
- 控制频率:单个 QQ / 163 邮箱每日 200 封以内更稳妥,可按邮箱设置更低额度。
- 通知类优先:验证码、订单、告警等一对一通知最适合普通邮箱模式。
- 准备备用邮箱:至少绑定 2 个邮箱,轮询能显著降低单账号受限的影响。
- 异步 + 轮询:批量分发用
async: true,再用状态接口更新业务状态,避免长连接超时。 - 幂等处理:
request_id可用于业务侧去重与追踪。
免费注册,开始调用
注册后在控制台「API 密钥」复制密钥即可。