Advanced
Custom Transport Factory
Implement MailerTransportFactory to customize how transporters are created:
import { MailerTransportFactory } from '@nestjs-modules/mailer';
import { createTransport } from 'nodemailer';
export class CustomTransportFactory implements MailerTransportFactory {
createTransport(options?: any) {
return createTransport({
// your custom transport configuration
});
}
}
Register it via forRootAsync():
MailerModule.forRootAsync({
useFactory: () => ({
transport: { host: 'smtp.example.com', port: 587 },
}),
extraProviders: [
{
provide: MAILER_TRANSPORT_FACTORY,
useClass: CustomTransportFactory,
},
],
})
Third-Party Transports
You can use any Nodemailer-compatible transport plugin:
import * as sendgridTransport from 'nodemailer-sendgrid';
MailerModule.forRoot({
transport: sendgridTransport({ apiKey: 'SG.xxxx' }),
defaults: {
from: '"App" <noreply@example.com>',
},
})
Other popular transports:
nodemailer-sendgrid— SendGrid APInodemailer-mailgun-transport— Mailgun APInodemailer-ses-transport— AWS SES (also built-in via Nodemailer)
Docker Deployment
When deploying with Docker, ensure templates are included in the image:
FROM node:20-alpine
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN corepack enable && pnpm install --frozen-lockfile --prod
COPY dist/ ./dist/
COPY templates/ ./templates/
CMD ["node", "dist/main.js"]
tip
- Use absolute paths for template directories in production
- Set SMTP credentials via environment variables, not hardcoded values
- If using
preview: true, disable it in production environments
Webpack / Custom Bundlers
If you bundle your NestJS app with webpack, the @css-inline/css-inline WASM binary may not be included. This is handled automatically in v2.1.x+ via lazy-loading — the binary is loaded at runtime from node_modules instead of at build time.
If you still encounter issues, exclude it from your webpack config:
// webpack.config.js
module.exports = {
externals: {
'@css-inline/css-inline': 'commonjs @css-inline/css-inline',
},
};
Monorepo Structure
This project is organized as a monorepo using pnpm workspaces and Turborepo:
mailer/
packages/
mailer/ # @nestjs-modules/mailer (published to npm)
apps/
website/ # Documentation site (Docusaurus)
samples/
basic/ # Basic usage example
custom-template-adapter/ # Custom adapter example
Development Commands
# Install all dependencies
pnpm install
# Build all packages
pnpm run build
# Run tests
pnpm run test
# Lint and format
pnpm run check
pnpm run format
# Start documentation site
pnpm --filter @nestjs-modules/website start