import { Logger } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import * as nodemailer from 'nodemailer'; import { MailMessage, MailProvider } from './mail-provider'; /// SMTP transport (MAIL_PROVIDER=smtp). Delivery failures are logged and /// swallowed — callers treat email as best-effort. export class SmtpMailProvider implements MailProvider { private readonly logger = new Logger('MailProvider'); private readonly from: string; private readonly transport: nodemailer.Transporter; constructor(config: ConfigService) { this.from = config.getOrThrow('MAIL_FROM'); this.transport = nodemailer.createTransport({ host: config.getOrThrow('SMTP_HOST'), port: Number(config.get('SMTP_PORT') ?? 587), secure: config.get('SMTP_SECURE') === 'true', auth: config.get('SMTP_USER') ? { user: config.getOrThrow('SMTP_USER'), pass: config.getOrThrow('SMTP_PASS'), } : undefined, }); } async send(message: MailMessage): Promise { try { await this.transport.sendMail({ from: this.from, to: message.to, subject: message.subject, text: message.text, html: message.html, }); return true; } catch (err) { this.logger.error( `Failed to send "${message.subject}" to ${message.to}: ${(err as Error).message}`, ); return false; } } }