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
相关产品推荐
相关产品推荐

