From 418b77e82c0661b15d76e5223adebd427a8ee1b7 Mon Sep 17 00:00:00 2001 From: Georgii Petrov Date: Wed, 10 Apr 2024 10:15:31 +0300 Subject: [PATCH] [feature] Mail service fixes pt.1 --- Common/config/default.json | 9 +----- Common/sources/mailService.js | 29 ++++++++----------- tests/unit/mailService.tests.js | 50 ++++++++++++++++++++++++++------- 3 files changed, 53 insertions(+), 35 deletions(-) diff --git a/Common/config/default.json b/Common/config/default.json index fd8b0006..de926286 100644 --- a/Common/config/default.json +++ b/Common/config/default.json @@ -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 } }, diff --git a/Common/sources/mailService.js b/Common/sources/mailService.js index 1a0abb52..066d1f8a 100644 --- a/Common/sources/mailService.js +++ b/Common/sources/mailService.js @@ -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 }; diff --git a/tests/unit/mailService.tests.js b/tests/unit/mailService.tests.js index b84900f7..96b1f844 100644 --- a/tests/unit/mailService.tests.js +++ b/tests/unit/mailService.tests.js @@ -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'] }); + }); }); });