如何通过Nodemailer发送HTML邮件模板?MERN栈报错求助
解决Nodemailer中HTML模板的SyntaxError问题
错误原因
你的代码报错核心有两个问题:
- JavaScript对象的属性值如果是字符串,必须用引号(单引号、双引号或反引号)包裹,直接写
<div>...</div>会让Node.js把<识别为非法语法符号,抛出SyntaxError。 - 直接在字符串中写
{name}不会自动解析为变量值,需要用ES6模板字符串的${变量名}语法才能实现动态变量插入。
可行的实现方法
方法1:使用ES6模板字符串(推荐)
用反引号(`)包裹HTML内容,同时用${变量名}插入动态值,写法简洁易读:
const {name, email, phone, message} = req.body; const mailOptions = { from: process.env.AUTH_EMAIL, to: 'vs61@queensu.ca', subject: 'Community Partnership Project Contact Form Inquiry', html: `<div>Name: ${name}<br/>Email: ${email}<br/>Phone: ${phone}<br/>Message: ${message}</div>` }
方法2:普通字符串拼接(兼容旧环境)
如果项目不支持ES6语法,可以用+拼接字符串和变量:
const {name, email, phone, message} = req.body; const mailOptions = { from: process.env.AUTH_EMAIL, to: 'vs61@queensu.ca', subject: 'Community Partnership Project Contact Form Inquiry', html: '<div>Name: ' + name + '<br/>Email: ' + email + '<br/>Phone: ' + phone + '<br/>Message: ' + message + '</div>' }
方法3:使用外部HTML模板文件(适合复杂模板)
如果邮件模板内容较多、结构复杂,可以把模板单独存为HTML文件,再读取并替换变量:
- 创建
email-template.html文件:
<div> Name: {{name}}<br/> Email: {{email}}<br/> Phone: {{phone}}<br/> Message: {{message}} </div>
- 后端读取并替换模板占位符:
const fs = require('fs'); const path = require('path'); const {name, email, phone, message} = req.body; // 读取模板文件 const templatePath = path.join(__dirname, 'email-template.html'); let htmlContent = fs.readFileSync(templatePath, 'utf8'); // 替换模板中的变量占位符 htmlContent = htmlContent .replace('{{name}}', name) .replace('{{email}}', email) .replace('{{phone}}', phone) .replace('{{message}}', message); const mailOptions = { from: process.env.AUTH_EMAIL, to: 'vs61@queensu.ca', subject: 'Community Partnership Project Contact Form Inquiry', html: htmlContent }
内容的提问来源于stack exchange,提问作者Soccerball123
相关产品推荐
相关产品推荐

