Kunal Shukla
Kunal Shukla

Reputation: 81

How do I send a html file using nodemailer

I am sending emails using nodemailer, but I wanna know how to send a static HTML file from a directory.

  let transporter = nodemailer.createTransport({
      host: auth.host,
      port: auth.port,
      secure: auth.secure,
      auth: {
          type: auth.type,
          user: auth.user,
          clientId: auth.clientId,
          clientSecret: auth.clientSecret,
          refreshToken: auth.refreshToken,
          accessToken: auth.accessToken,
          expires: auth.expires
      }
  });

  let mailOptions = {
    from: '"xxxxx',
    to: 'xxxx',
    subject: "xxxx",
    text: `xxxx`,
    html: email.html
  };

Upvotes: 6

Views: 13853

Answers (2)

JejeDev
JejeDev

Reputation: 528

You could use fs to read your template file, and handlebars to replace your values in the template.

Here an example :

const nodemailer = require('nodemailer');
const smtpTransport = require('nodemailer-smtp-transport');
const handlebars = require('handlebars');
const { promisify } = require('util');
const fs = require('fs');

const readFile = promisify(fs.readFile);

smtpTransport = nodemailer.createTransport(smtpTransport({
  host: mailConfig.host,
  secure: mailConfig.secure,
  port: mailConfig.port,
  auth: {
    user: mailConfig.auth.user,
    pass: mailConfig.auth.pass
  }
}));

const sendMail = async () => {
    let html = await readFile('/path/to/file', 'utf8');
    let template = handlebars.compile(html);
    let data = {
        username: "Toto"
    };
    let htmlToSend = template(data);
    let mailOptions = {
        from: '[email protected]',
        to : '[email protected]',
        subject : 'test',
        html : htmlToSend
    };
    smtpTransport.sendMail(mailOptions, (error, info) => {
        if (error) console.log(error);
    });
});

Upvotes: 8

Marcos Casagrande
Marcos Casagrande

Reputation: 40394

You will have to read the file using the fs module.

const fs = require('fs');

const { promisify } = require('util');

const readFile = promisify(fs.readFile);

async function sendMail() {
    let transporter = nodemailer.createTransport({
      host: auth.host,
      port: auth.port,
      secure: auth.secure,
      auth: {
          type: auth.type,
          user: auth.user,
          clientId: auth.clientId,
          clientSecret: auth.clientSecret,
          refreshToken: auth.refreshToken,
          accessToken: auth.accessToken,
          expires: auth.expires
      }
  });

  let mailOptions = {
    from: '"xxxxx',
    to: 'xxxx',
    subject: "xxxx",
    text: `xxxx`,
    html: await readFile('/path/to/file', 'utf8')
  };

  // send mail
}

If the file won't change, you can cache the content.

Upvotes: 6

Related Questions