dad0136365
Build and Push Multi-Platform Images / build-and-push (push) Successful in 41s
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>
79 lines
2.5 KiB
TypeScript
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}`,
|
|
);
|
|
}
|
|
}
|