import { Injectable, Logger } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import * as nodemailer from 'nodemailer'; @Injectable() export class MailService { private readonly logger = new Logger(MailService.name); private transporter: nodemailer.Transporter; constructor(private readonly configService: ConfigService) { this.transporter = nodemailer.createTransport({ host: this.configService.get('SMTP_HOST', ''), port: this.configService.get('SMTP_PORT', 587), secure: this.configService.get('SMTP_SECURE', 'false') === 'true', auth: { user: this.configService.get('SMTP_USER', ''), pass: this.configService.get('SMTP_PASS', ''), }, }); } async sendMail(options: { to: string; subject: string; body: string; html?: string; attachments?: { filename: string; content: Buffer }[]; smtpOverride?: { host: string; port: number; secure: boolean; user: string; pass: string; from: string; }; }): Promise { let transporter = this.transporter; const globalFromEmail = this.configService.get( 'SMTP_FROM', 'paperless@localhost', ); const globalFromName = this.configService.get('SMTP_FROM_NAME', ''); let from = globalFromName ? `"${globalFromName}" <${globalFromEmail}>` : globalFromEmail; if (options.smtpOverride) { const o = options.smtpOverride; transporter = nodemailer.createTransport({ host: o.host, port: o.port, secure: o.secure, auth: { user: o.user, pass: o.pass }, }); from = o.from || from; } else { this.logger.debug( `SMTP config — host: ${this.configService.get('SMTP_HOST')} port: ${this.configService.get('SMTP_PORT')} secure: ${this.configService.get('SMTP_SECURE')} user: ${this.configService.get('SMTP_USER')} from: ${from}`, ); } const info = await transporter.sendMail({ from, to: options.to, subject: options.subject, text: options.body, html: options.html, attachments: options.attachments?.map((a) => ({ filename: a.filename, content: a.content, })), }); this.logger.log( `Mail gesendet an ${options.to}: "${options.subject}" — messageId: ${info.messageId} accepted: ${JSON.stringify(info.accepted)} rejected: ${JSON.stringify(info.rejected)} response: ${info.response}`, ); } }