import { transport } from "./mailer"; import { buildLegalFooterLines, renderVerificationEmailHtml } from "./emailTemplates"; import { getSellerForInvoice } from "./invoiceData"; // Fire-and-forget by design — callers should not await this in a way that // blocks or fails the actual error response the customer sees. Wrap // everything in its own try/catch so a broken mail relay never becomes a // second, worse failure on top of the one being reported. Internal-only // (sent to admin@mk360.de, this business's own inbox), but still carries // the plain-text Anbieterkennzeichnung for consistency with every other // email this app sends — see buildLegalFooterLines() in emailTemplates.ts. export function sendCriticalAlert(subject: string, details: Record): void { getSellerForInvoice() .catch(() => null) .then((seller) => { const footer = buildLegalFooterLines(seller).join("\n"); return transport.sendMail({ from: '"einfach produktiv Alerts" ', to: "admin@mk360.de", subject: `[einfach produktiv] ${subject}`, text: `${JSON.stringify(details, null, 2)}\n\n---\n${footer}`, }); }) .catch((err) => { console.error("sendCriticalAlert: failed to send alert email", err); }); } // The *initial* verification email (on registration) is sent by Payload // itself, via Customers.ts's own afterChange hook — that one fires // automatically on create and needs no separate wiring. This one is only // for the "erneut senden" resend path (app/api/account/resend-verification/ // route.ts), which updates the token via the customer's own session // (app/lib/customerAuth.ts's resendVerificationEmail) but has no Payload // hook to piggyback on for a plain update, so it sends directly instead — // same Hostinger transport as the alert above, and the same branded // emailShell()/legal-footer template as every other email (see // renderVerificationEmailHtml in emailTemplates.ts). export async function sendVerificationEmail(to: string, firstName: string, token: string): Promise { const url = `https://einfach-produktiv.mk360.de/api/account/verify-email?token=${token}`; const seller = await getSellerForInvoice(); await transport.sendMail({ // See orderEmail.ts's own comment — From now matches sellerEmail // itself since the SMTP account moved to a mailbox on that domain, // and emailFromName/emailFromAddress let an admin override both. from: `"${seller?.emailFromName || seller?.sellerName || "Björn"}" <${seller?.emailFromAddress || seller?.sellerEmail || "hallo@einfach-produktiv.com"}>`, replyTo: seller?.sellerEmail || undefined, to, subject: "Bitte bestätige deine E-Mail-Adresse", html: renderVerificationEmailHtml(firstName, url, seller), }); }