Node.js中如何跨文件引入HTML邮件模板并插入自定义文本
解决方案
1. Node.js 中读取HTML模板文件的正确方式
Node.js 原生不支持直接通过require()引入HTML文件——require()默认只会解析JS、JSON、Node原生扩展模块,直接引入HTML会把文件内容当作JS代码执行,直接报错。
最稳妥无依赖的方案是用Node内置的fs+path模块读取文件:
- 服务启动时一次性同步读取模板文件缓存到内存,不用每次发邮件都重复读磁盘,性能更好
- 用
path.join(__dirname, 文件名)拼接绝对路径,避免相对路径因为启动目录不同导致的文件找不到问题
2. 模板自定义内容注入方案
不需要复杂的模板引擎,用「占位符+字符串替换」就可以满足事务类邮件的需求:
- 先修改HTML模板,在需要插入动态内容的位置,写固定格式的占位符,比如
{{变量名}}格式,和普通文本区分开 - 读取到模板字符串后,调用替换方法把对应占位符替换成实际传入的内容即可
如果后续模板逻辑变复杂(需要条件判断、循环渲染),再引入轻量模板引擎即可,当前场景原生字符串替换完全够用。
代码修改示例
修改后的 generalContact.html
把原来的Lorem Ipsum占位文本替换成你需要的占位符即可,示例:
<!DOCTYPE html PUBLIC "-//W3C/...." "http://www.w3.org....."> <html xmlns="http://www.w3.org......"> <head> <title></title> </head> <body> <center> <tr> <td> 你好,{{USER_NAME}}:<br><br> {{BODY_TEXT}} {{VERIFY_CODE}} <br><br> 此为系统自动发送邮件,请勿直接回复。 </td> </tr> </center> </body> </html>
你可以根据自己的邮件内容需求,加任意多的占位符,比如跳转链接、到期时间这类动态字段都可以用同样方式处理。
修改后的 makeEmail.js
const fs = require('fs'); const path = require('path'); // 服务启动时一次性读取并缓存模板 const htmlTemplate = fs.readFileSync( path.join(__dirname, 'generalContact.html'), 'utf8' ); /** * 生成自定义内容的邮件HTML * @param {Object} options 邮件动态内容 * @param {string} options.userName 收件人用户名 * @param {string} options.bodyText 邮件正文内容 * @param {string} [options.verifyCode] 可选:校验码 */ const makeEmail = (options) => { const { userName = '尊敬的用户', bodyText, verifyCode = '' } = options; // 逐个替换占位符,生成最终邮件内容 return htmlTemplate .replaceAll('{{USER_NAME}}', userName) .replaceAll('{{BODY_TEXT}}', bodyText) .replaceAll('{{VERIFY_CODE}}', verifyCode); }; module.exports = makeEmail;
注意:如果动态内容是用户提交的不可信文本,建议先对内容做HTML转义再替换,避免特殊字符打乱邮件排版、或者出现内容注入问题。
调用示例
在你的业务逻辑里触发邮件发送时,传入对应参数即可生成个性化邮件:
const makeEmail = require('./makeEmail'); // 1. 发送注册欢迎邮件 const welcomeMail = makeEmail({ userName: '张三', bodyText: '欢迎注册账号,你现在可以登录平台使用全部功能。' }); // 2. 发送验证码邮件 const verifyCodeMail = makeEmail({ userName: '李四', bodyText: '你正在进行身份验证,专属校验码为:', verifyCode: '872619(10分钟内有效)' });
内容的提问来源于stack exchange,提问作者kissues
相关产品推荐
相关产品推荐

