API v1

邮件分发接口文档

用一次 HTTP 请求,把邮件交给你的 QQ / 163 / 企业邮箱完成投递。接口遵循简单 JSON 约定,成功返回 code: 0。

Base URL:https://smtp.xueyuanpie.com 鉴权:X-API-Key
1. 快速开始
  1. 注册账号,在控制台「API 密钥」中复制密钥;
  2. 在「发信邮箱」中添加至少一个 QQ / 163 邮箱,并测试连接;
  3. 调用 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. 请求参数
参数类型必填说明
tostring / array是收件人。支持 "a@b.com"、"张三 <a@b.com>",或数组/对象数组(含 name、vars)。
subjectstring是主题,最长 200 字;支持 {{name}} 变量。
htmlstring否*HTML 正文,最大 2MB。与 text 至少填一个。
textstring否*纯文本正文。未填 html 时会自动生成简单的 HTML。
providerstring否qq / 163 / 126 / exmail_qq 等,限定从该服务商的邮箱中挑选。
mailbox_idint否指定发信邮箱 ID,优先级高于 provider。
asyncbool否true 时强制入队,立即返回 request_id。
intervalint否队列内每封间隔毫秒,默认 1500,范围 500-60000。
attachmentsarray否附件数组,元素:{"filename","content"(base64),"type"},最多 5 个、合计 8MB。
headersobject否自定义邮件头,禁止 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. 错误码
codeHTTP含义处理建议
0200成功—
1400业务失败查看 msg 与 results[].error
401401缺少或无效密钥检查 X-API-Key 是否停用
404404资源不存在检查 request_id 是否属于当前账号
422422参数校验失败按 msg 修正收件人/主题/正文
429429请求过于频繁降低调用频率,参考限流响应头
500500服务器异常稍后重试,持续失败请联系管理员

常见发送失败原因

  • 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 密钥」复制密钥即可。