Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send an html page as email in nodejs

I recently started programming my first node.js. I can't find any modules from node that is able to send html page as email. please help, thanks!

like image 453
user3044147 Avatar asked Feb 09 '14 01:02

user3044147


People also ask

Can we send mail as a HTML page?

HTML doesn't offer an option to create a form that sends an email after submission. However, you can use the form action element to set a mailto: address (in this case, your own), triggering the submitter's mail client to open. This is a last-ditch option if you can't create a PHP-based form.

Can we send HTML with Nodemailer module?

Set Nodemailer message optionsTo send a text formatted as HTML, no extra attributes are required, just put your HTML body into the message with an html attribute. For advanced templates, you can add attachments and embed images.


2 Answers

I have been using this module: https://github.com/andris9/Nodemailer

Updated example(using express and nodemailer) that includes getting index.jade template from the file system and sending it as an email:

var _jade = require('jade');
var fs = require('fs');

var nodemailer = require("nodemailer");

var FROM_ADDRESS = '[email protected]';
var TO_ADDRESS = '[email protected]';

// create reusable transport method (opens pool of SMTP connections)
var smtpTransport = nodemailer.createTransport("SMTP",{
    service: "Gmail",
    auth: {
        user: "[email protected]",
        pass: "PASSWORD"
    }
});

var sendMail = function(toAddress, subject, content, next){
  var mailOptions = {
    from: "SENDERS NAME <" + FROM_ADDRESS + ">",
    to: toAddress,
    replyTo: fromAddress,
    subject: subject,
    html: content
  };

  smtpTransport.sendMail(mailOptions, next);
}; 

exports.index = function(req, res){
  // res.render('index', { title: 'Express' });

  // specify jade template to load
  var template = process.cwd() + '/views/index.jade';

  // get template from file system
  fs.readFile(template, 'utf8', function(err, file){
    if(err){
      //handle errors
      console.log('ERROR!');
      return res.send('ERROR!');
    }
    else {
      //compile jade template into function
      var compiledTmpl = _jade.compile(file, {filename: template});
      // set context to be used in template
      var context = {title: 'Express'};
      // get html back as a string with the context applied;
      var html = compiledTmpl(context);

      sendMail(TO_ADDRESS, 'test', html, function(err, response){
        if(err){
          console.log('ERROR!');
          return res.send('ERROR');
        }
        res.send("Email sent!");
      });
    }
  });
};

I'd probably move the mailer part to its own module but I included everything here so you can see it all together.

like image 168
Ryan Avatar answered Oct 09 '22 22:10

Ryan


You can use nodemailer and nodemailer-express-handlebars modules do this:

var nodemailer = require('nodemailer');
var mailerhbs = require('nodemailer-express-handlebars');

var mailer = nodemailer.createTransport({
    service: Gmail,  // More at https://nodemailer.com/smtp/well-known/#supported-services
    auth: {
        user: [[email protected]], // Your email id
        pass: [PASSWORD] // Your password
    }
});

mailer.use('compile', mailerhbs({
    viewPath: 'templates/default/emails', //Path to email template folder
    extName: '.hbs' //extendtion of email template
}));

In router post you can use:

mailer.sendMail({
            from: 'Your name [email protected]',
            to: user.local.email,
            subject: 'Reset your password',
            template: 'password_reset', //Name email file template
            context: { // pass variables to template
                hostUrl: req.headers.host,
                customeName: user.info.firstname + ' ' + user.info.lastname,
                resetUrl: req.headers.host + '/users/recover/' + token,
                resetCode: token
            }
        }, function (err, response) {
            if (err) {
                res.send('Error send email, please contact administrator to best support.');
            }
            res.send('Email send successed to you email' + req.body.email + '.');
            done(err, 'done');
        });

In hbs template you can use variables:

{{var from context}}

hope blocks of code to help you.

like image 35
IT Vlogs Avatar answered Oct 09 '22 22:10

IT Vlogs