I am working on nestjs-modules/mailer, in my requirements, I have two options to send emails, the first option is using SMTP transport and the second one is using AWS SES.
My question is how to implement this instead of using transport in Module and setting transport in sendMail({}) function.
email.module.ts
import { MailerModule } from '@nestjs-modules/mailer';
import { Global, Module } from '@nestjs/common';
import { join } from 'path';
import { EmailService } from './email.service';
import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter';
import { ConfigService } from '@nestjs/config';
import { SES } from 'aws-sdk';
@Global()
@Module({
imports: [
MailerModule.forRootAsync({
useFactory: async (config: ConfigService) => ({
transport:{
SES: new SES({
accessKeyId:config.get('S3_ACCESS_KEY_ID'),
secretAccessKey:config.get('S3_SECRET_ACCESS_KEY'),
region:config.get('S3_REGION')
})
},
defaults: {
from: `"No Reply" <${config.get('SMTP_MAIL_FROM')}>`,
},
template: {
dir: join(__dirname, 'templates'),
adapter: new HandlebarsAdapter(),
options: {
strict: true,
},
},
}),
inject: [ConfigService],
}),
],
providers: [EmailService],
exports: [EmailService],
})
export class EmailModule {}
email.service.ts
import { MailerService } from '@nestjs-modules/mailer';
import { Injectable } from '@nestjs/common';
import { Payload } from './entities/payload.entity';
import { createTransport } from "nodemailer";
import { ConfigService } from '@nestjs/config';
@Injectable()
export class EmailService {
constructor(private readonly mailerService: MailerService, _configService: ConfigService) {}
async SESEmail(context: any): Promise<void> {
return await this.mailerService.sendMail({
to: context.toEmail,
subject: `Gentle Reminder ${context.taskName}`,
template: './welcome',
context: {
context
},
});
}
I need to set transport from my service instead of defining it in the module