2016-09-14 10 views
9

Я хочу отправить электронное письмо с помощью nodemailer с помощью html-шаблона. В этом шаблоне мне нужно динамически вводить некоторые переменные, и я действительно не могу этого сделать. Мой код:Передача переменной в html-шаблон в 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); 
    } 
}); 

Допустим, я хочу в emailWithPDF.html что-то вроде этого:

Hello {{username}}! 

Я нашел несколько примеров, где было чем-л так:

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

но Я хочу его в отдельном файле html. Является ли это возможным?

ответ

8

Что вы можете сделать, это прочитать файл HTML с использованием 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 формате. электронная почта

текст. {{ext}} (необязательно) - для текстового формата стиля электронной почты.

{{ext}} (необязательно) - стили для темы в формате html.

{{вн}} (необязательно) - для субъекта электронной почты

Престол поддерживает шаблонные движки для расширения возможно шаблонных двигателя (например, .ejs, .jade, .nunjucks) использовать для значения {{внутр }} выше.

Вы можете прикрепить любое имя файла к чему угодно, чтобы помочь вам легче идентифицировать файлы в вашей среде IDE. Единственное требование состоит в том, что имя файла содержит html., Text., Style. И subject. соответственно.

+0

Есть ли другой способ для того же, как мы делаем в случае .pug-файла, мы просто передаем объект для сопоставления переменной –

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

  • Нет связанных вопросов^_^