import type { VercelRequest, VercelResponse } from "@vercel/node"; import nodemailer from "nodemailer"; export default async function handler(req: VercelRequest, res: VercelResponse) { // CORS 处理 // res.setHeader("Access-Control-Allow-Origin", "*"); // res.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS"); // res.setHeader("Access-Control-Allow-Headers", "Content-Type"); // if (req.method === "OPTIONS") { // return res.status(200).end(); // } // if (req.method === "GET") { // return res.status(200).json({ status: "ok", message: "use POST to send mail" }); // } // if (req.method !== "POST") { // return res.status(405).json({ error: "Method Not Allowed" }); // } try { const data = typeof req.body === "string" ? JSON.parse(req.body) : req.body; const { name, email, site, desc, avatar } = data || {}; if (!name || !email || !desc) { return res.status(400).json({ error: "Missing required fields: name, email, desc" }); } const transporter = nodemailer.createTransport({ host: process.env.SMTP_HOST, port: Number(process.env.SMTP_PORT || 465), secure: Number(process.env.SMTP_PORT || 465) === 465, auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS, }, }); const info = await transporter.sendMail({ from: process.env.SENDER_EMAIL, to: process.env.ADMIN_EMAIL, subject: "友链申请 / 联系表单", html: `

名称:${name}

邮箱:${email}

站点:${site || "未填写"}

描述:${desc}

头像:${avatar || "未填写"}

时间:${new Date().toISOString()}

`, }); return res.status(200).json({ message: "Mail sent", id: info.messageId, }); } catch (err) { return res.status(500).json({ error: "Send mail failed", detail: (err as Error).message }); } }