import type { Transporter } from 'nodemailer' import nodemailer from 'nodemailer' /** * Email Client * ------------ * Sends transactional emails (agency approval, license key delivery, ticket * notifications, invoice sent). * * Config (env): * MAIL_SMTP_HOST - e.g. smtp.your-server.de * MAIL_SMTP_PORT - 587 (STARTTLS) or 465 (SSL) * MAIL_USER - SMTP username * MAIL_PASSWORD - SMTP password * MAIL_FROM - sender email (e.g. "AOS ") */ let transporter: Transporter | null = null function getTransporter(): Transporter | null { const host = process.env.MAIL_SMTP_HOST const port = process.env.MAIL_SMTP_PORT const user = process.env.MAIL_USER const pass = process.env.MAIL_PASSWORD if (!host || !user || !pass) return null if (!transporter) { transporter = nodemailer.createTransport({ host, port: port ? parseInt(port, 10) : 587, secure: parseInt(port ?? '587', 10) === 465, auth: { user, pass }, }) } return transporter } export interface EmailInput { to: string subject: string text?: string html?: string } export async function sendEmail(input: EmailInput): Promise<{ ok: boolean; error?: string }> { const t = getTransporter() if (!t) { console.warn('[mail] SMTP not configured — email would have been sent to:', input.to, '| subject:', input.subject) return { ok: false, error: 'SMTP not configured' } } const from = process.env.MAIL_FROM || 'AOS ' try { await t.sendMail({ from, to: input.to, subject: input.subject, text: input.text || input.html?.replace(/<[^>]*>/g, ''), html: input.html || input.text, }) return { ok: true } } catch (err) { return { ok: false, error: err instanceof Error ? err.message : 'send failed' } } } // --- Pre-built email templates --- export async function sendAgencyApprovedEmail(input: { to: string companyName: string discountPct: number }): Promise { await sendEmail({ to: input.to, subject: `Ihre Reseller-Bewerbung wurde genehmigt — ${input.discountPct}% Rabatt`, text: `Guten Tag,\n\nIhre Bewerbung als Reseller wurde genehmigt.\n\nUnternehmen: ${input.companyName}\nIhr Rabatt: ${input.discountPct}% auf alle Lizenzen\n\nSie können jetzt eigene Kunden anlegen und lizenzieren.\n\nBesuchen Sie: https://dfmpanel.eu\n\nMit freundlichen Grüßen\nDFM Solutions`, html: `

Guten Tag,

Ihre Bewerbung als Reseller wurde genehmigt.

Unternehmen: ${input.companyName}
Ihr Rabatt: ${input.discountPct}% auf alle Lizenzen

Sie können jetzt eigene Kunden anlegen und lizenzieren.

Zum Portal →

Mit freundlichen Grüßen
DFM Solutions

`, }) } export async function sendAgencyRejectedEmail(input: { to: string companyName: string reason: string }): Promise { await sendEmail({ to: input.to, subject: 'Ihre Reseller-Bewerbung', text: `Guten Tag,\n\nIhre Bewerbung als Reseller wurde leider abgelehnt.\n\nUnternehmen: ${input.companyName}\nGrund: ${input.reason}\n\nBei Fragen kontaktieren Sie uns unter support@dfmpanel.eu\n\nMit freundlichen Grüßen\nDFM Solutions`, html: `

Guten Tag,

Ihre Bewerbung als Reseller wurde leider abgelehnt.

Unternehmen: ${input.companyName}
Grund: ${input.reason}

Bei Fragen kontaktieren Sie uns unter support@dfmpanel.eu

Mit freundlichen Grüßen
DFM Solutions

`, }) } export async function sendLicenseKeyEmail(input: { to: string licenseKey: string product: string plan: string }): Promise { await sendEmail({ to: input.to, subject: `Ihre Lizenz für ${input.product} (${input.plan.toUpperCase()})`, text: `Guten Tag,\n\nIhre Lizenz wurde erstellt.\n\nProdukt: ${input.product}\nPlan: ${input.plan}\nLizenzschlüssel: ${input.licenseKey}\n\nSpeichern Sie den Schlüssel sicher. Sie benötigen ihn zur Aktivierung Ihrer Software.\n\nMit freundlichen Grüßen\nDFM Solutions`, html: `

Guten Tag,

Ihre Lizenz wurde erstellt.

Produkt: ${input.product}
Plan: ${input.plan}
Lizenzschlüssel: ${input.licenseKey}

Speichern Sie den Schlüssel sicher. Sie benötigen ihn zur Aktivierung Ihrer Software.

Mit freundlichen Grüßen
DFM Solutions

`, }) } export async function sendTicketCreatedEmail(input: { to: string ticketNumber: string subject: string }): Promise { await sendEmail({ to: input.to, subject: `Ticket ${input.ticketNumber} wurde erstellt`, text: `Ihr Support-Ticket wurde erstellt.\n\nTicket: ${input.ticketNumber}\nBetreff: ${input.subject}\n\nWir werden uns so schnell wie möglich um Ihr Anliegen kümmern.\n\nMit freundlichen Grüßen\nDFM Solutions`, html: `

Ihr Support-Ticket wurde erstellt.

Ticket: ${input.ticketNumber}
Betreff: ${input.subject}

Wir werden uns so schnell wie möglich um Ihr Anliegen kümmern.

`, }) }