mhlavacka
mhlavacka

Reputation: 701

Sengrid template substitution tags not replaced when sending email in Meteor app

In Meteor application that incorporates Sendgrid transaction email templates for user invitations and notifications, I can't manage to replace substitution tags. Templated email is received, but without any difference.

Email.send({
    from: "[email protected]",
    to:email,
    subject: "Subject",
    sub: {
      "{name}":post.createdBy,
      "{title}":post.title,
    },
    headers: {
      "X-SMTPAPI": {
        "filters": {
          "templates": {
            "settings": {
              "enable": 1,
              "template_id": "xxxx"
            }
          }
        }
      },
      "Content-Type" : "text/html"
    }
});

I'm not using API directly, but rather Meteor Email package, but don't see that possible issue:

Meteor.startup(function () {
  process.env.MAIL_URL = 'smtp://username:[email protected]:587';
});

This is my shortened email template:

Hey {name},  

  your post {title} has a new comment.

Upvotes: 1

Views: 220

Answers (2)

mhlavacka
mhlavacka

Reputation: 701

What I ended up doing was using smtpapi-nodejs NPM package.

The simple example would be:

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

var header = new smtpapi();

header.setFilters({
    "templates": {
      "settings": {
        "enable": 1,
        "template_id": xxx-template-id-xxx
      }
    }
});

header.addSubstitution('-name-', post.createdBy);
header.addSubstitution(-title-', post.title);

var headers = { 'x-smtpapi': header.jsonString() };

// Use nodemailer to send the email 
var settings  = {
  host: "smtp.sendgrid.net",
  port: parseInt(587, 10),
  requiresAuth: true,
  auth: {
    user: "sendgrid_username",
    pass: "sendgrid_password"
  }
};
var smtpTransport = nodemailer.createTransport(settings);

var mailOptions = {
  from:     "Fred Foo <[email protected]>",
  to:       "[email protected]",
  subject:  "Hello",
  text:     "Hello world",
  html:     "<b>Hello world</b>",
  headers:  headers
}

smtpTransport.sendMail(mailOptions, function(error, response) {
  smtpTransport.close();

  if (error) {
    console.log(error);
  } else {
    console.log("Message sent: " + response.message);
  } 
});

Upvotes: 0

bwest
bwest

Reputation: 9814

You need to put the subs in the X-SMTPAPI header as well. The X-SMTPAPI header itself should also contain valid JSON in a string.

Try this:

var xsmtpapi = {
  "filters": {
    "templates": {
      "settings": {
        "enable": 1,
        "template_id": "xxxx"
      }
    }
  },
  "sub": {
    "{name}": post.createdBy,
    "{title}": post.title
  }
}

Email.send({
    from: "[email protected]",
    to:email,
    subject: "Subject",
    sub: {
      "{name}":post.createdBy,
      "{title}":post.title,
    },
    headers: {
      "X-SMTPAPI": JSON.stringify(xsmtpapi),
      "Content-Type" : "text/html"
    }
});

Upvotes: 1

Related Questions