2014-09-28 2 views
4

У меня есть шаблон html, который мы используем для отправки на новые регистрации веб-сайтов. Это простой html-файл, который я бы хотел загрузить в переменную, чтобы я мог заменить некоторые части перед отправкой с помощью nodemailer (например, [FIRST_NAME]). Я пытаюсь не вставлять большую часть html в мою функцию экспорта. Любые идеи о том, как я могу это сделать?Как добавить шаблон html электронной почты в приложение js узла

Для более четкого представления, что мне нужно знать, как на самом деле это сделать:

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

Почему бы не использовать какой-либо из JS шаблонных двигателей (нефрит, EJS, усы)? Это именно та задача, для которой они созданы. – soulcheck

+0

Его не для использования на стороне клиента, мне нужно его на стороне сервера, чтобы отправить электронное письмо. Я использую Jade на стороне сервера, но я не знаю, как использовать Jade в этом конкретном экземпляре. – MindWire

+0

@Mindware ничего не мешает вам использовать шаблонный движок по вашему выбору на стороне сервера. Это просто javascript. – soulcheck

ответ

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

+0

@MindWire просто загрузите его с помощью модуля fs. – soulcheck

+0

@MindWire см. в редакции. – soulcheck

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} 

Вот пример использования шаблонов электронной почты и 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

Предоставление ошибки в строке: шаблон.render (locals, function (err, results) { , что местные жители не определены. Пожалуйста, помогите решить эту проблему –

+0

@ Местные жители RahulMankar должны быть определены вами. Пример: var locals = { email: 'email @ example .com», имя пользователя: 'testUsername', имя: { первый: 'Myfirst', последнее: 'Mylast' }} пожалуйста, смотрите в документации для более https://github.com/ nodemailer/nodemailer –

+0

Спасибо Angel M.! –

Смежные вопросы