From c30e92dc494a932eb9c3169564da9e525eb89796 Mon Sep 17 00:00:00 2001 From: Wilco Schoneveld Date: Fri, 13 May 2022 09:06:10 +0200 Subject: [PATCH] Added ability to set additional transport options to email service (#1589) Co-authored-by: Wilco Schoneveld --- src/lib/services/email-service.test.ts | 33 ++++++++++++++++++++++++++ src/lib/services/email-service.ts | 23 ++++++++---------- src/lib/types/option.ts | 2 ++ 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/src/lib/services/email-service.test.ts b/src/lib/services/email-service.test.ts index a72b56399a..e5db50ee09 100644 --- a/src/lib/services/email-service.test.ts +++ b/src/lib/services/email-service.test.ts @@ -1,3 +1,4 @@ +import nodemailer from 'nodemailer'; import { EmailService } from './email-service'; import noLoggerProvider from '../../test/fixtures/no-logger'; @@ -47,3 +48,35 @@ test('Can send welcome mail', async () => { expect(content.from).toBe('noreply@getunleash.ai'); expect(content.subject).toBe('Welcome to Unleash'); }); + +test('Can supply additional SMTP transport options', async () => { + const spy = jest.spyOn(nodemailer, 'createTransport'); + + new EmailService( + { + host: 'smtp.unleash.test', + port: 9999, + secure: false, + sender: 'noreply@getunleash.ai', + transportOptions: { + tls: { + rejectUnauthorized: true, + }, + }, + }, + noLoggerProvider, + ); + + expect(spy).toHaveBeenCalledWith({ + auth: { + user: '', + pass: '', + }, + host: 'smtp.unleash.test', + port: 9999, + secure: false, + tls: { + rejectUnauthorized: true, + }, + }); +}); diff --git a/src/lib/services/email-service.ts b/src/lib/services/email-service.ts index 2b2bcb8b2b..022f60840d 100644 --- a/src/lib/services/email-service.ts +++ b/src/lib/services/email-service.ts @@ -21,15 +21,6 @@ export enum TransporterType { JSON = 'json', } -export interface IEmailOptions { - host: string; - port: number; - secure: boolean; - sender: string; - auth: IAuthOptions; - transporterType: TransporterType; -} - export interface IEmailEnvelope { from: string; to: string; @@ -57,10 +48,16 @@ export class EmailService { if (email.host === 'test') { this.mailer = createTransport({ jsonTransport: true }); } else { - const connectionString = `${email.smtpuser}:${email.smtppass}@${email.host}:${email.port}`; - this.mailer = email.secure - ? createTransport(`smtps://${connectionString}`) - : createTransport(`smtp://${connectionString}`); + this.mailer = createTransport({ + host: email.host, + port: email.port, + secure: email.secure, + auth: { + user: email.smtpuser ?? '', + pass: email.smtppass ?? '', + }, + ...email.transportOptions, + }); } this.logger.info( `Initialized transport to ${email.host} on port ${email.port} with user: ${email.smtpuser}`, diff --git a/src/lib/types/option.ts b/src/lib/types/option.ts index cb6fcc35de..8bc287927e 100644 --- a/src/lib/types/option.ts +++ b/src/lib/types/option.ts @@ -2,6 +2,7 @@ import EventEmitter from 'events'; import { LogLevel, LogProvider } from '../logger'; import { ILegacyApiTokenCreate } from './models/api-token'; import { IExperimentalOptions } from '../experimental'; +import SMTPTransport from 'nodemailer/lib/smtp-transport'; export type EventHook = (eventName: string, data: object) => void; @@ -111,6 +112,7 @@ export interface IEmailOption { sender: string; smtpuser?: string; smtppass?: string; + transportOptions?: SMTPTransport.Options; } export interface IListeningPipe {