将变量传递给nodemailer中的html模板

Wac*_*uda 20 html javascript node.js express nodemailer

我想使用html模板向nodemailer发送电子邮件.在那个模板中,我需要动态注入一些变量,我真的不能这样做.我的代码:

var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');

smtpTransport = nodemailer.createTransport(smtpTransport({
    host: mailConfig.host,
    secure: mailConfig.secure,
    port: mailConfig.port,
    auth: {
        user: mailConfig.auth.user,
        pass: mailConfig.auth.pass
    }
}));
var mailOptions = {
    from: 'my@email.com',
    to : 'some@email.com',
    subject : 'test subject',
    html : { path: 'app/public/pages/emailWithPDF.html' }
};
smtpTransport.sendMail(mailOptions, function (error, response) {
    if (error) {
        console.log(error);
        callback(error);
    }
});
Run Code Online (Sandbox Code Playgroud)

假设我想在emailWithPDF.html中这样:

Hello {{username}}!
Run Code Online (Sandbox Code Playgroud)

我找到了一些例子,其中有如下情况:

...
html: '<p>Hello {{username}}</p>'
...
Run Code Online (Sandbox Code Playgroud)

但我希望它在单独的html文件中.可能吗?

Ana*_*Pai 36

您可以做的是使用fs节点中的模块读取HTML文件,然后使用替换html字符串中要更改的元素handlebars

var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
var handlebars = require('handlebars');
var fs = require('fs');

var readHTMLFile = function(path, callback) {
    fs.readFile(path, {encoding: 'utf-8'}, function (err, html) {
        if (err) {
            throw err;
            callback(err);
        }
        else {
            callback(null, html);
        }
    });
};

smtpTransport = nodemailer.createTransport(smtpTransport({
    host: mailConfig.host,
    secure: mailConfig.secure,
    port: mailConfig.port,
    auth: {
        user: mailConfig.auth.user,
        pass: mailConfig.auth.pass
    }
}));

readHTMLFile(__dirname + 'app/public/pages/emailWithPDF.html', function(err, html) {
    var template = handlebars.compile(html);
    var replacements = {
         username: "John Doe"
    };
    var htmlToSend = template(replacements);
    var mailOptions = {
        from: 'my@email.com',
        to : 'some@email.com',
        subject : 'test subject',
        html : htmlToSend
     };
    smtpTransport.sendMail(mailOptions, function (error, response) {
        if (error) {
            console.log(error);
            callback(error);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 这支持内联 CSS 样式吗? (2认同)
  • 是的,您可以将 css 样式添加到您的 html 页面 (2认同)
  • 谢谢@AnanthPai,发布的答案非常有帮助。最初,我对带有把手、快速把手等的动态电子邮件模板感到非常困惑,现在有了清晰的东西。 (2认同)

Umu*_*maz 11

我在所有项目中都使用它。更干净、最新且易于理解。回调地狱不存在。 sendMail.ts用handlebar读取html文件,将相关变量放入内容中,发送。

import * as nodemailer from 'nodemailer';
import * as handlebars from 'handlebars';
import * as fs from 'fs';
import * as path from 'path';

export async function sendEmail(email: string, subject: string, url: string) {
  const filePath = path.join(__dirname, '../emails/password-reset.html');
  const source = fs.readFileSync(filePath, 'utf-8').toString();
  const template = handlebars.compile(source);
  const replacements = {
    username: "Umut YEREBAKMAZ"
  };
  const htmlToSend = template(replacements);
  const transporter = nodemailer.createTransport({
    host: "smtp.mailtrap.io",
    port: 2525, // 587
    secure: false,
    auth: {
      user: "fg7f6g7g67",
      pass: "asds7ds7d6"
    }
  });
  const mailOptions = {
    from: '"noreply@yourdomain.com" <noreply@yourdomain.com>',
    to: email,
    subject: subject,
    text: url,
    html: htmlToSend
  };
  const info = await transporter.sendMail(mailOptions);
  console.log("Message sent: %s", info.messageId);
  console.log("Preview URL: %s", "https://mailtrap.io/inboxes/test/messages/");

}
Run Code Online (Sandbox Code Playgroud)

  • 可以这样在 HTML 模板中使用本地图片吗?尝试使用一个但无法加载。使用 URL 当然可以。 (2认同)

小智 8

字符串替换不是一个好主意,因为您必须恢复旧字符串或创建一个备份文件才能再次更改它们,而且它不会是异步的,并且会导致各个方面的问题!您可以更轻松更清洁地做到这一点

只需转到您的邮件选项并使用您的变量添加上下文

var mailOptions = {
  from: 'nginx-iwnl@gmail.com',
  to: 'username@gmail.com',
  subject: 'Sending email',
  template: 'yourTemplate',
  context: {                  // <=
    username: username,
    whatever: variable
  }
};
Run Code Online (Sandbox Code Playgroud)

接下来要做的是打开您的 html 文件并调用您的变量,例如:

{{用户名}}


Ces*_*ran 8

在那里创建一个文件,emailTemplates.js您可以将每个模板存储为一个函数

emailTemplate.js

const newsLetterEmail = (clientName) => `<p>Hi ${clientName}, here you have today news.</p>`
const welcomeEmail = (clientName, username) => `<p>Welcome ${clientName}, your username is ${username}.</p>`

export {newsLetterEmail, welcomeEmail}

Run Code Online (Sandbox Code Playgroud)

然后在控制器中调用任何 templateFunction 并存储在输出变量中

控制器.js

import {welcomeEmail} from './emailTeamplates.js'

const registerUser = async(req, res) => {
    const {name, usename, email} = req.body
    // User register code....
    const output = welcomeEmail(name, username)

    let mailOptions = {
        from: '"Welcome" <welcome@welcome.com>',
        to: 'client@gmail.com',
        subject: 'Welcome email!',
        text: 'Hello World',
        html: output,
    }
 
Run Code Online (Sandbox Code Playgroud)

  • 最佳答案 (2认同)

Mic*_*ger 5

如果您使用的是 Nodemailer 2.0.0 或更高版本,请查看此文档:https ://community.nodemailer.com/2-0-0-beta/templating/ 在那里他们解释了如何使用带有此类模板的外部渲染:

// external renderer
var EmailTemplate = require('email-templates').EmailTemplate;
var send = transporter.templateSender(new EmailTemplate('template/directory'));
Run Code Online (Sandbox Code Playgroud)

他们还举了这个例子:

// create template based sender function
// assumes text.{ext} and html.{ext} in template/directory
var sendPwdReminder = transporter.templateSender(new EmailTemplate('template/directory'), {
    from: 'sender@example.com',
});
Run Code Online (Sandbox Code Playgroud)

在这里您可以看到如何传递变量。

您将需要该email-templates模块:https : //github.com/crocodilejs/node-email-templates和您选择的模板引擎。

同样在email-templates您的文档中,您将找到如何制作文件结构以便可以找到您的模板:

html.{{ext}} (required) - 用于 html 格式的电子邮件

text.{{ext}} (optional) - 用于电子邮件样式的文本格式。

{{ext}}(可选)- html 格式主题的样式。

{{ext}}(可选) - 用于电子邮件主题

请参阅支持的模板引擎以获取可能的模板引擎扩展(例如 .ejs、.jade、.nunjucks)以用于上述 {{ext}} 的值。

您可以在任何文件名前加上您喜欢的任何内容,以帮助您在 IDE 中更轻松地识别文件。唯一的要求是文件名包含 html.、text.、style. 和主题。分别。