我正在使用 Nodemailer 使用以下 nodemailer-express-handlebars 插件发送电子邮件。我用这篇{死博客文章}作为参考
代码正在编译
welcome
模板,但未使用 layout
我的代码如下:
var nodemailer = require('nodemailer');
var mg = require('nodemailer-mailgun-transport');
var hbs = require('nodemailer-express-handlebars');
var config = {auth: {api_key: "key-xxx",domain: "mydomain.com}}
var nodemailerTransport = nodemailer.createTransport(mg(config));
var options = {
viewEngine: {
extname: '.handlebars',
layoutsDir: 'views/email/',
defaultLayout : 'layout',
},
viewPath: 'views/email/'
}
nodemailerTransport.use('compile', hbs(options));
nodemailerTransport.sendMail({
from: '[email protected]',
to: '[email protected]',
subject: 'Welcome to the XXX',
template: 'welcome'
}, function (err, results) {
if (err) console.log('Error: ' + err);
else console.log('Response: ' + results);
});
我的
layout.handlebars
有以下代码
<html>
<body>
{{> _header }}
{{{body}}}
{{> _footer }}
</body>
</html>
您缺少
partialsDir
选项。
我已经使用以下选项进行了测试,效果很好:
var options = {
extName:'.hbs', /* or '.handlebars' */
viewPath:__dirname+'/views/email/',
layoutsDir:__dirname+'/view/email',
defaultLayout:'template',
partialsDir:__dirname+'/views/email/partials/'
}
使用我的目录结构:
views
email
的文件夹(此处存储“template.hbs”)partials
文件夹(此处作为示例存储“header.hbs”)从 'handlebars' 导入 * 作为车把;
从“nodemailer”导入*作为nodemailer;
从 'fs' 导入 * 作为 fs;
async sendEmail(to: string, subject: string, text: string) {
const templateFile = fs.readFileSync('enter the path of your template(emailTempalate.hbs) ', 'utf-8');
// Compile the Handlebars template
const template = handlebars.compile(templateFile);
// Render the template with the provided context/data
const html = template({ username: 'John Doe' });
const mailOptions = {
from: '[email protected]',
to,
subject,
text,
html,
};
try {
await this.transporter.sendMail(mailOptions);
return { msg: 'Email sent successfully' };
} catch (error) {
console.error('Error sending email:', error);
throw new Error('Failed to send email');
}
}