JSFiddle - React, Tailwind, and code Playground

TypeScript

// usage
const emailWelcomeMessage = new EmailWelcomeMessage(
	new NodeMailerEmailTransporter(config, nodeMailer),
  new WelcomeEmailMessageBuilder()
);
emailWelcomeMessage.setRecipient('milos.zeman@hrad.cz');
emailWelcomeMessage.send();


// definitions
export interface EmailMessageBuilder {
	buildTitle(): string;
  buildBody(): string;
}

export interface EmailTransporter {
	send(email: string, title: string, message: string): Promise<void>;
}

export class EmailWelcomeMessage {
    private userEmail: string;

    constructor(private transporter: EmailTransporter, private messageBuilder: EmailMessageBuilder) {
    }

    public async send(): Promise<void> {
        await this.transporter.send(
            this.userEmail,
            this.messageBuilder.buildTitle(this.recipient),
            this.messageBuilder.buildBody(this.recipient)
        );
    }

    public setRecipient(email: string): void {
        this.userEmail = email;
    }
}

export class WelcomeEmailMessageBuilder implements EmailMessageBuilder {
    public buildTitle(user: string): string {
				return `Welcome!`;
    }

    public buildBody(user: string): string {
			return `<h1>Thx for using this service, it is cool!</h1>`;
    }
}

export class NodeMailerEmailTransporter implements EmailTransporter {
	private transporter: NodeMailerTransporter;

	constructor(private config: EmailConfig, nodeMailer: NodeMailer) {
  	this.transporter = nodemailer.createTransport({service: 'Gmail', auth: config.smtp.auth});
  }

	public async send(email: string, title: string, body: string): Promise<void> {
  	    await this.transporter.sendMail({
            from: this.config.from,
            to: email,
            subject: title,
            text: body
        });
  }
	
}

// @ těžkej kopyvrajting