@anarchitects/common-nest-mailer
Shared typed mailer configuration, transport setup, and provider wiring for NestJS apps.
Features
- Shared mailer config namespace + typed injection helpers
- Adapter wiring (
nodeandnoop) behind a commonMailerPortcontract - Root transport setup helpers for deterministic app-level configuration
Installation
npm install @anarchitects/common-nest-mailer @nestjs-modules/mailer
# or
yarn add @anarchitects/common-nest-mailer @nestjs-modules/mailer
Entry points and exports
mailerConfig:registerAs(...)config namespace for@nestjs/configMailerConfig: inferred config type (ConfigType<typeof mailerConfig>)InjectMailerConfig(): decorator helper for injecting config valuesCommonMailerProvider: provider mode union ('node' | 'noop')CommonMailerModuleOptions: provider wiring options (provider?: CommonMailerProvider)CommonMailerModule.forRoot(options?): provider wiring (MailerPort -> NodeMailerAdapter|NoopMailerAdapter)CommonMailerModule.forProviderFromConfig(overrides?): config-driven provider wiring fromMAILER_PROVIDERCommonMailerModule.forRootFromConfig(): config-driven root mail transport setupCommonMailerModule.forRootAsync(...): pass-through setup for custom transportsMailerPort: shared mailer port token/contract for domain adaptersNodeMailerAdapter: shared concrete adapter using NestMailerServiceNoopMailerAdapter: shared no-op implementation
Environment Variables
MAILER_PROVIDER=node
MAILER_HOST=smtp.example.com
MAILER_PORT=587
MAILER_SECURE=false
MAILER_USER=user@example.com
MAILER_PASS=super-secret
MAILER_DEFAULT=noreply@example.com
MAILER_IGNORE_TLS=false
MAILER_TEMPLATE_DIR=templates
Configuration
Configure mailerConfig in ConfigModule.forRoot({ load: [mailerConfig] }) and then choose provider wiring with either:
CommonMailerModule.forProviderFromConfig()for env-driven provider selectionCommonMailerModule.forRoot({ provider: 'node' | 'noop' })for explicit provider selection
Usage (Preferred)
Configure mail transport once at app root, then let domain mailer modules consume MailerService.
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { CommonMailerModule, mailerConfig } from '@anarchitects/common-nest-mailer';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
load: [mailerConfig],
}),
CommonMailerModule.forRootFromConfig(),
CommonMailerModule.forProviderFromConfig(),
],
})
export class AppModule {}
Explicit Provider Wiring
import { Module } from '@nestjs/common';
import { CommonMailerModule } from '@anarchitects/common-nest-mailer';
@Module({
imports: [CommonMailerModule.forRoot({ provider: 'noop' })],
})
export class AppModule {}
Custom Transport Setup
import { Module } from '@nestjs/common';
import { CommonMailerModule } from '@anarchitects/common-nest-mailer';
@Module({
imports: [
CommonMailerModule.forRootAsync({
useFactory: () => ({
transport: { jsonTransport: true },
defaults: { from: 'noreply@example.com' },
template: { dir: 'templates' },
}),
}),
],
})
export class AppModule {}
Injecting Typed Config
import { Injectable } from '@nestjs/common';
import { InjectMailerConfig, MailerConfig } from '@anarchitects/common-nest-mailer';
@Injectable()
export class MailerSetupService {
constructor(@InjectMailerConfig() private readonly config: MailerConfig) {}
}
Development notes
- Configure transport once at app root and keep domain modules adapter-focused.
- Use
MailerPortas the cross-domain contract to avoid tight coupling to concrete providers. - Keep shared module defaults safe for local/dev environments.
License
Released under the Apache License 2.0.