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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:36:27