98 lines
3.0 KiB
JavaScript
98 lines
3.0 KiB
JavaScript
|
/* eslint-disable no-case-declarations */
|
||
|
|
||
|
const errors = require('@tryghost/errors');
|
||
|
const nodemailer = require('nodemailer');
|
||
|
const tpl = require('@tryghost/tpl');
|
||
|
|
||
|
const messages = {
|
||
|
unknownTransport: `Unknown mail transport: {transport}`
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @param {String} transport
|
||
|
* @param {Object} options
|
||
|
* @returns {import('nodemailer').Transporter} Nodemailer Transporter
|
||
|
*/
|
||
|
module.exports = function (transport, options = {}) {
|
||
|
let transportOptions;
|
||
|
|
||
|
transport = transport.toLowerCase();
|
||
|
|
||
|
switch (transport) {
|
||
|
case 'smtp':
|
||
|
transportOptions = options;
|
||
|
|
||
|
/**
|
||
|
* @deprecated `secureConnection` was removed in Nodemailer 1.0.2
|
||
|
* in favor of `secure` but Ghost has been recommending `secureConnection`
|
||
|
* and it's difficult to get everyone to switch at this point
|
||
|
*
|
||
|
* Therefore, we have to alias it here to keep things working
|
||
|
*/
|
||
|
if (Object.prototype.hasOwnProperty.call(options, 'secureConnection')) {
|
||
|
transportOptions.secure = options.secureConnection;
|
||
|
}
|
||
|
|
||
|
if (options.service && options.service.toLowerCase() === 'sendmail') {
|
||
|
transportOptions.sendmail = true;
|
||
|
}
|
||
|
break;
|
||
|
case 'mailgun':
|
||
|
const mailgunTransport = require('nodemailer-mailgun-transport');
|
||
|
|
||
|
// Default to 60s timeout if not set in `options`
|
||
|
if (!Object.prototype.hasOwnProperty.call(options, 'timeout')) {
|
||
|
options.timeout = 60000;
|
||
|
}
|
||
|
|
||
|
transportOptions = mailgunTransport(options);
|
||
|
break;
|
||
|
case 'sendmail':
|
||
|
transportOptions = options;
|
||
|
transportOptions.sendmail = true;
|
||
|
break;
|
||
|
case 'ses':
|
||
|
const aws = require('@aws-sdk/client-ses');
|
||
|
|
||
|
const pattern = /(.*)email(.*)\.(.*).amazonaws.com/i;
|
||
|
const result = pattern.exec(options.ServiceUrl);
|
||
|
const region = options.region || (result && result[3]) || 'us-east-1';
|
||
|
|
||
|
const accessKeyId = options.accessKeyId || options.AWSAccessKeyID;
|
||
|
const secretAccessKey = options.secretAccessKey || options.AWSSecretKey;
|
||
|
const credentials = (accessKeyId && secretAccessKey) ? {accessKeyId, secretAccessKey} : undefined;
|
||
|
|
||
|
const ses = new aws.SES({
|
||
|
apiVersion: '2010-12-01',
|
||
|
region,
|
||
|
credentials
|
||
|
});
|
||
|
|
||
|
transportOptions = {
|
||
|
SES: {ses, aws}
|
||
|
};
|
||
|
|
||
|
break;
|
||
|
case 'direct':
|
||
|
const directTransport = require('nodemailer-direct-transport');
|
||
|
transportOptions = directTransport(options);
|
||
|
break;
|
||
|
case 'stub':
|
||
|
const stubTransport = require('nodemailer-stub-transport');
|
||
|
transportOptions = stubTransport(options);
|
||
|
break;
|
||
|
default:
|
||
|
throw new errors.EmailError({
|
||
|
message: tpl(messages.unknownTransport, {transport})
|
||
|
});
|
||
|
}
|
||
|
|
||
|
const transporter = nodemailer.createTransport(transportOptions);
|
||
|
|
||
|
if (transport === 'smtp') {
|
||
|
Object.assign(transporter.transporter.options, options);
|
||
|
}
|
||
|
|
||
|
return transporter;
|
||
|
};
|