2014-09-28 59 views
4

我有一個html模板,用於發送到新的網站註冊。這是一個簡單的html文件,我希望將其加載到變量中,以便在發送使用nodemailer(例如[FIRST_NAME])之前替換某些部分。我試圖避免不得不將大塊html粘貼到我的exports函數中。關於如何去做這件事的任何想法?如何在節點js應用程序中包含html電子郵件模板

對於一個清晰的概念,我需要知道的是如何真正做到這一點:

var first_name = 'Bob'; 
var html = loadfile('abc.html').replace('[FIRST_NAME]', first_name); 
+0

爲什麼不使用任何JS模板引擎的(玉石,EJS,鬍子)?這正是他們的任務。 – soulcheck 2014-09-28 13:06:37

+0

它不適合客戶端使用,我需要它在服務器端發送電子郵件。我在服務器端使用Jade,但我不知道如何在這個特定的實例中利用Jade。 – MindWire 2014-09-28 13:36:18

+0

@Mindware沒有什麼能阻止你在服務器端使用你選擇的模板引擎。這只是javascript。 – soulcheck 2014-09-28 13:48:25

回答

4

這裏有一個如何使用EJS做一個例子,但是你可以使用任何模板引擎:

var nodemailer = require("nodemailer"); 
var ejs = require('ejs'); 

var transport = nodemailer.createTransport("SMTP", { 
     service: <your mail service>, 
     auth: { 
      user: <user>, 
      pass: <password> 
     } 
}); 

function sendMail(cb) { 
    var user = {firstName : 'John', lastName: 'Doe'}; 

    var subject = ejs.render('Hello <%= firstName %>', user); 
    var text = ejs.render('Hello, <%= firstName %> <%= lastName %>!', user); 


    var options = { 
     from: <from>, 
     replyTo: <replyto>, 
     to: <to>, 
     subject: subject, 
     text: text 
    }; 

    transport.sendMail(options, cb); 

} 

加載模板文件就是我們的fs模塊。以下是如何同步做時,文件中的UTF-8編碼:

var fs = require('fs'); 

var template = fs.readFileSync('abc.html',{encoding:'utf-8'}); 
+0

鑑於上面的例子,我怎樣才能使它從文件中加載文本,我可以替換字符串......例如:「var text =(loadfile('abc.html')。replace('[FIRST_NAME] ',first_name_variable)「 – MindWire 2014-09-30 12:48:48

+0

@MindWire只是使用fs模塊加載它 – soulcheck 2014-09-30 13:00:24

+0

@MindWire請參閱編輯 – soulcheck 2014-09-30 18:54:33

1

也許這將是有用的人,因爲這個問題已經回答了。

我與玉的工作,這是很有挑戰性的想出來,在最後被證明是非常簡單:)

(PS:此代碼沒有經過優化,只是一個例子)

的js部分與nodemailer:

var nodemailer = require('nodemailer') 
var jade = require('jade'); 
var config = { 
    // config for sending emails like username, password, ... 
} 
var emailFrom = '[email protected]'; 
var emailTo = '[email protected]'; 
var templateDir = 'path/to/templates/'; 
var transporter = nodemailer.createTransport(config); 

var username = 'thisUsername' 
// rendering html template (same way can be done for subject, text) 
var html = jade.renderFile(templateDir+'/html.jade', {username: 'testUsername'}); 

//build options 
var options = { 
    from: emailFrom, 
    to: emailTo, 
    subject: 'subject', 
    html: html, 
    text:'text' 
}; 

transporter.sendMail(options, function(error, info) { 
    if(error) { 
    console.log('Message not sent'); 
    console.log(info); 
    return false; 
    } 
    else{ 
    console.log('Message sent: ' + info.response); 
    console.log(info); 
    return true; 
    }; 
}); 

html.jade

p test email html jade 
p 
| Username: 
| !{username} 

以下是使用email-templates和nodemailer的示例。

js文件:

var path = require('path'); 
var EmailTemplate = require('email-templates').EmailTemplate; 
var transporter = nodemailer.createTransport(config); 

var templateDir = path.join(__dirname, '/yourPath/emailTemplates', 'subdir'); 
var template = new EmailTemplate(templateDir) 
var username = 'testUsername'; 


var transport = nodemailer.createTransport(config) 
template.render(locals, function (err, results) { 
    if (err) { 
    return console.error(err) 
    } 
    // replace values in html template 
    console.log('template render') 
    console.log(err); 

    // default is results.html in this case 
    // read template and replace desired values 
    var res1 = results.html.toString(); 
    var str = res1.replace('__username__', username); 
    console.log(str); 
    console.log('end template render') 

    transport.sendMail({ 
    from: emailFrom, 
    to: emailTo, 
    subject: 'subject', 
    html: str, 
    text: results.text 
    }, function (err, responseStatus) { 
    if (err) { 
     return console.error(err) 
    } 
    console.log(responseStatus) 
    }) 
}) 

中將Html.HTML

test email html 
username: 

<div> 
__username__ 
</div> 
+0

發生錯誤: 模板。渲染(當地人,功能(錯誤,結果){ ,當地人沒有定義。請幫助解決這個問題 – 2017-05-03 09:28:21

+0

@RahulMankar當地人應該由你自己定義。var locals = {email:'email @ example .COM」, 用戶名: 'testUsername', 名稱:{ 第一: 'Myfirst', 最後: 'Mylast' }} 請 看看文檔的詳細https://github.com/ nodemailer/nodemailer – 2017-05-04 08:13:57

+0

謝謝Angel M.! – 2017-05-29 10:21:13

相關問題