2016-09-14 88 views
9

我想使用html模板向nodemailer发送电子邮件。在该模板中,我需要动态地注入一些变量,我真的不能这样做。我的代码:将变量传递给nodemailer中的html模板

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: '[email protected]', 
    to : '[email protected]', 
    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}}! 

我发现一些例子,在那里有水木清华这样的:

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

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

回答

8

你可以做的是读取使用fs模块中节点的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: '[email protected]', 
     to : '[email protected]', 
     subject : 'test subject', 
     html : htmlToSend 
    }; 
    smtpTransport.sendMail(mailOptions, function (error, response) { 
     if (error) { 
      console.log(error); 
      callback(error); 
     } 
    }); 
}); 
+0

有没有其他方法可以像我们在'.pug'文件中那样做,我们只需将对象传递给map变量 –

2

如果您使用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: '[email protected]', 
}); 

你在哪里看到如何传递变量。

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

同样的email-templates的文档中,你会发现如何使您的文件结构,以便您的模板,可以发现:

HTML {{转}}(必需) - 为HTML格式。电子邮件

文字{{转}}(可选) - 用于电子邮件样式的文本格式。

{{转}}(可选) - 样式HTML格式的主题。

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

见支持可能的模板引擎扩展模板引擎(例如.ejs,.jade,.nunjucks)用于{{EXT的价值}} 以上。

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

+0

取代您在HTML字符串要更改的元素是否有任何其他方式对同一像在.pug文件的情况下,我们只是将对象传递给映射变量 –