отправка html-страницы внутри электронной почты nodemailer node.js

Я хочу отправить форму оплаты в электронном письме, используя node.js nodemailer.

мои электронные письма успешно отправлены, но когда я добавляю созданный мной HTML-файл, в электронном письме появляются ошибки.

const fs = require("fs");
const { promisify } = require("util");
const readFile = promisify(fs.readFile);

let transporter = nodemailer.createTransport({
  service: "gmail",
  auth: {
    user: "mymail",
    pass: "mypass",
  },
});

let mailOptions = {
          from: "[email protected]",
          to: invoice.customeremail,
          subject: "Payment forServices",
          text: "Please pay to Recieve the order ",
          html: readFile("C://Users//admin//task//payment.html", "utf8"),
        };

        transporter.sendMail(mailOptions, function (err, data) {
          if (err) {
            console.log("error", err);
          } else {
            console.log("email sent!");
          }
        });

я хочу, чтобы html-файл отображался в моем электронном письме ... есть ли способ сделать это?


person jayzee    schedule 20.09.2020    source источник
comment
Вы превратили fs.readFile в обещание, поэтому значение html в mailOptions является ожидающим обещанием, которое не является допустимой строкой. Просто используйте вместо этого метод fs.readFileSync или вызовите await readFile, который выдаст ошибку, потому что его нет в функции async.   -  person Milo    schedule 20.09.2020
comment
я получаю эту ошибку @Milo   -  person jayzee    schedule 20.09.2020
comment
@jayzee Оберните свои mailoptions и sendMail() в fs.readFile(), это решит вашу проблему.   -  person Mohammad Basit    schedule 20.09.2020
comment
я не совсем понял   -  person jayzee    schedule 20.09.2020


Ответы (2)


По моему мнению, правильный способ отправки html разметки с помощью почтовой программы узла может быть достигнут путем обертывания ваших mailOptions и transporter.sendMail() функций в fs.readFile() следующим образом:

Сначала мы правильно прочитаем html файл с помощью fs, и когда у нас будет файл в функции обратного вызова в переменной html, мы можем отправить его по электронной почте.

var nodemailer = require('nodemailer');
var fs = require('fs');

var transporter = nodemailer.createTransport({
 service: 'gmail',
 auth: {
   user: '[email protected]',
   pass: 'yourpassword'
 }
});

fs.readFile('Path here', {encoding: 'utf-8'}, function (err, html) {
 if (err) {
   console.log(err);
 } else {
   let mailOptions = {
     from: '[email protected]',
     to: '[email protected]',
     subject: 'Sending Html in node mailer',
     html: html
   };

   transporter.sendMail(mailOptions, function(error, info) {
    if (error) {
     console.log(error);
    } else {
     console.log('Email has been sent: ' + info.response);
    }
  });
 }
});
person Mohammad Basit    schedule 20.09.2020
comment
я попробую это - person jayzee; 20.09.2020
comment
@jayzee попробуйте и дайте мне знать в комментариях. - person Mohammad Basit; 20.09.2020
comment
я не могу заставить его работать ... иди, почему ты можешь мне помочь по скайпу или это невозможно? - person jayzee; 20.09.2020
comment
вы получаете какую-нибудь ошибку? Я добавил полный файл в код. Теперь просто измените учетные данные и попробуйте! - person Mohammad Basit; 20.09.2020
comment
и заменить html на путь? - person jayzee; 20.09.2020
comment
Вы видите здесь fs.readFile('path here') путь замены на путь к вашему html файлу. это оно - person Mohammad Basit; 20.09.2020
comment
Позвольте нам продолжить это обсуждение в чате. - person jayzee; 20.09.2020

Я внес некоторые изменения в ответ Мохаммада Басита, чтобы позволить мне передать измененную ссылку в электронное письмо.

В одной строке моего html-файла я создал ссылку, которая выглядит так:

<a href="mySite.herokuapp.com/resetPassword/#replaceWithLink#">Reset Password</a>

Затем я использовал метод JavaScript String replace (), чтобы заменить текст #replaceWithLink# тем, что я хочу после того, как файл будет загружен с помощью fs.readFile.

Вот фрагмент моего файла узла app.js:

//Sends password reset email
const sendPassResetEmail = function(emailAddress){
  //email host information
  const transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth:{
      user: process.env.gmailUsr,
      pass: process.env.gmailPass
    }
  });

  fs.readFile('./emails/passwordReset.html', {encoding: 'utf-8'}, (err, data)=>{
    let htmlFile = data;
    htmlFile = htmlFile.replace("#replaceWithLink#", "myOtherLinkTest")

    if(err){
      console.warn("Error getting password reset template: " + err);
    }else{
      transporter.sendMail({
        from:'"TedCounter :)"<EMAIL-ADDRESS-HERE>',
        to: emailAddress,
        subject:"Ted Counter",
        html: htmlFile
      });
    }
  });
}

В результате #replaceWithLink# заменяется на myOtherLinkTest в электронном письме.

person Trent Deckard    schedule 08.11.2020