import { NextResponse } from "next/server"; import nodemailer from "nodemailer"; // Fonction pour vérifier le token Turnstile async function verifyTurnstileToken(token: string): Promise { const response = await fetch( "https://challenges.cloudflare.com/turnstile/v0/siteverify", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ secret: process.env.TURNSTILE_SECRET_KEY, response: token, }), } ); const data = await response.json(); return data.success; } export async function POST(request: Request) { try { const { name, email, message, captchaToken } = await request.json(); // Validation if (!name || !email || !message) { return NextResponse.json( { error: "Tous les champs sont requis" }, { status: 400 } ); } // Vérifier le captcha if (!captchaToken) { return NextResponse.json( { error: "Captcha requis" }, { status: 400 } ); } const isCaptchaValid = await verifyTurnstileToken(captchaToken); if (!isCaptchaValid) { return NextResponse.json( { error: "Captcha invalide. Veuillez réessayer." }, { status: 400 } ); } // Configuration du transporteur SMTP const transporter = nodemailer.createTransport({ host: process.env.SMTP_HOST, port: parseInt(process.env.SMTP_PORT || "587"), secure: process.env.SMTP_PORT === "465", auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASSWORD, }, tls: { rejectUnauthorized: true, }, }); // Vérifier la connexion SMTP await transporter.verify(); // HTML de l'email const htmlContent = `

✉️ Nouveau message depuis votre portfolio

👤 Nom
${name}
📧 Email
${email}
💬 Message
${message}
`; const textContent = ` Nouveau message depuis votre portfolio Nom: ${name} Email: ${email} Message: ${message} --- Pour répondre, envoyez un email à: ${email} Captcha vérifié `; const mailOptions = { from: process.env.SMTP_FROM, to: process.env.EMAIL_TO, replyTo: email, subject: `💬 Nouveau message de ${name}`, text: textContent, html: htmlContent, }; const info = await transporter.sendMail(mailOptions); return NextResponse.json({ success: true, messageId: info.messageId, }); } catch (error: unknown) { const errorMessage = error instanceof Error ? error.message : "Erreur inconnue"; return NextResponse.json( { error: "Erreur lors de l'envoi du message", details: process.env.NODE_ENV === "development" ? errorMessage : "Erreur serveur", }, { status: 500 } ); } }