将variables传递给nodemailer中的html模板

我想用html模板发送电子邮件给nodemailer。 在这个模板中,我需要dynamic地注入一些variables,我真的不能这样做。 我的代码:

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); } }); 

比方说,我想在emailWithPDF.html这样的东西:

 Hello {{username}}! 

我已经find了一些例子,在哪里是这样的:

 ... html: '<p>Hello {{username}}</p>' ... 

但我想要在单独的HTML文件中。 可能吗?

你可以做的是在节点中使用fs模块读取HTML文件,然后使用handlebarsreplace你想在htmlstring中更改的元素

 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); } }); }); 

如果您使用的是Nodemailer 2.0.0或更高版本,请查看以下文档: https ://nodemailer.com/2-0-0-beta/templating/在这里,他们解释了如何使用外部呈现模板:

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

他们也给这个例子:

 // 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', }); 

你在哪里看到如何传递variables。

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

同样在email-templates的文档中,您将find如何创build文件结构以便可以find您的模板:

html。{{ext}}(必填) – html格式的电子邮件

文本。{{ext}}(可选) – 用于电子邮件风格的文本格式。

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

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

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

您可以使用任何您喜欢的任何文件名称作为前缀,以帮助您更轻松地在IDE中识别文件。 唯一的要求是文件名包含html。,text,style和subject。 分别。