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

使用Nodemailer无法向HTML邮件模板传递变量值的问题

解决HTML模板中{{变量}}无法渲染的问题

问题根源

Nodemailer本身不支持解析模板中的{{变量}}语法,你在mailOptions里定义的context不会自动关联到HTML模板上,必须借助模板引擎手动完成模板渲染后,再把渲染好的内容传给Nodemailer。

解决方案1:使用Handlebars模板引擎(推荐)

这是处理模板渲染最规范的方式,适合多变量、复杂模板场景:

  1. 先安装Handlebars依赖
npm install handlebars
  1. 修改代码,实现模板读取、编译与渲染
const express = require('express');
const bodyParser = require('body-parser');
const nodemailer = require('nodemailer');
const fs = require('fs');
const handlebars = require('handlebars');
const app = express();

app.use(express.static('public'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
const port = process.env.PORT || 5000;

app.get('/', (req, res) => {
     res.sendFile(__dirname + '/index.html'); // 补全__dirname确保路径正确
});

var transporter = nodemailer.createTransport({
     service: 'gmail',
     auth: {
          user: 'paramjeetrtr@gmail.com',
          pass: '你的Gmail应用密码', // 需开启两步验证后生成应用密码
     },
});

// 读取HTML模板文件并编译
const templateContent = fs.readFileSync('./mail.html', 'utf8');
const compiledTemplate = handlebars.compile(templateContent);

// 定义模板变量
const templateData = {
     username: "shubh",
     whatever: "dont know",
};

// 渲染得到最终HTML内容
const renderedHtml = compiledTemplate(templateData);

var mailOptions = {
     from: 'paramjeetrtr@gmail.com',
     to: 'shubhtomar30may@gmail.com',
     subject: 'Risposta Application Password',
     html: renderedHtml // 传入渲染后的HTML
};

transporter.sendMail(mailOptions, function (error, info) {
     if (error) {
          console.log(error);
     } else {
          console.log('Email sent: ' + info.response);
     }
});

app.listen(port, () => {
     console.log(`Server listening on port ${port}`);
});
  1. 你的mail.html模板可以直接保留{{变量}}语法,示例:
<!DOCTYPE html>
<html>
<body>
  <h1>Hi {{username}}!</h1>
  <p>测试变量内容:{{whatever}}</p>
</body>
</html>

解决方案2:手动字符串替换(适合少量变量场景)

如果不想引入模板引擎,可以用简单的字符串替换实现:

// 替换原代码中模板相关逻辑
const templateContent = fs.readFileSync('./mail.html', 'utf8');
const renderedHtml = templateContent
     .replace('{{username}}', 'shubh')
     .replace('{{whatever}}', 'dont know');

之后在mailOptions中传入html: renderedHtml即可。

额外注意事项

  • 确保mail.html的文件路径正确,用__dirname拼接路径(如__dirname + '/mail.html')能避免相对路径出错
  • Gmail发送邮件需要启用两步验证,并生成专门的应用密码填入auth.pass,普通密码会被拦截

内容的提问来源于stack exchange,提问作者shubham tomar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:35:36