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

如何填充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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:15:09