61 lines
1.8 KiB
JavaScript
61 lines
1.8 KiB
JavaScript
// Backend minimal Node.js pour traiter le formulaire de contact Hugo
|
|
// Place ce fichier à la racine du projet ou dans un dossier backend/
|
|
// Nécessite: npm install express nodemailer cors
|
|
|
|
|
|
require('dotenv').config();
|
|
const express = require('express');
|
|
const nodemailer = require('nodemailer');
|
|
const cors = require('cors');
|
|
const multer = require('multer');
|
|
const upload = multer();
|
|
const app = express();
|
|
const PORT = process.env.PORT || 3001;
|
|
|
|
// Middleware
|
|
app.use(cors());
|
|
// NE PAS utiliser express.urlencoded/json pour /contact, sinon req.body sera vide avec FormData
|
|
|
|
// Configurer le transporteur SMTP depuis .env
|
|
const transporter = nodemailer.createTransport({
|
|
host: process.env.SMTP_HOST,
|
|
port: parseInt(process.env.SMTP_PORT, 10),
|
|
secure: process.env.SMTP_SECURE === 'true',
|
|
auth: {
|
|
user: process.env.SMTP_USER,
|
|
pass: process.env.SMTP_PASS
|
|
}
|
|
});
|
|
|
|
app.post('/contact', upload.none(), async (req, res) => {
|
|
// Vérification de la présence de req.body
|
|
if (!req.body) {
|
|
console.log(req.body);
|
|
return res.status(400).send('Aucune donnée reçue.');
|
|
}
|
|
// Anti-robot honeypot
|
|
if (req.body.website && req.body.website.trim() !== '') {
|
|
return res.status(400).send('Bot détecté.');
|
|
}
|
|
const { email, subject, message } = req.body;
|
|
if (!email || !subject || !message) {
|
|
return res.status(400).send('Champs manquants');
|
|
}
|
|
try {
|
|
await transporter.sendMail({
|
|
from: process.env.SMTP_USER,
|
|
to: process.env.SMTP_USER,
|
|
replyTo: email,
|
|
subject: `Contact site: ${subject}`,
|
|
text: `Email: ${email}\nSujet: ${subject}\nMessage:\n${message}`
|
|
});
|
|
res.status(200).send('Message envoyé !');
|
|
} catch (err) {
|
|
res.status(500).send("Erreur d'envoi: " + err.message);
|
|
}
|
|
});
|
|
|
|
app.listen(PORT, () => {
|
|
console.log(`Serveur contact en écoute sur http://localhost:${PORT}`);
|
|
});
|