You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何将Handlebars渲染的HTML内容设置为Lettre邮件正文

问题根因

你对Handlebars库的render_template方法传参存在误解:该方法的第一个入参接收的是Handlebars模板字符串内容本身,不是本地.hbs模板文件的存储路径。
你直接把路径字符串传入作为模板,该字符串中没有任何需要替换的变量占位符,渲染结果自然就是原路径字符串,这和你打印order_email_content得到路径值、Handlebars实例templates字段为空的表现完全吻合。

修复方案

你可以任选以下两种方案之一实现正确的模板渲染,Lettre邮件发送部分代码无需修改:

方案1:临时读取模板文件内容渲染

适合模板仅使用一次的场景:

use std::fs;

// 先读取模板文件的文本内容
let template_content = fs::read_to_string("src/emails/order_email.hbs")
    .expect("读取订单邮件模板失败,请检查路径是否正确");

let mut reg = Handlebars::new();
// 传入模板内容执行渲染
let order_email_content = reg.render_template(
    &template_content, 
    &serde_json::json!({"data" : email_order.body, "orderNumber": 3333, "amount": 555})
).expect("模板渲染失败");

方案2:注册模板后复用渲染

适合模板会多次使用的场景,性能更优:

let mut reg = Handlebars::new();
// 直接注册模板文件,第一个参数为自定义的模板名称
reg.register_template_file("order_email", "src/emails/order_email.hbs")
    .expect("注册订单邮件模板失败,请检查路径是否正确");

// 通过模板名称执行渲染
let order_email_content = reg.render(
    "order_email", 
    &serde_json::json!({"data" : email_order.body, "orderNumber": 3333, "amount": 555})
).expect("模板渲染失败");
补充提示

生产环境如果不想在运行时读取磁盘文件,可以使用Handlebars相关宏在编译期将模板内容打包到二进制文件中,避免运行时IO错误。

内容的提问来源于stack exchange,提问作者Klod Lala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:36:02