6

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
  };

2 Answers 2

8

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);
    });
});
Sign up to request clarification or add additional context in comments.

1 Comment

I really like your solution!
6

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.

1 Comment

how to provide data like user's name & other info

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.