#template #email #handlebars #produce #bind #string

mail-template

[mail] 提供了一种创建绑定字符串模板引擎以生成邮件的方法

2 个版本

使用旧的Rust 2015

0.6.1 2019年3月26日
0.6.0 2018年11月23日

模板引擎 中排名 #266

Download history 9/week @ 2023-12-25 9/week @ 2024-01-29 9/week @ 2024-02-12 7/week @ 2024-02-19 28/week @ 2024-02-26 4/week @ 2024-03-04 7/week @ 2024-03-11 2/week @ 2024-03-18 58/week @ 2024-04-01

每月下载次数为 68
用于 mail

MIT/Apache

51KB
1K SLoC

mail-template

提供基于模板生成邮件的机制


该crate提供了一个用于使用mail crate的模板引擎的通用接口。

其核心是TemplateEngine trait,可以用来绑定一个模板引擎。当渲染模板时,实现TemplateEngine trait的模板引擎将生成多个(包装的)Resource实例,代表邮件的备选正文以及用于嵌入内容(例如标志图像)和附件的多个附加的Resources。然后该crate将这些部分组合成一个multipart mime邮件。

模板引擎实现

邮件模板引擎不仅要处理单个文本模板(例如handlebars模板)并使用字符串魔术生成一些输出,还需要考虑以下方面:

  1. 备选正文,因此它应该渲染至少两个“文本模板”(一个text/plain,一个html)

  2. 哪些附加的嵌入/附件应该包括(所有在给定模板数据中都包含,但你可能还需要添加一些,例如一些标志图像)

因此,像Handle bar这样的文本模板引擎不能直接绑定到TemplateEngine trait。

为了使用文本模板引擎,建议使用mail-template-render-engine(也通过mail外观公开),该引擎为任何“只需”渲染一些文本的引擎实现了这些开销,并提供了对一些常见模板引擎的默认绑定(例如Handlebars)。

派生

此crate需要模板数据实现InspectEmbeddedResources,结合一些类型/泛型设计决策,允许绑定不仅使用序列化访问模板数据的模板引擎,而且还可以绑定到使用静态类型(如askama)的模板引擎。

因此,它重新导出InspectEmbeddedResources derive from mail-derive。注意,如果你使用mail外观,它也重新导出derive。

功能

  • askama-engine,包括askama模板引擎的绑定。
  • serialize-to-content-id 实现了对 EmbeddedEmbeddedWithCId 的 Serialize,将嵌入类型 序列化为其内容 ID。例如,具有内容 ID "[email protected]" 的图片将被序列化为字符串 "[email protected]"。这对于所有使用序列化作为访问模板数据方式的模板引擎来说非常有用。

示例

路线图

当前实现存在一些限制,这些限制将在未来版本中得到缓解。

  • 模板引擎只能设置有限的一些头部信息(SenderFromToSubject),而一些头部信息在编码邮件时会被隐式设置(例如 DateContent-TypeContent-Disposition)。但有时通过模板引擎添加一些自定义头部信息会很有用(无论是外部还是内部体)。
  • FromToSubject 必须提供,但有时你可能只想创建 Mail 类型,然后自己设置它们(通过你现在可以覆盖它们)。
  • 重用/集成现有邮件实例:有时你可能想使用在其他地方创建的 Mail 实例作为从模板生成的多部分邮件的正文(例如,生成“特殊”附件的东西)。

还有一些部分可能需要改变。

  • MailSendData/MailSendDataBuilder 的名字不太好,它还需要改变以处理上述内容。
  • EmbeddedEmbeddedWithCid、嵌入和附件当前一个 Embedded 实例是围绕 Resource 的包装,表示将成为邮件正文但不是主体(即它不是你发送的文本/html/..)而是邮件中嵌入的东西,用作附件或嵌入(例如,一个徽标图像)。通过内容处置,Embedded 实例在嵌入物和内部使用或同时作为附件使用之间有所不同,有时使用多个不同的数组来区分它们(例如,在 MailParts 中),但没有(类型系统)检查来确保用作附件的数组的元素不能包含具有内联内容处置的 Embedded 实例。结果仍然是一个有效的邮件,但可能不是你期望的方式。这应该以某种方式得到解决(通过使不同的数组类型安全并提升处置到类型级别已经使用,但没有很好地发挥作用)。
  • serialize-to-content-id 是一个好主意,但在一些边缘情况下存在一些问题(例如,当你想序列化任何包含 Embedded 类型的任何用途,但不是在模板中访问它时)。因此,它可能被删除,这意味着像 cid:{{data.mything}}(使用一些 mustach 伪模板语法)这样的导入将变成 cid:{{data.mything.cid}}

文档

文档可以在docs.rs上查看。(一经发布)

许可证

根据以下任一许可证授权

由您选择。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在作品中的任何贡献,将按照上述方式双授权,无需附加任何条款或条件。

依赖项

~6–8.5MB
~184K SLoC