@btravstack/mailer

中文文档
0.58.0发布于 2026/11/08MITTypeScriptESM + CJS零依赖构建来源已验证近 30 天下载 6067

@btravstack/ core 的 Mailer 端口: 一个记录适配器, 一个 SMTP 适配器, 和一个跨、 计数和记录每个发送的组件

中文使用文档
文档目录4 节
  1. 实例
  2. 选项
  3. 它决定什么,它没有
  4. 许可证

@btravstack/邮件

邮件端口用于 @btravstack/core页:1 Mailer 申请 取决于记录适配器、SMTP适配器和 每发件的间隔、计数和日志行.

📖 文档 • 妇女 API 参考

pnpm add @btravstack/mailer @btravstack/core @btravstack/config @btravstack/di unthrown

4个同伴依赖关系,加 nodemailer ——可选的,只有你需要 作 SMTP 适配器. 仪器不需要自己的同伴: Logger, (中文(简体) ), Tracer 财务报告和审定财务报表 Meter 这取决于是 内核的端口。 。 。 . 节点 >=22。 。 。 .

实例

通知 和诚实的失败臂:

import { Mailer } from "@btravstack/mailer";
import { Port, Provider } from "@btravstack/di";
import type { AsyncResult } from "unthrown";

class Notifier extends Port("ReadmeNotifier")<{
  readonly placed: (
    to: string,
    orderId: string,
  ) => AsyncResult<void, RetryableError>;
}> {}

export const notifier = Provider(Notifier)({
  inject: { mailer: Mailer },
  sync: ({ mailer }) => ({
    placed: (to, orderId) =>
      mailer
        .send({
          from: "[email protected]",
          to: [to],
          subject: `order ${orderId} placed`,
          text: `Order ${orderId} is on its way.`,
        })
        // A failed send is YOUR transport's problem, which is why the port
        // models it instead of retrying: leaving the delivery un-acked
        // hands it to the next worker, on the broker's own budget.
        .mapErrCases((matcher) =>
          matcher.with(
            P.tag("MailNotSent"),
            (error) =>
              new RetryableError(
                `order ${orderId} was not notified: ${error.reason}`,
              ),
          ),
        ),
  }),
});

组成——适配器是唯一的决定,作出 这里和其他地方:

import { mailer } from "@btravstack/mailer";
import { smtpMailer } from "@btravstack/mailer/smtp";

export const NotifierApp = Module("NotifierApp")({
  imports: [
    // Instrumented by default: a span, a counter and a log line per send,
    // which is why `observability()` and `otel()` are below. Pass
    // Every call is reported through `Observers`. Drop the two modules
    // below and this composition is unchanged — it just reports to nobody.
    mailer({ adapter: smtpMailer() }),
    observability(),
    otel(),
  ],
  provides: [notifier],
  exports: [Notifier, Logger],
});

在一个测试中,适配器 发送什么,保存一切:

import { mailRecorder, recordingMailerProvider } from "@btravstack/mailer";
import { overridden } from "@btravstack/testing";

const recorder = mailRecorder();
const app = overridden(NotifierApp, [recordingMailerProvider(recorder)]);
// … place an order through the real graph …
expect(recorder.only()).toEqual(
  expect.objectContaining({ subject: "order 42 placed" }),
);

选项

选项何处这是什么
adaptermailer({ adapter })适配器模块提供 MailerBackend 所需数额
SMTP_URL环境,读作 smtpMailer()传输 URL —— 需要, 在图表构建中验证

完整表——默认,语义和推理——活在 参考页, (中文(简体) ), 这张名单是详细的.

它决定什么,它没有

决定 每一次的派遣,都交给 任何贡献 Observers ——没有旗帜,也没有选择退出,因为一个图构成没有 观察者只给一个惰性电话 并向任何人报告 它决定: SMTP适配器提供健康检查—— verify(), (中文(简体) ), 连接和认证,折叠到内核 /healthz 与 无线,而录音适配器则无线 免费报告健康情况。 它决定一个发送是 已接受没有 失败是模拟 MailNotSent 携带信封 永远不要让尸体.

它没有决定 失败后会发生什么——重试属于你 运输,示例回答a RetryableError 所以经纪人的预算 拥有它. Mail 携带整个信封—— cc, (中文(简体) ), bcc, (中文(简体) ), attachments 财务报告和审定财务报表 headers 旁边 to, (中文(简体) ), subject 和两具尸体 微调, 不批量发送, 也没有地址验证—— 每个原因都在进行 参考页, (中文(简体) ), 同样的推理是 AGENTS.md 用于贡献者.

许可证

麻省理工学院

版本与发布记录

@btravstack/mailer 共发布 62 个版本,首次发布于 2026/08/26;过去 12 个月发布了 62 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.58.0latest2026/11/08今天
0.57.02026/11/071 天前
0.56.12026/11/062 天前
0.56.02026/11/062 天前
0.55.12026/11/035 天前
0.55.02026/11/035 天前

关于 @btravstack/mailer 的常见问题

@btravstack/mailer 是什么?

@btravstack/ core 的 Mailer 端口: 一个记录适配器, 一个 SMTP 适配器, 和一个跨、 计数和记录每个发送的组件

如何安装 @btravstack/mailer?

在项目目录运行 npm install @btravstack/mailer,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:unthrown(^5.0.0)、@btravstack/di(^0.58.0)、@btravstack/core(^0.58.0)、@btravstack/config(^0.58.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@btravstack/mailer 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@btravstack/mailer 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@btravstack/mailer 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@btravstack/mailer 可以商用吗?

@btravstack/mailer 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@btravstack/mailer 的下载量有多少?

根据 npm 官方下载统计,@btravstack/mailer 在 2026/10/09 – 2026/11/07 这 30 天内被下载 6,067 次,日均约 202 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@btravstack/mailer 还在维护吗?

最新版本 0.58.0 发布于 2026/11/08(今天);至今共发布 62 个版本,其中过去 12 个月发布了 62 个;首次发布于 2026/08/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。