Wac*_*uda 20 html javascript node.js express nodemailer
我想使用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: '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);
}
});
Run Code Online (Sandbox Code Playgroud)
假设我想在emailWithPDF.html中这样:
Hello {{username}}!
Run Code Online (Sandbox Code Playgroud)
我找到了一些例子,其中有如下情况:
...
html: '<p>Hello {{username}}</p>'
...
Run Code Online (Sandbox Code Playgroud)
但我希望它在单独的html文件中.可能吗?
Ana*_*Pai 36
您可以做的是使用fs
节点中的模块读取HTML文件,然后使用替换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);
}
});
});
Run Code Online (Sandbox Code Playgroud)
Umu*_*maz 11
我在所有项目中都使用它。更干净、最新且易于理解。回调地狱不存在。 sendMail.ts用handlebar读取html文件,将相关变量放入内容中,发送。
import * as nodemailer from 'nodemailer';
import * as handlebars from 'handlebars';
import * as fs from 'fs';
import * as path from 'path';
export async function sendEmail(email: string, subject: string, url: string) {
const filePath = path.join(__dirname, '../emails/password-reset.html');
const source = fs.readFileSync(filePath, 'utf-8').toString();
const template = handlebars.compile(source);
const replacements = {
username: "Umut YEREBAKMAZ"
};
const htmlToSend = template(replacements);
const transporter = nodemailer.createTransport({
host: "smtp.mailtrap.io",
port: 2525, // 587
secure: false,
auth: {
user: "fg7f6g7g67",
pass: "asds7ds7d6"
}
});
const mailOptions = {
from: '"noreply@yourdomain.com" <noreply@yourdomain.com>',
to: email,
subject: subject,
text: url,
html: htmlToSend
};
const info = await transporter.sendMail(mailOptions);
console.log("Message sent: %s", info.messageId);
console.log("Preview URL: %s", "https://mailtrap.io/inboxes/test/messages/");
}
Run Code Online (Sandbox Code Playgroud)
小智 8
字符串替换不是一个好主意,因为您必须恢复旧字符串或创建一个备份文件才能再次更改它们,而且它不会是异步的,并且会导致各个方面的问题!您可以更轻松,更清洁地做到这一点:
只需转到您的邮件选项并使用您的变量添加上下文:
var mailOptions = {
from: 'nginx-iwnl@gmail.com',
to: 'username@gmail.com',
subject: 'Sending email',
template: 'yourTemplate',
context: { // <=
username: username,
whatever: variable
}
};
Run Code Online (Sandbox Code Playgroud)
接下来要做的是打开您的 html 文件并调用您的变量,例如:
{{用户名}}
在那里创建一个文件,emailTemplates.js
您可以将每个模板存储为一个函数
emailTemplate.js
const newsLetterEmail = (clientName) => `<p>Hi ${clientName}, here you have today news.</p>`
const welcomeEmail = (clientName, username) => `<p>Welcome ${clientName}, your username is ${username}.</p>`
export {newsLetterEmail, welcomeEmail}
Run Code Online (Sandbox Code Playgroud)
然后在控制器中调用任何 templateFunction 并存储在输出变量中
控制器.js
import {welcomeEmail} from './emailTeamplates.js'
const registerUser = async(req, res) => {
const {name, usename, email} = req.body
// User register code....
const output = welcomeEmail(name, username)
let mailOptions = {
from: '"Welcome" <welcome@welcome.com>',
to: 'client@gmail.com',
subject: 'Welcome email!',
text: 'Hello World',
html: output,
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 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'));
Run Code Online (Sandbox Code Playgroud)
他们还举了这个例子:
// 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',
});
Run Code Online (Sandbox Code Playgroud)
在这里您可以看到如何传递变量。
您将需要该email-templates
模块:https : //github.com/crocodilejs/node-email-templates和您选择的模板引擎。
同样在email-templates
您的文档中,您将找到如何制作文件结构以便可以找到您的模板:
html.{{ext}} (required) - 用于 html 格式的电子邮件
text.{{ext}} (optional) - 用于电子邮件样式的文本格式。
{{ext}}(可选)- html 格式主题的样式。
{{ext}}(可选) - 用于电子邮件主题
请参阅支持的模板引擎以获取可能的模板引擎扩展(例如 .ejs、.jade、.nunjucks)以用于上述 {{ext}} 的值。
您可以在任何文件名前加上您喜欢的任何内容,以帮助您在 IDE 中更轻松地识别文件。唯一的要求是文件名包含 html.、text.、style. 和主题。分别。
归档时间: |
|
查看次数: |
28644 次 |
最近记录: |