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)} |