如何填充Express Handlebars模板并作为邮件发送
解决方案
核心做法是直接利用express-handlebars的模板渲染能力生成HTML字符串,再将其作为邮件的HTML内容通过nodemailer发送,完全不需要依赖Puppeteer这类工具。
步骤1:获取Handlebars渲染实例
先确保你已经完成express-handlebars的基础配置,然后直接获取它的渲染引擎实例,用于手动渲染模板(不用通过res.render输出到浏览器):
const express = require('express'); const exphbs = require('express-handlebars'); const app = express(); // 配置express-handlebars,根据你自己的项目调整参数 const hbs = exphbs.create({ defaultLayout: 'main', // 你的默认布局文件名 partialsDir: './views/partials' // 若使用局部模板,指定对应目录 }); app.engine('handlebars', hbs.engine); app.set('view engine', 'handlebars');
步骤2:手动渲染模板为HTML字符串
调用hbs.renderView()方法(部分版本可用hbs.render())直接渲染模板并获取完整HTML字符串,传入你的模板数据(包括Base64图片内容):
async function generateEmailHtml() { try { // 你的模板数据,和浏览器渲染时用的结构一致 const templateData = { emailTitle: '自定义邮件标题', contentText: '这是邮件里的文本内容', // Base64图片直接用浏览器渲染时的格式传入 bannerImage: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...', logoImage: 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD...' }; // 渲染指定模板(对应views目录下的email-template.handlebars文件) const htmlContent = await hbs.renderView('email-template', templateData); return htmlContent; } catch (err) { console.error('模板渲染失败:', err); throw err; } }
步骤3:用Nodemailer发送样式化邮件
把渲染好的HTML字符串传入nodemailer的邮件配置,设置html字段即可发送:
const nodemailer = require('nodemailer'); // 配置Nodemailer传输器,替换成你的SMTP信息 const transporter = nodemailer.createTransport({ host: 'smtp.your-email-provider.com', port: 587, secure: false, auth: { user: 'your-account@xxx.com', pass: 'your-email-password' } }); async function sendStyledEmail() { try { const emailHtml = await generateEmailHtml(); const mailOptions = { from: '发件人 <your-account@xxx.com>', to: '收件人 <target@xxx.com>', subject: '你的样式化邮件', html: emailHtml // 这里传入渲染好的HTML内容 }; await transporter.sendMail(mailOptions); console.log('邮件发送成功'); } catch (err) { console.error('邮件发送失败:', err); } } // 调用发送函数 sendStyledEmail();
注意事项
- Base64图片兼容性:主流邮件客户端(Gmail、Outlook等)都支持直接嵌入Base64图片,但老旧客户端可能存在兼容问题。如果需要更广泛的兼容性,可以把图片上传到公开CDN,模板里改用普通URL链接。
- 模板路径校验:确保
renderView()的模板文件名对应views目录下的正确文件,若使用了布局或局部模板,要保证配置的目录路径正确。 - 异步处理:渲染和发送邮件都是异步操作,务必用
async/await或Promise处理,避免回调嵌套问题。
内容的提问来源于stack exchange,提问作者daniel sas
相关产品推荐
相关产品推荐

