UNPKG

strapi-provider-email-multichannel

Version:

Strapi email provider for supporting multiple email channels

90 lines (89 loc) 5.09 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.init = init; const lodash_1 = __importDefault(require("lodash")); const axios_1 = __importDefault(require("axios")); const nodemailer_1 = __importDefault(require("nodemailer")); const emailFields = [ 'from', 'replyTo', 'to', 'cc', 'bcc', 'subject', 'text', 'html', 'attachments', ]; const brevoApiUrl = "https://api.brevo.com/v3"; function init(providerOptions, settings) { const debug = providerOptions.debug ? (...args) => { console.log('[' + new Date().toISOString() + ']', ...args); } : () => { }; return { send(options) { return __awaiter(this, void 0, void 0, function* () { var _a, _b, _c, _d; debug('Email sending options:', JSON.stringify(options, null, 2)); try { const { from, to, cc, bcc, replyTo, subject, text, html, channel } = options, rest = __rest(options, ["from", "to", "cc", "bcc", "replyTo", "subject", "text", "html", "channel"]); const channelName = channel || providerOptions.defaultChannel; const selectedChannel = providerOptions.channels[channelName]; let senderEmail = from || settings.defaultFrom; senderEmail = senderEmail.match(/<(.*?)>/g) ? ((_a = senderEmail.match(/<(.*?)>/g)) === null || _a === void 0 ? void 0 : _a.map((a) => a.replace(/<|>/g, ""))[0]) || '' : senderEmail; let senderName = from || settings.defaultFromName; senderName = senderName.match(/(.*?)</g) ? ((_b = senderName.match(/(.*?)</g)) === null || _b === void 0 ? void 0 : _b.map((a) => a.replace(/<|>/g, ""))[0]) || '' : senderName; debug(`From: ${from} | Sender email: ${senderEmail} | Sender name: ${senderName}`); if (selectedChannel.type === 'brevo') { const mail = Object.assign({ sender: { name: senderName || settings.defaultFromName, email: senderEmail, }, to: [{ email: to }], cc, bcc, replyTo: { email: replyTo || settings.defaultReplyTo }, subject, textContent: text, htmlContent: html }, rest); let send = yield axios_1.default.post(brevoApiUrl + "/smtp/email", mail, { headers: { "api-key": selectedChannel.options.apiKey }, }); debug('Email sending result:', (_c = send.data) === null || _c === void 0 ? void 0 : _c.messageId); return (_d = send.data) === null || _d === void 0 ? void 0 : _d.messageId; } else if (selectedChannel.type === 'smtp') { const transporter = nodemailer_1.default.createTransport(selectedChannel.options); const mail = Object.assign(Object.assign({}, lodash_1.default.pick(options, emailFields)), { from: `"${senderName || settings.defaultFromName}" ${senderEmail || settings.defaultFrom}`, replyTo: replyTo || settings.defaultReplyTo, text: text || options.html, html: html || options.text }); let send = yield transporter.sendMail(mail); debug('Email sending result:', send.messageId); return send.messageId; } else { throw new Error(`No supported channel type`); } } catch (e) { console.error(e); return false; } }); }, }; } ;