2018-01-25 15:03:03 -06:00
|
|
|
/* eslint-disable no-console */
|
2017-03-24 10:35:19 +09:00
|
|
|
import VulcanEmail from '../namespace.js';
|
2016-05-20 09:59:01 +09:00
|
|
|
import Juice from 'juice';
|
|
|
|
import htmlToText from 'html-to-text';
|
|
|
|
import Handlebars from 'handlebars';
|
2018-05-10 09:22:24 +09:00
|
|
|
import { Utils, getSetting, registerSetting, runQuery, Strings } from 'meteor/vulcan:lib'; // import from vulcan:lib because vulcan:core is not loaded yet
|
2017-09-22 12:24:15 +02:00
|
|
|
|
|
|
|
registerSetting('secondaryColor', '#444444');
|
|
|
|
registerSetting('accentColor', '#DD3416');
|
|
|
|
registerSetting('title', 'My App');
|
|
|
|
registerSetting('tagline');
|
|
|
|
registerSetting('emailFooter');
|
|
|
|
registerSetting('logoUrl');
|
|
|
|
registerSetting('logoHeight');
|
|
|
|
registerSetting('logoWidth');
|
|
|
|
registerSetting('defaultEmail', 'noreply@example.com');
|
|
|
|
registerSetting('title', 'Vulcan');
|
|
|
|
registerSetting('enableDevelopmentEmails', false);
|
2016-05-20 09:59:01 +09:00
|
|
|
|
2017-03-24 10:35:19 +09:00
|
|
|
VulcanEmail.templates = {};
|
2015-12-14 12:43:45 +09:00
|
|
|
|
2017-03-24 10:35:19 +09:00
|
|
|
VulcanEmail.addTemplates = templates => {
|
|
|
|
_.extend(VulcanEmail.templates, templates);
|
2015-12-14 12:43:45 +09:00
|
|
|
};
|
|
|
|
|
2017-03-24 10:35:19 +09:00
|
|
|
VulcanEmail.getTemplate = templateName => Handlebars.compile(
|
2018-02-16 01:00:33 -05:00
|
|
|
VulcanEmail.templates[templateName],
|
2017-11-30 23:08:27 +09:00
|
|
|
{ noEscape: true, strict: true}
|
2017-02-16 10:04:00 +01:00
|
|
|
);
|
2015-08-03 15:42:28 +09:00
|
|
|
|
2018-06-11 10:53:39 +09:00
|
|
|
VulcanEmail.buildTemplate = (htmlContent, data = {}, locale) => {
|
2017-02-16 10:04:00 +01:00
|
|
|
const emailProperties = {
|
2016-12-12 15:00:56 +09:00
|
|
|
secondaryColor: getSetting('secondaryColor', '#444444'),
|
|
|
|
accentColor: getSetting('accentColor', '#DD3416'),
|
2017-03-24 10:35:19 +09:00
|
|
|
siteName: getSetting('title', 'My App'),
|
2016-12-12 15:00:56 +09:00
|
|
|
tagline: getSetting('tagline'),
|
2016-12-12 11:34:28 +09:00
|
|
|
siteUrl: Utils.getSiteUrl(),
|
2015-04-22 07:50:11 +09:00
|
|
|
body: htmlContent,
|
|
|
|
unsubscribe: '',
|
2016-12-12 11:34:28 +09:00
|
|
|
accountLink: Utils.getSiteUrl()+'account',
|
2016-12-12 15:00:56 +09:00
|
|
|
footer: getSetting('emailFooter'),
|
|
|
|
logoUrl: getSetting('logoUrl'),
|
|
|
|
logoHeight: getSetting('logoHeight'),
|
|
|
|
logoWidth: getSetting('logoWidth'),
|
2018-06-11 10:53:39 +09:00
|
|
|
...data,
|
|
|
|
__: Strings[locale],
|
2015-05-01 18:22:00 +02:00
|
|
|
};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2017-03-24 10:35:19 +09:00
|
|
|
const emailHTML = VulcanEmail.getTemplate("wrapper")(emailProperties);
|
2017-02-16 10:04:00 +01:00
|
|
|
const inlinedHTML = Juice(emailHTML, {preserveMediaQueries: true});
|
|
|
|
const doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
return doctype+inlinedHTML;
|
2015-05-01 18:22:00 +02:00
|
|
|
};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2017-08-28 22:27:07 +09:00
|
|
|
VulcanEmail.generateTextVersion = html => {
|
|
|
|
return htmlToText.fromString(html, {
|
|
|
|
wordwrap: 130
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2018-02-16 01:00:33 -05:00
|
|
|
VulcanEmail.send = (to, subject, html, text, throwErrors) => {
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
// TODO: limit who can send emails
|
|
|
|
// TODO: fix this error: Error: getaddrinfo ENOTFOUND
|
|
|
|
|
2017-02-16 10:04:00 +01:00
|
|
|
const from = getSetting('defaultEmail', 'noreply@example.com');
|
2017-05-23 09:44:22 +09:00
|
|
|
const siteName = getSetting('title', 'Vulcan');
|
2015-05-01 18:22:00 +02:00
|
|
|
subject = '['+siteName+'] '+subject;
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2015-05-01 18:22:00 +02:00
|
|
|
if (typeof text === 'undefined'){
|
2015-04-22 07:50:11 +09:00
|
|
|
// Auto-generate text version if it doesn't exist. Has bugs, but should be good enough.
|
2017-08-28 22:27:07 +09:00
|
|
|
text = VulcanEmail.generateTextVersion(html);
|
2015-04-22 07:50:11 +09:00
|
|
|
}
|
|
|
|
|
2017-02-16 10:04:00 +01:00
|
|
|
const email = {
|
2015-04-22 07:50:11 +09:00
|
|
|
from: from,
|
|
|
|
to: to,
|
|
|
|
subject: subject,
|
|
|
|
text: text,
|
|
|
|
html: html
|
2015-05-01 18:22:00 +02:00
|
|
|
};
|
2017-05-23 09:44:22 +09:00
|
|
|
|
|
|
|
if (process.env.NODE_ENV === 'production' || getSetting('enableDevelopmentEmails', false)) {
|
|
|
|
|
|
|
|
console.log('//////// sending email…'); // eslint-disable-line
|
|
|
|
console.log('from: '+from); // eslint-disable-line
|
|
|
|
console.log('to: '+to); // eslint-disable-line
|
|
|
|
console.log('subject: '+subject); // eslint-disable-line
|
|
|
|
// console.log('html: '+html);
|
|
|
|
// console.log('text: '+text);
|
|
|
|
|
|
|
|
try {
|
|
|
|
Email.send(email);
|
|
|
|
} catch (error) {
|
|
|
|
console.log("// error while sending email:"); // eslint-disable-line
|
|
|
|
console.log(error); // eslint-disable-line
|
2018-02-16 01:00:33 -05:00
|
|
|
if (throwErrors) throw error;
|
2017-05-23 09:44:22 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
console.log('//////// sending email (simulation)…'); // eslint-disable-line
|
|
|
|
console.log('from: '+from); // eslint-disable-line
|
|
|
|
console.log('to: '+to); // eslint-disable-line
|
|
|
|
console.log('subject: '+subject); // eslint-disable-line
|
|
|
|
console.log('Note: emails turned off in development mode. Set "enableDevelopmentEmails" setting to "true" to enable.');
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2016-08-26 10:16:01 +09:00
|
|
|
}
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
return email;
|
2016-08-26 10:16:01 +09:00
|
|
|
|
2015-04-22 07:50:11 +09:00
|
|
|
};
|
|
|
|
|
2018-05-10 09:22:24 +09:00
|
|
|
VulcanEmail.build = async ({ emailName, variables, locale }) => {
|
2017-08-20 17:15:40 +09:00
|
|
|
// execute email's GraphQL query
|
2017-08-24 13:16:50 +09:00
|
|
|
const email = VulcanEmail.emails[emailName];
|
2018-05-10 09:22:24 +09:00
|
|
|
const result = email.query ? await runQuery(email.query, variables, { locale }) : {data: {}};
|
2017-08-20 17:15:40 +09:00
|
|
|
|
|
|
|
// if email has a data() function, merge its return value with results from the query
|
2017-08-28 22:27:07 +09:00
|
|
|
const data = email.data ? {...result.data, ...email.data(variables)} : result.data;
|
|
|
|
|
|
|
|
const subject = typeof email.subject === 'function' ? email.subject(data) : email.subject;
|
2018-05-10 09:22:24 +09:00
|
|
|
|
2018-06-11 10:53:39 +09:00
|
|
|
data.__ = Strings[locale];
|
2018-05-10 09:22:24 +09:00
|
|
|
|
|
|
|
const html = VulcanEmail.buildTemplate(VulcanEmail.getTemplate(email.template)(data), data, locale);
|
2017-08-28 22:27:07 +09:00
|
|
|
|
|
|
|
return { data, subject, html };
|
|
|
|
}
|
|
|
|
|
2018-05-10 09:22:24 +09:00
|
|
|
VulcanEmail.buildAndSend = async ({ to, emailName, variables, locale = getSetting('locale') }) => {
|
2017-08-19 16:13:59 +09:00
|
|
|
|
2018-05-10 09:22:24 +09:00
|
|
|
const email = await VulcanEmail.build({ to, emailName, variables, locale });
|
2017-08-28 22:27:07 +09:00
|
|
|
return VulcanEmail.send(to, email.subject, email.html);
|
2017-08-19 16:13:59 +09:00
|
|
|
|
2015-05-01 18:22:00 +02:00
|
|
|
};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2017-03-24 10:35:19 +09:00
|
|
|
VulcanEmail.buildAndSendHTML = (to, subject, html) => VulcanEmail.send(
|
2017-02-16 10:04:00 +01:00
|
|
|
to,
|
|
|
|
subject,
|
2017-03-24 10:35:19 +09:00
|
|
|
VulcanEmail.buildTemplate(html)
|
2017-02-16 10:04:00 +01:00
|
|
|
);
|