@bitbaum/ mail- kit (英语)
舰队的 一个 电子邮件层。 一个供应商(Resend),一个Env合同,一个 调用形状,零运行时间依赖.
因为车队增长 ~ 12 发声的电子邮件执行跨3个 提供商的风格, 以及一个死去的 SMTP 证书 沉默了两个应用程序的外出邮件 几个月没人注意到 统一即是修行.
安装
pnpm add @bitbaum/mail-kit
使用
import { sendMail, isMailConfigured, mailHealth, conventionalFrom } from "@bitbaum/mail-kit";
const result = await sendMail({
to: "[email protected]",
subject: "Your invoice",
html: "<p>…</p>",
attachments: [{ filename: "invoice.pdf", content: pdfBuffer, contentType: "application/pdf" }],
});
if (!result.sent) {
// result.error, result.status?, result.retryable — sendMail NEVER throws.
logger.error("invoice email failed", result);
}
sendMail从来没有扔过. 服务器动作中发生的邮件错误 到达任何人,并摧毁形式;a{ sent: false }你必须看 可交付。 检查分娩事项的呼叫者.sent。 。 。 .isMailConfigured()- 大门流出 依赖 在邮件到达 (密码重置,发票). 占位钥匙和生产沙盒 发件人( e)@resend.dev计为 未配置: 外观配置和 给任何人.mailHealth()- 键-有效性+域-状态探测器/api/health。 。 。 . 过往的探测器不能证明交货;只有真正的发送才能证明.options.idempotencyKey——从克伦斯克/克伦斯通过,如此重试的工作 无法双发( 24 h 的复发).
每个应用程序一个地址: hello@<host>
每个应用程序都有自己的主机地址,客户可以猜测:
[email protected],以及 [email protected] 一旦一个网站有自己的
域名. appAddress(url) 建造; appAddressFromEnv() 读取 MAIL_ADDRESS
或从 APP_URL 编号 : NEXT_PUBLIC_SITE_URL 编号 : AUTH_URL。 。 。 .
sendMail 把地址放进去 答复 每个消息( 除非呼叫)
设置自己的,或已经从它发送。 邮件仍然通过共享
发送器直到每个主机都能自己签名——但每个答案都到达了应用.
邮寄到应用程序
车队的邮件网关接收每个应用程序主机,检查SPF/DKIM/DMARC,
邮编 a InboundMail 改为 /api/mail/inbound,与
MAIL_INBOUND_SECRET (单位:千美元)x-mail-signature: t=…,v1=hmac) (中文(简体) ). 应用程序的一面
线条:
// app/api/mail/inbound/route.ts
import { inboundHandler } from "@bitbaum/mail-kit";
export const POST = inboundHandler({ onMail: (mail) => saveAndTriage(mail) });
未署名、被篡改、陈旧( > 5分)或过量的交货在交货前被拒绝
您的代码运行; 抛出 onMail 回答500,所以网关重复.
AI 分类法
triageMail(mail, complete, context) 询问模式( 任意 complete() - 那个
ai-形式/ai-kit形状)用于 kind, (中文(简体) ), urgency,单行 summary,则
发件人 language 财务报告和审定财务报表 needsHuman。它从不扔:没有模型,或者胡说八道
答案来自简单的规则,标记 by: "rules"指示
在电子邮件中.
信封合同(全部)
| 瓦尔 | 含义 |
|---|---|
RESEND_API_KEY | 需要发送( 车队密钥 : /opt/fleet/env(中文(简体) ) |
RESEND_FROM | 发件人 - Name <addr> 或赤裸的地址(如果每次拨打都可用) from(中文(简体) ) |
MAIL_ADDRESS | 应用程序自己的地址; 可选地址, 来源于应用程序的 URL |
MAIL_INBOUND_SECRET | 从网关验证邮件( 车队密钥 : /opt/fleet/env(中文(简体) ) |
舰队公约
- 共享的Resend账户在 免费等级: 1个已核实域,
每天100个电子邮件,3000个/月. 击打每天的盖子表面
{ sent: false, status: 429, retryable: true }。 。 。 . - 仅
loki.orangecat.ch被验证,所以每个应用程序发送为<app>@fleetcrown.orangecat.ch—— 说conventionalFrom("My App")建造它. - 盒子上的每日金丝雀发送一个真正的电子邮件,当它发出时会提醒Telegram 失败——不是这个包,而是证明交货继续起作用.
这不是什么
- 不是模板引擎——应用程序拥有他们的HTML.
- 不是排队..
retryable告诉一个打电话的人 是否为 重试可以帮助; 日程安排一是打电话者的决定. - 不是批量的——通讯通过Listmonk.
部分 位点 开放的AI-本土产品 在苏黎世建造的基础设施。 这里的每个软件包都列出使用该软件的应用程序: 应用程序使用邮件 kit。 。 。 .