2016-09-14 54 views
9

Chcę wysłać wiadomość e-mail z nodemailer za pomocą szablonu html. W tym szablonie muszę wprowadzić pewne zmienne dynamicznie i naprawdę nie mogę tego zrobić. Mój kod:Przekaż zmienną do szablonu html w nodemailer

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); 
    } 
}); 

Powiedzmy chcę w emailWithPDF.html coś takiego:

Hello {{username}}! 

ja znalazłem kilka przykładów, gdzie był smth tak:

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

ale Chcę go w osobnym pliku html. Czy to możliwe?

Odpowiedz

8

Co można zrobić, to przeczytać plik HTML przy użyciu modułu fs w węźle, a następnie wymienić elementy, które mają być zmienione w ciągu html za pomocą 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

Czy istnieje inny sposób na to samo, jak w przypadku pliku '.pug', wystarczy przekazać obiekt do zmiennej odwzorowania –

2

Jeśli używasz Nodemailer 2.0.0 lub wyższej, należy sprawdzić tę dokumentację: https://nodemailer.com/2-0-0-beta/templating/ Tam wyjaśnić w jaki sposób skorzystać z zewnętrznego renderowania z szablonów tak:

// external renderer 
var EmailTemplate = require('email-templates').EmailTemplate; 
var send = transporter.templateSender(new EmailTemplate('template/directory')); 

Dają również ten przykład:

// 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]', 
}); 

gdzie można zobaczyć, jak przekazywać zmienne.

Potrzebny będzie moduł email-templates: https://github.com/crocodilejs/node-email-templates i wybrany silnik szablonu.

także w dokumentacji email-templates przekonasz się, jak zrobić swoją strukturę plików w celu, który można znaleźć szablony:

html {{}} ext (wymagane) - w formacie html. email

tekst. {{ext}} (opcjonalnie) - dla formatu tekstowego stylu e-mail.

{{ext}} (opcjonalnie) - style dla tematu w formacie html.

{{}} ext (opcjonalnie) - na temat e-mail

See obsługiwane silniki szablonów dla szablonów rozszerzeń możliwe silnika (np .ejs, .jade, .nunjucks) używać do wartości {{EXT }} powyżej.

Możesz poprzedzić dowolną nazwę pliku dowolną treścią, aby ułatwić identyfikację plików w IDE. Jedynym wymaganiem jest, aby nazwa pliku zawierała html., Text., Style. I subject. odpowiednio.

+0

Czy jest jakiś inny sposób na takie same jak w przypadku pliku .pug po prostu przekazujemy obiekt do zmiennej mapy –