@meanie/mail-composer
A utility to help you compose emails using the Handlebars templating engine, compatible with the @sendgrid/mail library.
Installation
You can install this package using yarn
or npm
.
#yarn
yarn add @meanie/mail-composer
#npm
npm install @meanie/mail-composer --save
Dependencies
This package has a peer dependency of handlebars, which is assumed to be configured (e.g. custom plugins) by your application.
Basic usage
Prepare main template (e.g. template.hbs
):
<html>
<body>
<h1>{{app.title}}</h1>
{{partial}}
</body>
</html>
Prepare a partial (e.g. hello.hbs
):
<p>Hello {{user.firstName}}!</p>
Configure the composer:
const composer = require('@meanie/mail-composer');
composer.config({
templateHtml: '/path/to/template.hbs',
templateText: '/path/to/template.txt',
});
Then use it to compose an email message and send it with a compatible mailer, for example @sendgrid/mail:
const sgMail = require('@sendgrid/mail');
const mail = {
to: user.email,
from: 'Someone <no-reply@example.org>',
subject: 'Hello {{user.firstName}}',
html: '/path/to/hello.hbs',
text: '/path/to/hello.txt',
};
const data = {app, user};
composer
.compose(mail, data)
.then(email => sgMail.send(email));
Advanced usage
For more advanced cases where you need to manage locals for your templates, it is recommended to write a wrapper service around the composer, e.g.:
'use strict';
const moment = require('moment');
const composer = require('@meanie/mail-composer');
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey('YOUR_SENDGRID_API_KEY');
composer.config({
templateHtml: '/path/to/template.hbs',
templateText: '/path/to/template.txt',
});
function createLocals(context) {
const {title, version} = context.app.locals;
return {
now: moment(),
user: context.user,
app: {title, version},
};
}
module.exports = {
create(type, context, ...args) {
const generator = require('/path/to/emails/' + type);
const locals = createLocals(context);
const mail = generator(...args);
const data = Object.assign(mail.data || {}, locals);
return composer.compose(mail, data);
},
send(emails) {
return sgMail
.sendMultiple(emails);
},
};
Next, create a mail generator file (hello.js
):
const path = require('path');
module.exports = function(user) {
const html = path.join(__dirname, 'hello.hbs');
const text = path.join(__dirname, 'hello.txt');
const to = user.email;
const subject = 'Hi {{user.firstName}}!';
const data = {user};
return {to, subject, data, html, text};
};
And use the mailer service to easily send out specific emails in a given context:
User
.findOne({...})
.then(user => mailer.create('hello', req, user))
.then(email => email.send());
For working examples, see the Meanie Express Seed project.
Randomization of HTML content
A helper is included to append a random string to HTML email contents to prevent GMail
from breaking up your emails by quoting and hiding parts of repeating content. This works
by including a hidden span with random characters for each email before the ending of certain tags, e.g. </p>
.
Manual usage:
let html = '<p>Copyright 2017 My Company</p>';
html = composer.randomize(html, '</p>');
console.log(html);
Automatic usage via config:
composer.config({
templateHtml: '/path/to/template.hbs',
templateText: '/path/to/template.txt',
autoRandomize: true,
randomizeTags: 'p',
});
Issues & feature requests
Please report any bugs, issues, suggestions and feature requests in the @meanie/mail-composer issue tracker.
Contributing
Pull requests are welcome! If you would like to contribute to Meanie, please check out the Meanie contributing guidelines.
Credits
License
(MIT License)
Copyright 2016-2017, Adam Reis