it-roy-ru.com

Передать переменную в шаблон HTML в нодмейлере

Я хочу отправить письмо с помощью 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: '[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. Является ли это возможным?

15
Wacław Łabuda

Что вы можете сделать, это прочитать 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);
        }
    });
});
27
Ananth Pai

Если вы используете 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: '[email protected]',
});

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

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

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

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

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

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

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

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

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

3
Michael Troger

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

Просто быстрый способ визуализации шаблона в отдельном файле с помощью функции рендеринга 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: '[email protected]',
  to: '[email protected]',
  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 для получения дополнительной информации. Обратите внимание, что это приведет к повторной компиляции шаблона при каждой отправке сообщения. Это хорошо для периодической доставки по электронной почте. Если вы отправляете тонны электронной почты, вы можете кэшировать скомпилированный шаблон, чтобы обойти это. Проверьте документы мопса для этой настройки, если вам это нужно. 

1
wondersz1

Вы можете использовать Web Request для создания HTML-шаблона с использованием handlebars или любого другого движка.

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

Сначала вы должны создать HTML-шаблон для тела письма. В этом примере я использовал файл hbs руля.

 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)
        })
    })
}
1
J.C. Gras

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

Попробуйте изменить это на это:

`Hello ${username}!`

Убедитесь, что это не кавычки, а обратные галочки.

0
Kullya