Files
paperlessmanager/paperless-backend/src/postprocessing/mail.service.ts
T
bjoernpoettker dad0136365
Build and Push Multi-Platform Images / build-and-push (push) Successful in 41s
chore: apply ESLint auto-fix across entire backend
Reformats code style (line breaks, indentation, type annotations)
without changing logic. Also includes minor feature additions bundled
in the same lint run (stats service, user-settings groups, agrarmonitor
polling improvements).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 09:02:02 +02:00

79 lines
2.5 KiB
TypeScript

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<string>('SMTP_HOST', ''),
port: this.configService.get<number>('SMTP_PORT', 587),
secure: this.configService.get<string>('SMTP_SECURE', 'false') === 'true',
auth: {
user: this.configService.get<string>('SMTP_USER', ''),
pass: this.configService.get<string>('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<void> {
let transporter = this.transporter;
const globalFromEmail = this.configService.get<string>(
'SMTP_FROM',
'paperless@localhost',
);
const globalFromName = this.configService.get<string>('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}`,
);
}
}