email integration

* Nest email module with smtp, postmark and console log drivers
* react-email package
This commit is contained in:
Philipinho
2024-05-02 03:12:40 +01:00
parent 48be0c21ae
commit 4c573b9bc2
26 changed files with 2685 additions and 446 deletions

View File

@ -0,0 +1,3 @@
export { SmtpDriver } from './smtp.driver';
export { PostmarkDriver } from './postmark.driver';
export { LogDriver } from './log.driver';

View File

@ -0,0 +1,5 @@
import { MailMessage } from '../../interfaces/mail.message';
export interface MailDriver {
sendMail(message: MailMessage): Promise<void>;
}

View File

@ -0,0 +1,18 @@
import { MailDriver } from './interfaces/mail-driver.interface';
import { Logger } from '@nestjs/common';
import { MailMessage } from '../interfaces/mail.message';
import { mailLogName } from '../mail.utils';
export class LogDriver implements MailDriver {
private readonly logger = new Logger(mailLogName(LogDriver.name));
async sendMail(message: MailMessage): Promise<void> {
const mailLog = {
to: message.to,
subject: message.subject,
text: message.text,
};
this.logger.log(`Logged mail: ${JSON.stringify(mailLog)}`);
}
}

View File

@ -0,0 +1,30 @@
import { MailDriver } from './interfaces/mail-driver.interface';
import { PostmarkConfig } from '../interfaces';
import { ServerClient } from 'postmark';
import { MailMessage } from '../interfaces/mail.message';
import { Logger } from '@nestjs/common';
import { mailLogName } from '../mail.utils';
export class PostmarkDriver implements MailDriver {
private readonly logger = new Logger(mailLogName(PostmarkDriver.name));
private readonly postmarkClient: ServerClient;
constructor(config: PostmarkConfig) {
this.postmarkClient = new ServerClient(config.postmarkToken);
}
async sendMail(message: MailMessage): Promise<void> {
try {
await this.postmarkClient.sendEmail({
From: message.from,
To: message.to,
Subject: message.subject,
TextBody: message.text,
HtmlBody: message.html,
});
this.logger.debug(`Sent mail to ${message.to}`);
} catch (err) {
this.logger.warn(`Failed to send mail to ${message.to}: ${err}`);
}
}
}

View File

@ -0,0 +1,32 @@
import { MailDriver } from './interfaces/mail-driver.interface';
import { SMTPConfig } from '../interfaces';
import { Transporter } from 'nodemailer';
import * as nodemailer from 'nodemailer';
import { MailMessage } from '../interfaces/mail.message';
import { Logger } from '@nestjs/common';
import { mailLogName } from '../mail.utils';
export class SmtpDriver implements MailDriver {
private readonly logger = new Logger(mailLogName(SmtpDriver.name));
private readonly transporter: Transporter;
constructor(config: SMTPConfig) {
this.transporter = nodemailer.createTransport(config);
}
async sendMail(message: MailMessage): Promise<void> {
try {
await this.transporter.sendMail({
from: message.from,
to: message.to,
subject: message.subject,
text: message.text,
html: message.html,
});
this.logger.debug(`Sent mail to ${message.to}`);
} catch (err) {
this.logger.warn(`Failed to send mail to ${message.to}: ${err}`);
}
}
}