email-templates 集成mjml 的另外一个方法
今天有写过一个简单的email-templates 集成mjml 的方法,是通过自定义render(扩展性比较灵活)实际上
email-templates 也提供了配置选项,我们可以选择自己的方法进行模版引擎的扩展,以下是一个简单的尝试
环境准备
- 项目结构
├── README.md
├── app.js
├── emails
│ └── templates
│ ├── html.mjml
│ ├── subject.mjml
│ └── text.mjml
├── package.json
├── polyfill.js
└── yarn.lock
- 代码说明
package.json 依赖的包以及npm script 定义
{
"name": "email-template-learning",
"version": "1.0.0",
"main": "app.js",
"license": "MIT",
"dependencies": {
"email-templates": "^6.1.1",
"mjml": "^4.5.1",
"nodemailer": "^6.4.2",
"pug": "^2.0.4"
},
"scripts": {
"app": "node app.js"
}
}
polyfill.js string 支持插值的,方便变量引入,比较简单
String.prototype.interpolate = function(params) {
const names = Object.keys(params);
const vals = Object.values(params);
return new Function(
}
module.exports = String.prototype.interpolate
app.js 核心代码,后边会有介绍
const Email = require('email-templates');
const mjml2html = require("mjml")
const fs = require("fs")
/**
* customer render functions for mjml
* @param {mjml content string} mjmlcontent
*/
function mjml(mjmlpath,locals,cb) {
let mjmlContent = mjml2html(fs.readFileSync(mjmlpath).toString());
cb(null,mjmlContent.html)
}
const nodemailer = require("nodemailer")
require("./polyfill")
const realtransporter = nodemailer.createTransport({
port: 587,
host: "<smtp host>",
auth: {
type: "LOGIN",
user: "<email accounts>",
pass: "<email password>"
}
})
const email = new Email({
message: {
from: '<email accounts>'
},
views: {
options: {
extension: 'mjml', // for mjml
map: {
mjml: 'mjml',
},
engineSource: {
mjml:mjml
}
}
},
send: true,
transport: realtransporter
}
);
email
.send({
template: 'templates',
message: {
to: '1141591465@qq.com',
subject: "demoapp"
},
locals: {
name: 'Elon'
}
})
.then(console.log)
.catch(console.error);
模版内容,内容在emails, 目录结构如下,内容就是实际的mjml 标签
emails
└── templates
├── html.mjml
├── subject.mjml
└── text.mjml
- 自定义模版引擎的核心说明
对于自定义模版引擎是通过views.opions 配置的,需要制定模版引擎的后缀以及引擎的处理函数,还有map 映射
比如mjml 的配置,如果配置了map,则需要添加engineSource ,engineSource 对应一个支持回掉的函数
views: {
options: {
extension: 'mjml', // for mjml
map: {
mjml: 'mjml',
},
engineSource: {
mjml:mjml
}
}
具体处理的源码(回掉处理依赖pify)
说明
使用通过配置的方法比较适合比较固定的模版(不需要参数传递),对于需要参数传递的,通过自定义的方式会更方便点,实际上对于需要扩展的
我们可以通过缓存以及数据库存储的模式(s3 也不错)增强系统的可扩展行性
参考资料
https://email-templates.js.org/#/?id=custom-template-engine-e-g-ejs
https://github.com/rongfengliang/email-templates-mjml-learning/tree/mjml
https://www.npmjs.com/package/pify
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2019-01-08 Singer 学习三 使用Singer进行mongodb 2 postgres 数据转换
2019-01-08 Singer 学习二 使用Singer进行gitlab 2 postgres 数据转换
2019-01-08 Singer 学习一 使用Singer进行mysql 2 postgres 数据转换
2019-01-08 Singer 开源便捷的ETL 工具
2018-01-08 使用 commander && inquirer 构建专业的node cli
2017-01-08 Cobertura 代码覆盖率测试
2014-01-08 Python包管理工具easy_install使用