2016-09-14 101 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文件的情況下,我們只是將對象傳遞給映射變量 –