A mailer module for Nest framework (node.js) using Nodemailer library
npm install --save @nestjs-modules/mailer
Import the MailerModule into the root AppModule.
//app.module.ts
import { Module } from '@nestjs/common';
import { HandlebarsAdapter, MailerModule } from '@nestjs-modules/mailer';
@Module({
imports: [
MailerModule.forRoot({
transport: 'smtps://user@domain.com:pass@smtp.domain.com',
defaults: {
from:'"nest-modules" <modules@nestjs.com>',
},
template: {
dir: __dirname + '/templates',
adapter: new HandlebarsAdapter(), // or new PugAdapter()
options: {
strict: true,
},
},
}),
],
})
export class AppModule {}
Of course, it is possible to use an async configuration:
//app.module.ts
import { Module } from '@nestjs/common';
import { HandlebarsAdapter, MailerModule } from '@nestjs-modules/mailer';
@Module({
imports: [
MailerModule.forRootAsync({
useFactory: () => ({
transport: 'smtps://user@domain.com:pass@smtp.domain.com',
defaults: {
from:'"nest-modules" <modules@nestjs.com>',
},
template: {
dir: __dirname + '/templates',
adapter: new HandlebarsAdapter(), // or new PugAdapter()
options: {
strict: true,
},
},
}),
}),
],
})
export class AppModule {}
Afterwards, MailerService will be available to inject across entire project (without importing any module elsewhere), for example in this way:
import { Injectable } from '@nestjs/common';
import { MailerService } from '@nestjs-modules/mailer';
@Injectable()
export class ExampleService {
constructor(private readonly mailerService: MailerService) {}
}
MailerProvider exports the sendMail()
function to which you can pass the message options (sender, email subject, recipient, body content, etc)
sendMail()
accepts the same fields as nodemailer email message
import { Injectable } from '@nestjs/common';
import { MailerService } from '@nestjs-modules/mailer';
@Injectable()
export class ExampleService {
constructor(private readonly mailerService: MailerService) {}
public example(): void {
this
.mailerService
.sendMail({
to: 'test@nestjs.com', // list of receivers
from: 'noreply@nestjs.com', // sender address
subject: 'Testing Nest MailerModule ✔', // Subject line
text: 'welcome', // plaintext body
html: '<b>welcome</b>', // HTML body content
})
.then(() => {})
.catch(() => {});
}
public example2(): void {
this
.mailerService
.sendMail({
to: 'test@nestjs.com',
from: 'noreply@nestjs.com',
subject: 'Testing Nest Mailermodule with template ✔',
template: 'welcome', // The `.pug` or `.hbs` extension is appended automatically.
context: { // Data to be sent to template engine.
code: 'cf1a3f828287',
username: 'john doe',
},
})
.then(() => {})
.catch(() => {});
}
public example3(): void {
this
.mailerService
.sendMail({
to: 'test@nestjs.com',
from: 'noreply@nestjs.com',
subject: 'Testing Nest Mailermodule with template ✔',
template: __dirname + '/welcome', // The `.pug` or `.hbs` extension is appended automatically.
context: { // Data to be sent to template engine.
code: 'cf1a3f828287',
username: 'john doe',
},
})
.then(() => {})
.catch(() => {});
}
}
enable handlebars partials
import * as path from 'path';
import { Module } from '@nestjs/common';
import { BullModule } from 'nest-bull';
import { MailerModule, HandlebarsAdapter } from '@nestjs-modules/mailer';
import { mailBullConfig } from '../../config/mail';
import { MailService } from './mail.service';
import { MailController } from './mail.controller';
import { MailQueue } from './mail.queue';
const bullModule = BullModule.forRoot(mailBullConfig);
@Module({
imports: [
bullModule,
MailerModule.forRoot({
defaults: {
from: '"No Reply" <noreply@example.com>',
},
template: {
dir: path.join(process.env.PWD, 'templates/pages'),
adapter: new HandlebarsAdapter(),
options: {
strict: true,
},
},
options: {
partials: {
dir: path.join(process.env.PWD, 'templates/partials'),
options: {
strict: true,
},
}
}
}),
],
controllers: [MailController],
providers: [MailService, MailQueue],
exports: [bullModule],
})
export class MailModule {}
- Sending email-template with outlook - Starter kit, nestjs mailer implementation on outlook smtp with email-template
MIT