webentwicklung-frage-antwort-db.com.de

Übergeben Sie die Variable an die HTML-Vorlage in nodemailer

Ich möchte E-Mails mit Nodemailer unter Verwendung der HTML-Vorlage senden. In dieser Vorlage muss ich einige Variablen dynamisch einfügen und das kann ich wirklich nicht. Mein Code:

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

Sagen wir, ich möchte in emailWithPDF.html so etwas:

Hello {{username}}!

Ich habe einige Beispiele gefunden, wo smth so war:

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

aber ich möchte es in separaten html-datei. Ist es möglich?

15
Wacław Łabuda

Sie können die HTML-Datei mit dem Modul fs im Knoten lesen und dann die Elemente, die Sie ändern möchten, im HTML-String mit handlebars ersetzen 

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

Wenn Sie Nodemailer 2.0.0 oder höher verwenden, lesen Sie diese Dokumentation: https://community.nodemailer.com/2-0-0-beta/templating/ Dort wird erläutert, wie Sie sie verwenden von externem Rendering mit solchen Vorlagen:

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

Sie geben auch dieses Beispiel an:

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

wo Sie sehen, wie Sie Variablen übergeben.

Sie benötigen das email-templates-Modul: https://github.com/crocodilejs/node-email-templates und eine Template-Engine Ihrer Wahl.

In der Dokumentation zu email-templates finden Sie auch, wie Sie Ihre Dateistruktur so gestalten, dass Ihre Vorlagen gefunden werden:

html. {{ext}} (erforderlich) - für das HTML-Format von E-Mails 

text. {{ext}} (optional) - für das Textformat des E-Mail-Stils.

{{ext}} (optional) - Stile für den Betreff des HTML-Formats.

{{ext}} (optional) - für den Betreff der E-Mail

Siehe unterstützte Vorlagenmodule für mögliche Vorlagenmodulerweiterungen (z. B. .ejs, .jade, .nunjucks), die für den Wert von {{ext}} oben verwendet werden sollen.

Sie können einem beliebigen Dateinamen einen beliebigen Namen voranstellen, damit Sie die Dateien in Ihrer IDE leichter identifizieren können. Die einzige Voraussetzung ist, dass der Dateiname html., Text., Style. Und subject enthält. beziehungsweise.

3
Michael Troger

Für diejenigen, die Pug als Template-Engine verwenden

Nur eine schnelle Methode zum Rendern einer Vorlage in einer separaten Datei mithilfe der Pug-Renderfunktion:

// 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}

Siehe https://pugjs.org/api/getting-started.html für weitere Details. Beachten Sie, dass dies bei jedem Senden einer Nachricht zu einer erneuten Erstellung der Vorlage führt. Das ist gut für gelegentliche E-Mail-Zustellungen. Wenn Sie Tonnen von E-Mails senden, können Sie die kompilierte Vorlage zwischenspeichern, um dies zu umgehen. Überprüfen Sie die Pug-Dokumente für das Setup, wenn Sie es benötigen. 

1
wondersz1

Sie können eine Web-Anfrage verwenden, um eine HTML-Vorlage mit handlebars oder einer anderen Engine zu erstellen.

Erstellen Sie eine Vorlage

Zunächst müssen Sie eine HTML-Vorlage für den E-Mail-Text erstellen. In diesem Beispiel habe ich eine hbs-Lenkerdatei verwendet.

 enter image description here

Machen Sie Ihren Entwurf mit html und fügen Sie die Variablen hinzu, die Sie in der Nachricht benötigen:

   <!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>

Erstellen Sie eine Vorlagenanfrage

Sie müssen den Zugriff auf diese Ansicht erstellen. Dann wird eine Anforderung erstellt, in der wir den Namen der Vorlage als URL-Parameter senden können, um die Anforderung für andere Vorlagen parametrierbar zu machen.

const web = express.Router()

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

Mail-Funktion

Schließlich können Sie die E-Mail senden, nachdem Sie die Anfrage an die Vorlage gesendet haben. Sie können eine Funktion wie die folgende verwenden:

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

Dies kann ohne Vorlagen erfolgen. 

Versuchen Sie es so zu ändern:

`Hello ${username}!`

Stellen Sie sicher, dass es sich hierbei nicht um umgekehrte Kommas handelt, sondern um Häkchen.

0
Kullya