import nodemailer from "nodemailer" import type { ContactFormData } from "@/lib/contact-form" import type { ContactMailerConfig } from "@/lib/contact-mailer-config" type ContactNotificationMeta = { submittedAt: string sourceUrl: string ipAddress: string userAgent: string } function escapeHtml(value: string) { return value .replaceAll("&", "&") .replaceAll("<", "<") .replaceAll(">", ">") .replaceAll("\"", """) .replaceAll("'", "'") } function formatOptionalField(value: string) { return value || "未填写" } export async function sendContactNotification({ config, payload, meta, }: { config: ContactMailerConfig payload: ContactFormData meta: ContactNotificationMeta }) { const transporter = nodemailer.createTransport({ host: config.smtp.host, port: config.smtp.port, secure: config.smtp.secure, auth: { user: config.smtp.auth.user, pass: config.smtp.auth.pass, }, }) const subject = `${config.notification.subjectPrefix} - ${payload.company} / ${payload.name}` const text = [ "官网获取初步方案表单有新提交。", "", `姓名:${payload.name}`, `公司 / 品牌:${payload.company}`, `电话:${payload.phone}`, `门店规模:${formatOptionalField(payload.scale)}`, `需求描述:${formatOptionalField(payload.message)}`, "", `提交时间:${meta.submittedAt}`, `来源页面:${meta.sourceUrl}`, `来源 IP:${meta.ipAddress}`, `User-Agent:${meta.userAgent}`, ].join("\n") const html = `

官网获取初步方案表单有新提交

姓名 ${escapeHtml(payload.name)}
公司 / 品牌 ${escapeHtml(payload.company)}
电话 ${escapeHtml(payload.phone)}
门店规模 ${escapeHtml(formatOptionalField(payload.scale))}
需求描述 ${escapeHtml(formatOptionalField(payload.message))}
提交时间 ${escapeHtml(meta.submittedAt)}
来源页面 ${escapeHtml(meta.sourceUrl)}
来源 IP ${escapeHtml(meta.ipAddress)}
User-Agent ${escapeHtml(meta.userAgent)}
` await transporter.sendMail({ from: { name: config.smtp.from.name, address: config.smtp.from.email, }, to: config.notification.to, subject, text, html, }) }