[feature] Mail service fixes pt.1

This commit is contained in:
Georgii Petrov
2024-04-10 10:15:31 +03:00
parent 39013c978b
commit 418b77e82c
3 changed files with 53 additions and 35 deletions

View File

@ -19,13 +19,6 @@
"mail": {
"transportList": {
"smtp": {
"host": "smtp_host",
"port": 587,
"auth": {
"type": "login",
"user": "smtp_login",
"pass": "smtp_password"
},
"connection": {
"socketTimeout": "2m",
"connectionTimeout": "2m",
@ -33,7 +26,7 @@
"dnsTimeout": "30s"
},
"pool": {
"maxConnections": 5,
"maxConnections": 10,
"maxMessages": 100
}
},

View File

@ -94,15 +94,12 @@ function createSMTPTransporter(ctx, host, port, auth, messageCommonParameters =
const transport = Object.assign({}, server, getSMTPSettings());
const mailDefaults = Object.assign({}, cfgMessageDefaults, messageCommonParameters);
let transporter;
try {
transporter = nodemailer.createTransport(transport, mailDefaults);
smtpTransporters.set(host, transporter);
const transporter = nodemailer.createTransport(transport, mailDefaults);
smtpTransporters.set(`${host}:${auth.user}`, transporter);
} catch (error) {
ctx.logger.error('Mail service smtp transporter creation error: %o\nWith parameters: \n\thost - %s, \n\tport - %d, \n\tauth = %o', error.stack, host, port, auth);
}
return transporter;
}
function createSendmailTransporter(ctx, messageCommonParameters = {}) {
@ -113,32 +110,30 @@ function createSendmailTransporter(ctx, messageCommonParameters = {}) {
} catch (error) {
ctx.logger.error('Mail service sendmail transporter creation error: %o', error.stack);
}
return sendMailTransporter;
}
}
function getSMTPTransporter(ctx, host) {
const transporter = smtpTransporters.get(host);
async function sendSMTP(ctx, host, userLogin, mailObject) {
const transporter = smtpTransporters.get(`${host}:${userLogin}`);
if (!transporter) {
ctx.logger.error(`MailService getSMTPTransporter(): no transporter exists for host "${host}"`);
ctx.logger.error(`MailService getSMTPTransporter(): no transporter exists for host "${host}" and user "${userLogin}"`);
return;
}
return transporter;
return transporter.sendMail(mailObject);
}
function getSendmailTransporter(ctx) {
async function sendSendmail(ctx, mailObject) {
if (!sendMailTransporter) {
ctx.logger.error(`MailService getSendmailTransporter(): no sendmail transporter exists`);
return;
}
return sendMailTransporter;
return sendMailTransporter.sendMail(mailObject);
}
function deleteSMTPTransporter(host) {
smtpTransporters.delete(host);
function deleteSMTPTransporter(host, userLogin) {
smtpTransporters.delete(`${host}:${userLogin}`);
}
function transportersRelease() {
@ -150,8 +145,8 @@ function transportersRelease() {
module.exports = {
createSMTPTransporter,
createSendmailTransporter,
getSMTPTransporter,
getSendmailTransporter,
sendSMTP,
sendSendmail,
deleteSMTPTransporter,
transportersRelease
};

View File

@ -1,12 +1,11 @@
const { describe, test, expect, afterAll} = require('@jest/globals');
const config = require('../../Common/node_modules/config');
const mailService = require('../../Common/sources/mailService');
const operationContext = require('../../Common/sources/operationContext');
const fs = require('fs');
const ctx = new operationContext.Context();
const bulkTestTimeout = 1000 * 10;
const largeMailContentTestTimeout = 1000 * 7;
const bulkTestTimeout = 1000 * 16;
const largeMailContentTestTimeout = 1000 * 15;
const testFolder = '../tests/unit'
const defaultTestSMTPServer = {
host: 'smtp.ethereal.email',
@ -23,13 +22,13 @@ const expectedEnvelope = { from: 'some.mail@server.com', to: ['madie.wiegand79@e
afterAll(function () {
mailService.transportersRelease();
})
describe('Mail service', function () {
describe('SMTP', function () {
const { host, port, auth } = defaultTestSMTPServer;
const transporter = mailService.createSMTPTransporter(
mailService.createSMTPTransporter(
ctx,
host,
port,
@ -38,14 +37,14 @@ describe('Mail service', function () {
);
test('Simple mail', async function () {
const mailData = await transporter.sendMail({ text: 'simple test text', subject: 'simple mail test' });
const mailData = await mailService.sendSMTP(ctx, host, auth.user, { text: 'simple test text', subject: 'simple mail test' });
expect(mailData.envelope).toEqual(expectedEnvelope);
});
test('Bulk mails', async function () {
const promises = [];
for (let i = 1; i <= 100; i++) {
promises.push(transporter.sendMail({ text: `bulk test text #${i}`, subject: 'bulk mails test' }));
promises.push(mailService.sendSMTP(ctx, host, auth.user, { text: `bulk test text #${i}`, subject: 'bulk mails test' }));
}
const result = await Promise.all(promises);
@ -54,13 +53,13 @@ describe('Mail service', function () {
test('Large mail content', async function () {
const readStream = fs.createReadStream(`${testFolder}/resources/16MiBFile.txt`);
const mailData = await transporter.sendMail({ text: readStream, subject: 'large mail test' });
const mailData = await mailService.sendSMTP(ctx, host, auth.user, { text: readStream, subject: 'large mail test' });
expect(mailData.envelope).toEqual(expectedEnvelope);
}, largeMailContentTestTimeout);
test('HTML mail content', async function () {
const readStream = fs.createReadStream(`${testFolder}/resources/htmlContent.html`);
const mailData = await transporter.sendMail({ html: readStream, subject: 'html mail test' });
const mailData = await mailService.sendSMTP(ctx, host, auth.user, { html: readStream, subject: 'html mail test' });
expect(mailData.envelope).toEqual(expectedEnvelope);
});
@ -81,8 +80,39 @@ describe('Mail service', function () {
}
]
};
const mailData = await transporter.sendMail(message);
const mailData = await mailService.sendSMTP(ctx, host, auth.user, message);
expect(mailData.envelope).toEqual(expectedEnvelope);
});
test('Several transporters', async function() {
const secondAccountData = {
type: 'login',
user: 'jonathon.predovic@ethereal.email',
pass: 'yF554NtWzUhGwgCY37'
};
mailService.createSMTPTransporter(
ctx,
'smtp.ethereal.email',
587,
secondAccountData,
{ from: 'some.mail@server.com', to: 'jonathon.predovic@ethereal.email' }
);
const firstAccountResult = await mailService.sendSMTP(
ctx,
host,
auth.user,
{ text: 'First account message', subject: 'several accounts mails test' }
);
const secondAccountResult = await mailService.sendSMTP(
ctx,
host,
'jonathon.predovic@ethereal.email',
{ text: 'Second account message', subject: 'several accounts mails test' }
);
expect(firstAccountResult.envelope).toEqual(expectedEnvelope);
expect(secondAccountResult.envelope).toEqual({ from: 'some.mail@server.com', to: ['jonathon.predovic@ethereal.email'] });
});
});
});