UNPKG

parse-server-mailgun-adapter-template

Version:

Used to send Parse Server password reset and email verification emails though Mailgun

194 lines (179 loc) 6.06 kB
var Mailgun = require('mailgun-js'); var mailcomposer = require('mailcomposer'); var SimpleMailgunAdapter = mailgunOptions => { if (!mailgunOptions || !mailgunOptions.apiKey || !mailgunOptions.domain || !mailgunOptions.fromAddress) { throw 'SimpleMailgunAdapter requires an API Key, domain, and fromAddress.'; } mailgunOptions.verificationSubject = mailgunOptions.verificationSubject || 'Please verify your e-mail for %appname%'; mailgunOptions.verificationBody = mailgunOptions.verificationBody || 'Hi,\n\nYou are being asked to confirm the e-mail address %email% ' + 'with %appname%\n\nClick here to confirm it:\n%link%'; mailgunOptions.passwordResetSubject = mailgunOptions.passwordResetSubject || 'Password Reset Request for %appname%'; mailgunOptions.passwordResetBody = mailgunOptions.passwordResetBody || 'Hi,\n\nYou requested a password reset for %appname%.\n\nClick here ' + 'to reset it:\n%link%'; var mailgun = Mailgun(mailgunOptions); function escapeRegExp(str) { return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); } function replaceAll(str, find, replace) { return str.replace(new RegExp(escapeRegExp(find), 'g'), replace); } function fillVariables(text, options) { text = replaceAll(text, "%username%", options.user.get("username")); text = replaceAll(text, "%email%", options.user.get("email")); text = replaceAll(text, "%appname%", options.appName); text = replaceAll(text, "%link%", options.link); return text; } function getRecipient(user) { return user.get("email") || user.get('username') } var sendVerificationEmail = options => { if(mailgunOptions.verificationBodyHTML){ var mail = mailcomposer({ from: {name: options.appName, address: mailgunOptions.fromAddress}, to: getRecipient(options.user), subject: fillVariables(mailgunOptions.verificationSubject, options), text: fillVariables(mailgunOptions.verificationBody, options), html: fillVariables(mailgunOptions.verificationBodyHTML, options) }); return new Promise((resolve, reject) => { mail.build((mailBuildError, message) => { if(mailBuildError){ return reject(mailBuildError); } var dataToSend = { to: getRecipient(options.user), message: message.toString('ascii') }; mailgun.messages().sendMime(dataToSend, (err, body) => { if (err) { return reject(err); } resolve(body); }); }).catch(err => { reject(err); }); }); }else{ var data = { from: mailgunOptions.fromAddress, to: getRecipient(options.user), subject: fillVariables(mailgunOptions.verificationSubject, options), text: fillVariables(mailgunOptions.verificationBody, options) } return new Promise((resolve, reject) => { mailgun.messages().send(data, (err, body) => { if (err) { reject(err);return; } resolve(body); }); }); } } var sendPasswordResetEmail = options => { if(mailgunOptions.passwordResetBodyHTML){ var mail = mailcomposer({ from: {name: options.appName, address: mailgunOptions.fromAddress}, to: getRecipient(options.user), subject: fillVariables(mailgunOptions.passwordResetSubject, options), text: fillVariables(mailgunOptions.passwordResetBody, options), html: fillVariables(mailgunOptions.passwordResetBodyHTML, options) }); return new Promise((resolve, reject) => { mail.build((mailBuildError, message) => { if(mailBuildError){ return reject(mailBuildError); } var dataToSend = { to: getRecipient(options.user), message: message.toString('ascii') }; mailgun.messages().sendMime(dataToSend, (err, body) => { if (err) { return reject(err); } resolve(body); }); }).catch(err => { reject(err); }); }); }else{ var data = { from: mailgunOptions.fromAddress, to: getRecipient(options.user), subject: fillVariables(mailgunOptions.passwordResetSubject, options), text: fillVariables(mailgunOptions.passwordResetBody, options) } return new Promise((resolve, reject) => { mailgun.messages().send(data, (err, body) => { if (err) { reject(err);return; } resolve(body); }); }); } } var sendMail = mail => { if(mail.html){ var mailC = mailcomposer({ from: mailgunOptions.fromAddress, to: mail.to, subject: mail.subject, text: mail.text, html: mail.html }); return new Promise((resolve, reject) => { mailC.build((mailBuildError, message) => { if(mailBuildError){ return reject(mailBuildError); } var dataToSend = { to: mail.to, message: message.toString('ascii') }; mailgun.messages().sendMime(dataToSend, (err, body) => { if (err) { return reject(err); } resolve(body); }); }).catch(err => { reject(err); }); }); }else{ var data = { from: mailgunOptions.fromAddress, to: mail.to, subject: mail.subject, text: mail.text } return new Promise((resolve, reject) => { mailgun.messages().send(data, (err, body) => { if (err) { reject(err);return; } resolve(body); }); }); } } return Object.freeze({ sendVerificationEmail: sendVerificationEmail, sendPasswordResetEmail: sendPasswordResetEmail, sendMail: sendMail }); } module.exports = SimpleMailgunAdapter