翻译:
运行时间 : Beignet需要Node.js 22.12或更新. Bun是可选的.
[叹息] Beignet是实验性的α软件. 这个
0.0.x包行为早期 评估,且在框架结算时,API可能在发布之间发生变化.
Beignet 的后端邮件提供者 .
提供者安装了应用程序配置 ctx.ports.mailer 移植和曝光
ctx.ports.resend.client 仅作为Resend特定特性的逃生舱.
createResendMailProvider(...) 返回稳定 ResendMailProvider 类型.
ResendMailConfig 描述其已验证的配置; Zod 方案尚存
内部.
安装
bun add @beignet/provider-mail-resend @beignet/core resend
提供者要求 resend ^6.14.0 用于附件元数据支持.
升级旧SDK装置 bun add resend@^6.14.0. Beignet 的节点.js
22.12-或更新运行时间基线也满足Resend v6的要求.
设置
import { createResendMailProvider } from "@beignet/provider-mail-resend";
import { createServer } from "@beignet/core/server";
const server = await createServer({
ports: basePorts,
providers: [createResendMailProvider()],
context: ({ ports }) => ({ ports }),
routes,
});
所需的环境变量 :
| 变量 | 说明 |
|---|---|
RESEND_API_KEY | 重新发送 API 密钥 |
RESEND_FROM | 默认发送者, 例如 . My App <[email protected]> |
beignet doctor --strict 检查安装的 Resend 邮件提供者是
登记在册 server/providers.ts 和两个必要的 vars 存在
,在app env 示例或配置中.
使用 createResendMailProvider(...) 如果您要直接通过配置
而不是读 RESEND_* (原始内容存档于2018-10-21). Env vars. 选项覆盖 env 衍生值 :
import { createResendMailProvider } from "@beignet/provider-mail-resend";
export const providers = [
createResendMailProvider({
apiKey: secrets.resendApiKey,
from: "My App <[email protected]>",
}),
];
通话 createResendMailProvider() 没有选项
配置 .
在应用程序代码中使用
await ctx.ports.mailer.send({
to: "[email protected]",
subject: "Welcome",
html: "<h1>Hello</h1>",
});
一样 MailerPort 与 SMTP 、 内存假象和其他适配器合作 :
await ctx.ports.mailer.send({
from: { email: "[email protected]", name: "Support" },
to: ["[email protected]", "[email protected]"],
replyTo: "[email protected]",
subject: "Account updated",
text: "Your account was updated.",
html: "<p>Your account was updated.</p>",
});
附件和内含图像
通过标准邮件发送文件 :
await ctx.ports.mailer.send({
to: "[email protected]",
subject: "Workspace summary",
text: "Your summary is attached.",
attachments: [
{
filename: "summary.json",
content: new TextEncoder().encode(JSON.stringify({ completed: 12 })),
contentType: "application/json",
},
],
});
每个 MailAttachment 需要非空白 filename 没有控制字符
财务报告和审定财务报表 content: Uint8Array; Node.js Buffers 也能够工作. 可选 contentType
指定一个没有参数的 MIME 类型; 提供者从
省略时的文件名 。 设定 contentId: "logo" 图像附件和
提及它与 <img src="cid:logo"> 在HTML正文中嵌入图像.
每个消息的ID必须独一无二: 1–127个字母,数字,点,下划线, @, (中文(简体) ),
+,或 -,从字母或数字开始。 关闭 cid: 前缀从
该附件的身份.
发送前共享邮件复制元数据及字节, 允许为空
文件,并拒绝无效的附件字段 MailDeliveryError 在此之前
打电话给供应商。 它接受字节而不是路径、 URL、 流, 或
基础64字符串。 提供者大小和文件类型的限制适用。 附录名称,
字节和内容ID不包含在邮件仪器中.
使用 createMemoryMailer() 从 @beignet/core/mail 主张
mailer.deliveries[0].message.attachments 在测试。 排队任务和
通知应携带存储密钥或JSON安全源数据; 构造
处理器或信道渲染器中的附件字节.
逃逸舱门
仅在您需要未覆盖的 Resend 特定特性时使用 Resend 客户端
以 MailerPort数字 :
await ctx.ports.resend.client.emails.send({
from: "[email protected]",
to: "[email protected]",
subject: "Invoice",
html: "<p>Your invoice is ready.</p>",
tags: [{ name: "category", value: "invoice" }],
});
提供者提供:
ctx.ports.mailer,标准贝格网MailerPortctx.ports.resend,带有Resend客户端的逃生舱门
开发工具
何时 ctx.ports.devtools 已安装,此提供者记录 mail.send, (中文(简体) ),
mail.sent,以及 mail.failed 下的活动 mail 观者. 已完成
失败事件包括 durationMs 他们的细节。 事件保留提供者,
接收者数、可用时的交付ID和持续时间,但绝不包括
地址、主题、消息机构或原始Resend错误.
失败并重试语义
提供者失败且不重试 。 每个 send(...) 打个电话
重新发送SDK呼叫,甚至针对瞬态网络出错或提供方故障.
邮件发送不是一码事:计时发送可能仍未完成
因此,一个盲人供应商重试有可能重复电子邮件.
投递失败 MailDeliveryError 从 @beignet/core/mail 与
提供者名称、收件人数和原始Resend错误被保留为
cause 应用软件的处理。 未将错误复制到提供者
仪器 当应用程序记录原因时, 编辑或限制访问 .
启动配置问题在提供者设置时抛出 .
当邮件需要重试时,请从工作或收发箱支持的收听器中发送 并拥有自己的能力 任务或排出行应选择尝试和 延迟,而且申请应在 发送.
当地测试
使用内存或假 MailerPort 在使用个案测试中。 保留续发沙盒或
特定环境配置中的测试模式证书并避免发送真实
自动测试邮件.
部署说明
设定 RESEND_FROM 给已核实域发送者。 将邮件发送视为一种
外部副作用:从承诺的工作流程状态触发重要邮件,
通常通过通知,工作,或外框后置的收听器.
许可证
麻省理工学院