2014-09-28 39 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

相关问题