如何使用handbars与nodemailer一起发送电子邮件?

问题描述 投票:0回答:2

我正在使用 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>
handlebars.js nodemailer express-handlebars
2个回答
2
投票

您缺少

partialsDir
选项。

我已经使用以下选项进行了测试,效果很好:

 var options = {
   extName:'.hbs', /* or '.handlebars' */
   viewPath:__dirname+'/views/email/',
   layoutsDir:__dirname+'/view/email',
   defaultLayout:'template',
   partialsDir:__dirname+'/views/email/partials/'
 }

使用我的目录结构:

  1. 脚本所在的文件夹:
    views
  2. 在其中放置一个名为
    email
    的文件夹(此处存储“template.hbs”)
  3. 在电子邮件文件夹内创建一个
    partials
    文件夹(此处作为示例存储“header.hbs”)

0
投票

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

}

© www.soinside.com 2019 - 2024. All rights reserved.