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?
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);
}
});
});
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.
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.
Sie können eine Web-Anfrage verwenden, um eine HTML-Vorlage mit handlebars
oder einer anderen Engine zu erstellen.
Zunächst müssen Sie eine HTML-Vorlage für den E-Mail-Text erstellen. In diesem Beispiel habe ich eine hbs
-Lenkerdatei verwendet.
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>
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
})
})
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)
})
})
}
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.