Использование nodemailer с дескрипторами для динамических электронных писем

#javascript #node.js #express #handlebars.js #nodemailer

#javascript #node.js #экспресс #handlebars.js #nodemailer

Вопрос:

У меня возникла проблема, и я не могу понять, что именно я делаю неправильно. Когда я запускаю свой код, я получаю эту ошибку:

[Error: ENOENT: no such file or directory, open 'C:UsersAlexDesktopemailtestmain.handlebars'] { errno: -4058, code: 'ENOENT', syscall: 'open', path: 'C:\Users\Alex\Desktop\emailtest\main.handlebars' }

Вот мой код:

 const nodemailer = require("nodemailer");
const hbs = require("nodemailer-express-handlebars");
const express = require("express");
const app = express();
const port = 3000;

const transporter = nodemailer.createTransport({
  service: "gmail",
  auth: {
    user: "useremail",
    pass: "userpassword",
  },
  //   tls: {
  //     rejectUnauthorized: false,
  //   },
});

transporter.use(
  "compile",
  hbs({
    viewEngine: "express-handlebars",
    viewPath: "views",
  })
);

const mailOptions = {
  from: "myemailhere",
  to: "receiverpassword",
  subject: "Automated Email",
  template: "index",
};

transporter.sendMail(mailOptions, function (error, info) {
  if (error) {
    console.log(error);
  } else {
    console.log("Email sent: "   info.response);
  }
});

app.listen(port, () => {
  console.log(
    `Listening at http://localhost:${port}`
  );
});
  

Структура папок:

 server.js
views
    -index.handlebars
  

Без использования Handlebars я могу отправлять электронные письма просто отлично, но поскольку мне нужен способ динамического заполнения HTML, я думаю, что Handlebars был бы лучшим вариантом, если бы я мог просто заставить его работать. Любая информация была бы отличной, заранее спасибо!

Комментарии:

1. Попробуйте передать полный путь? Просто мысль.

2. @AbrahamLabkovsky К сожалению, я уже пробовал это, спасибо

3. Кроме того, viewEngine это не строка. Это либо экземпляр express-handlebars, либо объект options. Вы также можете определить свой каталог макетов там. Не уверен, что именно заставляет его использовать местоположение по умолчанию, но я бы порылся там

Ответ №1:

 const path = require('path');

const handlebarOptions = {
    viewEngine: {
        extName: ".handlebars",
        partialsDir: path.resolve(__dirname, "views"),
        defaultLayout: false,
    },
    viewPath: path.resolve(__dirname, "views"),
    extName: ".handlebars",
};

trasnporter.use('compile', hbs(handlebarOptions));