资讯中心

ZoneMTA HTTP 投递实战:用 POST 代替 SMTP 发送邮件

📅 2026/8/20 19:28:48
ZoneMTA HTTP 投递实战:用 POST 代替 SMTP 发送邮件
ZoneMTA HTTP 投递实战:用 POST 代替 SMTP 发送邮件【免费下载链接】zone-mta Modern outbound MTA cross platform and extendable server application项目地址: https://gitcode.com/gh_mirrors/zo/zone-mta你是否遇到过这样的场景目标服务不提供 SMTP 端口却有一个现成的 HTTP 接口或者你的业务系统希望用一行curl就把邮件交给队列而不是费力搭建邮件客户端ZoneMTA 这款基于 Node.js 的现代出站 MTA邮件传输代理除了支持传统的 SMTP 投递还内置了强大的HTTP 投递能力——既可以通过 HTTP API 收件也可以用 POST 代替 SMTP 把邮件发给任意 URL。本文将带你从零上手 ZoneMTA HTTP 投递用最少的代码把邮件送出去。为什么选择 HTTP 投递而不是 SMTP 投递传统邮件链路中发件方需要通过 SMTP 协议与接收方 MX 服务器反复对话HELO、MAIL FROM、RCPT TO、DATA……协议繁琐且对 IP 信誉要求高。而 ZoneMTA 的 HTTP 投递把这条链路简化成了一次普通的上传请求接入简单目标端只要有一个能接收 POST 的 HTTP 服务即可无需搭建邮件服务器协议统一内部系统之间用 HTTP 沟通运维和排错成本更低复用 ZoneMTA 全套能力队列管理、重试、退信bounce、发送分区Sending Zone照常生效你只需要在插件里改两个字段。下面我们把 ZoneMTA HTTP 投递拆成「进」和「出」两个方向来实战。方向一用 HTTP API 投递邮件收件端ZoneMTA 默认在12080端口开放 HTTP API配置见 config/default.js 中的api.port字段路由实现在 lib/api-server.js。它提供两种收件方式对应POST /send和POST /send-raw两个接口。方式 1POST 一个 JSON推荐新手使用直接提交一个 Nodemailer 风格的 JSON 结构ZoneMTA 会把它编译成标准的 rfc822 邮件并进入投递队列curl -H Content-Type: application/json \ -H X-Authenticated-User: andris \ -H X-Originating-IP: 123.123.123.123 \ -X POST http://localhost:12080/send -d { from: senderexample.com, to: recipient1example.com, recipient2example.com, subject: hello, text: hello world! }要点提示项目说明请求头Content-Type: application/json必须设置可选头X-Authenticated-User认证用户名、X-Originating-IP来源 IP附件只能用 base64 字符串提供内容不能引用本地文件或远程 URL出于安全考虑被禁用返回200 JSON包含队列 IDid、发件人、收件人方式 2POST 原始邮件适合已有 .eml 文件如果你手里已经有一封完整的 rfc822 邮件直接以message/rfc822类型上传即可信封信息发件人、收件人会从邮件头中自动解析curl -H Content-Type: message/rfc822 \ -X POST http://localhost:12080/send-raw \ -d From: senderexample.com To: recipient1example.com Subject: Hello! Hello world邮件进入队列后ZoneMTA 会完成 DKIM 签名、Sending Zone 路由、连接池管理、失败重试等一系列出站动作——HTTP API 只是入口后面的投递全交给 ZoneMTA。其中api:mail钩子由 plugins/core/api-send.js 实现你可以在插件里扩展校验逻辑比如限制单封邮件的收件人数量。方向二用 POST 代替 SMTP 投递邮件发送端这是 ZoneMTA 最独特的「HTTP 投递」能力投递时不再连接目标 MX而是把整封邮件作为文件上传multipart/form-dataPOST 到你指定的 URL。实现位于 lib/sender.js 的发送流程中。三步开启 HTTP 投递只需在sender:fetch钩子里设置两个字段delivery.http true和delivery.targetUrlapp.addHook(sender:fetch, (delivery, next) { delivery.http true; delivery.targetUrl https://your-service.example.com/inbox; next(); });就这么简单ZoneMTA 会把邮件以message/rfc822类型、.eml文件名作为附件上传同时附带以下表单字段供你的服务端解析mail_to_http[from]发件人地址mail_to_http[rcpt]收件人地址mail_to_http[body]邮件正文超过 500KB 时截断headers[...]关键邮件头subject、date、message_id 等的 JSON 序列化message完整邮件文件Content-Type: message/rfc822服务端如何判定投递结果接收方只要返回2xx 状态码ZoneMTA 就认为投递成功返回 3xx/4xx/5xx 则会被判定为失败状态码范围ZoneMTA 的处理200–299投递成功邮件从队列中删除400–499判定为硬退信reject触发 bounce 流程其他如 5xx判定为临时失败defer稍后自动重试这个判定逻辑也体现在 lib/sender.js 的错误处理中——HTTP 投递的失败信息protocol: http、httpUrl、httpResponse会被完整记录并纳入退信统计。你的服务端代码因此可以非常轻量只需返回一个正确的状态码。配置检查清单让 HTTP 投递跑起来在动手之前对照 config/default.js 确认这几项依赖组件齐全Node.js v16、MongoDB存储投递队列、Redis锁与计数器API 端口未被占用默认api.port: 12080同时确认 SMTP 端口2525与内部数据通道12081空闲认证按需开启默认配置里core/http-auth插件指向http://localhost:12080/test-auth作为示例认证地址生产环境务必替换为你自己的认证服务发送分区Sending ZoneHTTP 投递同样遵循路由规则可通过X-Sending-Zone头或routingHeaders配置把特定邮件导向不同的 zone。实战小结与进阶建议ZoneMTA 的 HTTP 投递让邮件发送变得前所未有的简单进POST /send收 JSON、POST /send-raw收原始邮件一行curl即可投递出插件里设置delivery.http truetargetUrl用 POST 替代 SMTP 直达任意 HTTP 服务稳队列、重试、退信、DKIM 签名、Prometheus 监控等能力全部复用无需额外开发。进阶玩法上你可以把 HTTP 投递目标指向自己的回调服务实现「邮件转 Webhook」也可以结合 Sending Zone 的 IP 池与限流参数为不同的业务线分配不同的投递通道。如果希望深入阅读实现细节推荐按这个顺序读源码先看 lib/api-server.js 理解收件入口再看 lib/sender.js 的 HTTP 分支理解上传格式最后读 config/default.js 熟悉全部可调参数。现在就去试一下起一个 ZoneMTA用curl向http://localhost:12080/send发一封测试邮件你会立刻感受到用 POST 代替 SMTP 发送邮件的畅快体验。【免费下载链接】zone-mta Modern outbound MTA cross platform and extendable server application项目地址: https://gitcode.com/gh_mirrors/zo/zone-mta创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考