用途:在 AdonisJS 应用中规范地实现事务邮件(如重置密码、欢迎邮件)。邮件以类形式定义,继承 @adonisjs/mail 的 BaseMail,prepare() 方法负责设置收件人、主题并渲染模板。
主要能力:模板为 app/<mod>/ui/emails/<name>.edge 的 .edge 文件,统一以 @email.layout({ title, preview: subtitle }) 开头、@end 结尾,内部只写 <mj-section> 标记;共享 MJML 布局集中管理字体、颜色、按钮样式、页头页脚,改一处即可全局生效。mailContext() 返回 { appName, appUrl },需展开进 htmlView 的 props。支持 signedUrlFor 生成限时、一次性链接。
使用方式:邮件类放在 app/<mod>/mails/<name>_notification.ts,声明 from = env.get('EMAIL_FROM'),在 prepare() 中调用 this.message.to(...).subject(...) 与 htmlView('<mod>::emails/<template>', props)。模板需通过 edge.mount('<mod>', new URL('ui', BASE_URL)) 挂载命名空间,并在 adonisrc.ts 预加载。邮件必须由事件监听器发送,而非在 action 中直接调用 mail.send()。i18n 键位于 locale JSON 的 emails.<name>.*。
适用场景:需要统一品牌外观、可测试、可本地化的事务邮件系统。
限制与反模式:禁止手写 <html><head><style> 块,禁止在各模板重复页头页脚,禁止在模板硬编码 appName,禁止用字符串拼接 URL,禁止把 Lucid 模型传入邮件类并在 prepare() 中解引用。环境变量 EMAIL_FROM、APP_URL 必填,APP_NAME 可选;本地开发用 SMTP(通常 Mailpit),生产用对应驱动的 API key(如 RESEND_API_KEY)。测试中通常在 tests/bootstrap.ts 调用 mail.fake() 作为安全网,再用 mails.assertSent(...) 断言。具体实现细节以项目仓库与官方文档为准。