使用Nodemailer无法向HTML邮件模板传递变量值的问题
解决HTML模板中{{变量}}无法渲染的问题
问题根源
Nodemailer本身不支持解析模板中的{{变量}}语法,你在mailOptions里定义的context不会自动关联到HTML模板上,必须借助模板引擎手动完成模板渲染后,再把渲染好的内容传给Nodemailer。
解决方案1:使用Handlebars模板引擎(推荐)
这是处理模板渲染最规范的方式,适合多变量、复杂模板场景:
- 先安装Handlebars依赖
npm install handlebars
- 修改代码,实现模板读取、编译与渲染
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}`); });
- 你的
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
相关产品推荐
相关产品推荐

