Передать переменную в html-шаблон в nodemailer

Я хочу отправить письмо с nodemailer с помощью шаблона html. В этом шаблоне мне нужно ввести некоторые динамически некоторые переменные, и я действительно не могу этого сделать. Мой код:

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: 'my@email.com',
    to : 'some@email.com',
    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}}!

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

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

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

5 ответов


что вы можете сделать, это прочитать 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: 'my@email.com',
        to : 'some@email.com',
        subject : 'test subject',
        html : htmlToSend
     };
    smtpTransport.sendMail(mailOptions, function (error, response) {
        if (error) {
            console.log(error);
            callback(error);
        }
    });
});

если вы используете Nodemailer 2.0.0 или выше, проверьте эту документацию: https://community.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: 'sender@example.com',
});

где вы видите, как передавать переменные.

вам понадобится email-templates модуль: https://github.com/crocodilejs/node-email-templates и шаблонизатор на ваш выбор.

также в документации email-templates вы найдете, как сделать структуру файла, чтобы ваши шаблоны можно было найти:

HTML-код.{{ext}} (обязательно) - для html формата email

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

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

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

см. В разделе поддерживаемые шаблон движки для возможных расширений движка шаблонов (например .EJS по, .нефрит. ,nunjucks) использовать для значения {{ext}} выше.

вы можете префикс любое имя файла с чем угодно, чтобы помочь вам идентифицировать файлы более легко в вашей среде IDE. Единственное требование заключается в том, что имя файла содержит HTML., текст., стиль. и субъект. соответственно.


можно использовать Веб-Запрос для создания шаблона html с помощью handlebars или любой другой двигатель.

создать шаблон

сначала вы должны создать шаблон html для тела электронной почты. В этом примере я использовал руль .

enter image description here

сделайте свой дизайн с помощью html и добавьте переменные, которые вам понадобятся в сообщении:

   <!DOCTYPE html>
   <html>
    <head>
        <meta name="viewport" content="width=device-width">
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Welcome Email Template</title>
    </head>
    <body>
     <p style="font-size: 14px; font-weight: normal;">Hi {{data.name}}</p>
    </body>
   </html>

создать шаблон запрос

необходимо создать доступ к этому представлению. Затем создается запрос, куда мы можем отправить имя шаблона в качестве параметра url, чтобы сделать запрос параметризуемым для других шаблонов.

const web = express.Router()

web.post('/template/email/:template', function(req, res) {
  res.render(`templates/email/${req.params.template}`, {
    data: req.body        
  })
})

функции Почты

наконец, вы можете отправить электронное письмо после запроса на шаблон. Вы можете использовать следующую функцию:

const nodemailer = require('nodemailer')
const request = require("request")

function sendEmail(toEmail, subject, templateFile) {
    var options = {
        uri: `http://localhost:3000/template/email/${templateFile}`,
        method: 'POST',
        json: { name: "Jon Snow" } // All the information that needs to be sent
    };  
    request(options, function (error, response, body) {
        if (error) console.log(error)
        var transporter = nodemailer.createTransport({
            host: mailConfig.host,
            port: mailConfig.port,
            secure: true,
            auth: {
                user: mailConfig.account,
                pass: mailConfig.password
            }
        })
        var mailOptions = {
            from: mailConfig.account,
            to: toEmail,
            subject: subject,
            html: body
        }       
        transporter.sendMail(mailOptions, function(error, info) {
            if (error) console.log(error)
        })
    })
}

Это можно сделать без шаблонов.

попробуйте изменить его к этому:

`Hello ${username}!`

убедитесь, что это не перевернутые запятые, а обратные тики.


для тех, кто использует мопса в качестве шаблона двигателя

просто быстрый способ визуализации шаблона в отдельном файле с помощью функции рендеринга pug:

// function to send an e-mail. Assumes you've got nodemailer and pug templating engine installed. 
// transporter object relates to nodemailer, see nodemailer docs for details
const nodemailer = require('nodemailer');
const pug = require('pug');
function send_some_mail(iterable){
var message = {
  from: 'from@example.com',
  to: 'to@example.com',
  subject: 'Message title',
  html: pug.renderFile(__dirname + 'path_to_template.pug', {iterable: iterable})
};
transporter.sendMail(message, function(err, info){...})
}

// template.pug
each item in iterable
li
  p #{item.name}

см.https://pugjs.org/api/getting-started.html для получения дополнительной информации. Обратите внимание, что это приведет к повторной компиляции шаблона при каждой отправке сообщения. Это нормально для случайных доставок электронной почты. Если вы отправляете тонны электронных писем, вы можете кэшировать скомпилированный шаблон, чтобы обойти это. Проверьте документы pug для этой настройки, если вам это нужно.