WisdomEDM开发者中心
WISDOMEDM / DEVELOPER PLATFORM

让邮件能力,融入你的业务

从一封事务通知开始。清晰的接口、可追踪的提交状态,以及可安全重放的幂等请求。

服务地址edm.zhmj.com
认证方式独立 Bearer 凭据
数据隔离绑定单一应用
01 / GET STARTED

认证与接入申请

联系平台申请事务邮件应用,确认发件域名、发件地址与应用配额。平台安全发放 edm_ 开头的应用密钥;当前没有网页自助生成密钥功能。应用密钥与商家后台账号、旧版接口密钥、MCP 凭据互不通用。

只在你的服务端使用

请求头传 Authorization: Bearer <EDM_API_KEY>,使用 HTTPS。不要放到网页 JavaScript、URL、聊天记录或 Git。本文所有示例均为占位内容,不会在本页面触发发送。

BASE URLhttps://edm.zhmj.com

默认配额:每应用 20 次/滚动小时、100 次/北京时间自然日,同一收件人 5 次/滚动小时。实际以平台给应用配置的配额为准;新的发送尝试计入限额。

02 / TRANSACTIONAL EMAIL

提交事务邮件

POST/api/v1/mail

用于通知、验证、到期提醒等单封事务邮件。Content-Type: application/json,整个原始 JSON 请求最多 40,000 字节。拒绝未声明的额外字段;发件身份由平台配置,不能由请求覆盖。

请求头
字段要求
Authorization必填,应用 Bearer 密钥
Content-Type必填,application/json
Idempotency-Key必填,8–128 个 ASCII 字符,仅字母、数字、下划线、点、冒号和短横线。同一业务事件始终复用同一键。
JSON 请求体(限制按 UTF-8 字节计算)
参数类型 / 必填说明
tostring / 是单一有效邮箱,最多254字节,不能包含换行或多个收件人。
subjectstring / 是非空,最多240字节,不允许CR、LF或NUL;不是240个汉字。
htmlstring / 是非空HTML正文,最多24,000字节。
textstring / 否纯文本正文,最多12,000字节;省略时从HTML去标签生成。
cURL · 实际运行会发信
正在加载代码示例…
响应与幂等
HTTP / status含义与处理
200 / accepted服务商接受了发送请求,不代表已送达或进入收件箱。保存响应的32位消息id。
202 / sending正在处理;稍后查询状态,不新建幂等键。
202 / unknown服务商响应不确定,可能已经发送。查询、对账或联系平台,禁止换键自动重发。
502 / failed本次发送失败,保存消息id及状态,核查原因。
同键同内容返回原记录,不再次发送。卡住超过60秒的sending在重放时会转为unknown。
同键不同内容409 idempotency_conflict。不要用新键掩盖业务事件冲突。
03 / MESSAGE STATUS

查询本应用的邮件状态

GET/api/v1/mail/status?id=<MESSAGE_ID>

使用创建该消息的应用密钥。id 为32位小写十六进制字符串;不存在或属于其他应用均返回404,不泄露其他应用信息。

cURL / 响应格式
正在加载代码示例…

仅返回 id、status、created_at、updated_at,时间是 Unix 秒。目前不提供 delivered、打开率、点击率等事务 API 状态。

04 / SUPABASE INTEGRATION

Supabase Send Email Hook

POST/api/v1/mail/supabase

这是平台专用的 Supabase Auth 集成,需要平台预先配置应用、发件身份与 Hook 共享密钥。不能使用普通 Bearer 密钥替代 Hook 签名。事件由 Supabase 生成,包含 user 与 email_data;不要手工拼接验证链接或在日志中保存验证 token。

Standard Webhooks 验签要求
webhook-id1–128个可打印ASCII字符,作为事件幂等标识。
webhook-timestampUnix秒时间戳,与服务器时间偏差不超过300秒。
webhook-signaturev1,<Base64签名>,签名为HMAC-SHA256。
签名原文webhook-id.webhook-timestamp.原始请求体。必须按收到的原始字节验签,不能先解析再重新序列化。
大小 / 响应原始body最多80,000字节。成功200及空JSON对象;无效JSON400、签名失败401、事件不受支持或发送不可用503及嵌套error对象。

平台支持轮换Hook签名密钥。Supabase事件字段与签名格式参见 Supabase 官方文档 ↗ 和 Standard Webhooks ↗。

05 / LEGACY

旧版发信接口 仅保留兼容

POST/api/email/send

已有集成可继续使用,新项目请选择新版事务 API。使用表单体 application/x-www-form-urlencoded,四个必填字符串:api_key、to、subject、html。密钥来自平台配置的旧版 EMAIL_API_KEYS,与新版 edm_ 密钥不同。

不要套用新版的保证

旧版不提供新版的应用级幂等、配额及状态隔离保障。响应是历史 code / data / msg 业务信封,HTTP 200不等于业务成功,必须检查业务code(成功200,失败通常400)。GET不支持;不要在URL传密钥。

06 / CODE EXAMPLES

服务端代码示例

从环境变量读取密钥。示例地址属于保留的 example.invalid 域名;实际测试请换成你获授权接收的地址,并做好结果保存和错误处理。

Node.js · fetch
正在加载代码示例…
Python · 标准库
正在加载代码示例…
07 / TROUBLESHOOTING

错误处理与安全重试

新版 API 常见错误
HTTPerror / 处理建议
400参数校验失败或JSON不合法,按error提示修正。不要记录密钥、收件地址和正文。
401unauthorized:缺少、错误或已禁用的应用密钥。
403应用停用等权限限制;联系平台确认。
404not_found:本应用下找不到该消息ID。
409idempotency_conflict:同幂等键的内容与原请求不同。
413 / 415payload_too_large / json_required:缩小原始请求体或使用JSON。
429rate_limit_exceeded:应用/收件人频率限制;退避等待配额窗口,仍复用原业务键。
503mail_service_unavailable:服务暂不可用;不要紧密循环请求。

网络超时不等于未发送。先查询已保存的消息 ID;如没有 ID,只能以同一幂等键、相同内容重放核对原记录。遇到 unknown 应人工对账,不换新键盲目重试。

SCOPE / PRIVACY

清楚知道,能做什么与不能做什么

本版本公开的是事务邮件集成,不是商家后台的完整远程控制接口。客户管理、营销群发、到期续费记录、插件开关、支付及管理员内部回调不作为公共API或MCP写工具开放,原有客户使用方式不变。

事务接口保存用于幂等和核对的内容哈希、收件人哈希及状态,不保存原始收件地址或正文;客户端和上游服务商的数据保留策略需要你另行审查。事务API当前不是商家营销积分扣费接口,应用配额与后台营销积分是不同机制。