/** * 邮件通知工具 * 通过 SMTP 发送邮件通知(腾讯企业邮) * * 环境变量: * SMTP_HOST - SMTP 服务器地址(默认 smtp.exmail.qq.com) * SMTP_PORT - SMTP 端口(默认 465) * SMTP_USER - 发件邮箱账号 * SMTP_PASS - 发件邮箱密码 / 授权码 * NOTIFY_EMAIL - 收件邮箱(默认 lt@1814.love) * * 不配置 SMTP_USER / SMTP_PASS 则静默跳过 */ import { createTransport } from 'nodemailer' let transporter = null function getTransporter() { if (transporter) return transporter const user = process.env.SMTP_USER const pass = process.env.SMTP_PASS if (!user || !pass) return null transporter = createTransport({ host: process.env.SMTP_HOST || 'smtp.exmail.qq.com', port: Number(process.env.SMTP_PORT) || 465, secure: true, auth: { user, pass }, }) return transporter } /** * 发送邮件通知 * @param {string} subject - 邮件主题 * @param {Record} fields - { 字段名: 字段值 } */ export async function notifyEmail(subject, fields) { const t = getTransporter() if (!t) return const rows = Object.entries(fields) .map(([k, v]) => `${k}${v}`) .join('') const now = new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }) const html = `

${subject}

${rows}

提交时间:${now}

` const to = process.env.NOTIFY_EMAIL || 'lt@1814.love' try { await t.sendMail({ from: `"呼籁旅行" <${process.env.SMTP_USER}>`, to, subject, html, }) } catch (err) { console.error('[email] 邮件发送失败:', err?.message) } }