This commit is contained in:
Mateusz Gruszczyński
2026-04-07 15:30:49 +02:00
parent e4e2758416
commit 790e2d3b08
12 changed files with 483 additions and 54 deletions
+42
View File
@@ -0,0 +1,42 @@
import nodemailer from "nodemailer";
import { AppSetting } from "../entities/AppSetting.js";
type MailSettings = Pick<AppSetting, 'smtpHost' | 'smtpPort' | 'smtpSecure' | 'smtpUser' | 'smtpPassword' | 'smtpFromName' | 'smtpFromEmail' | 'appName'>;
const normalizePort = (value: number | null | undefined) => {
const port = Number(value ?? 0);
return Number.isFinite(port) && port > 0 ? port : 587;
};
export const resolveSmtpSecurity = (settings: Pick<AppSetting, 'smtpPort' | 'smtpSecure'>) => {
const port = normalizePort(settings.smtpPort);
const wantsSecure = Boolean(settings.smtpSecure);
const secure = port === 465 ? true : wantsSecure && port !== 587;
const requireTLS = port === 587 || (!secure && wantsSecure);
return { port, secure, requireTLS };
};
export const createSmtpTransport = (settings: MailSettings) => {
const security = resolveSmtpSecurity(settings);
return nodemailer.createTransport({
host: settings.smtpHost ?? undefined,
port: security.port,
secure: security.secure,
requireTLS: security.requireTLS,
auth: settings.smtpUser ? { user: settings.smtpUser, pass: settings.smtpPassword ?? '' } : undefined
});
};
export const formatFromAddress = (settings: Pick<AppSetting, 'smtpFromName' | 'smtpFromEmail'>) => {
if (!settings.smtpFromEmail) return '';
return settings.smtpFromName
? `"${settings.smtpFromName}" <${settings.smtpFromEmail}>`
: settings.smtpFromEmail;
};
export const describeSmtpMode = (settings: Pick<AppSetting, 'smtpPort' | 'smtpSecure'>) => {
const { port, secure, requireTLS } = resolveSmtpSecurity(settings);
if (secure) return `implicit TLS on port ${port}`;
if (requireTLS) return `STARTTLS on port ${port}`;
return `plain/upgrade connection on port ${port}`;
};