78 lines
2.8 KiB
JavaScript
78 lines
2.8 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const path = require('path');
|
|
const nodemailer = require('nodemailer');
|
|
const rateLimit = require('express-rate-limit');
|
|
const fs = require('fs');
|
|
require('dotenv').config(); // Load environment variables
|
|
|
|
// Define the log file path
|
|
const logFilePath = path.join(__dirname, '../stderr.log');
|
|
|
|
// Helper function to log errors to stderr.log
|
|
function logError(message) {
|
|
const logMessage = `${new Date().toISOString()} - ${message}\n`;
|
|
fs.appendFile(logFilePath, logMessage, (err) => {
|
|
if (err) {
|
|
console.error('Error writing to stderr.log:', err);
|
|
}
|
|
});
|
|
}
|
|
|
|
// Nodemailer setup using environment variables
|
|
const transporter = nodemailer.createTransport({
|
|
service: 'gmail', // Use your email service (like Gmail, Outlook, etc.)
|
|
auth: {
|
|
user: process.env.EMAIL_USER, // Fetch email from environment variable
|
|
pass: process.env.EMAIL_PASSWORD // Fetch password from environment variable
|
|
}
|
|
});
|
|
|
|
// Rate limiter to allow only one submission per 24 hours per IP
|
|
const contactFormLimiter = rateLimit({
|
|
windowMs: 24 * 60 * 60 * 1000, // 24 hours
|
|
max: 1, // Limit each IP to 1 request per window
|
|
message: 'You have already submitted a message. Please try again after 24 hours.'
|
|
});
|
|
|
|
// Route to serve the contact page
|
|
router.get('/', (req, res) => {
|
|
res.sendFile(path.join(__dirname, '../views/contact.html'));
|
|
});
|
|
|
|
// Route to handle form submissions
|
|
router.post('/submit-contact-form', contactFormLimiter, (req, res) => {
|
|
const { name, email, message } = req.body;
|
|
|
|
// Backend validation for the form fields
|
|
if (!name || !email || !message) {
|
|
logError('Form submission failed: Missing fields.');
|
|
return res.status(400).json({ success: false, message: 'All fields are required.' });
|
|
}
|
|
|
|
// Check if environment variables are set
|
|
if (!process.env.EMAIL_USER || !process.env.EMAIL_PASSWORD) {
|
|
logError('Error: EMAIL_USER or EMAIL_PASSWORD environment variables not set.');
|
|
return res.status(500).json({ success: false, message: 'Server configuration error: Environment variables not set.' });
|
|
}
|
|
|
|
// Email options for sending the message
|
|
const mailOptions = {
|
|
from: email, // Sender's email
|
|
to: process.env.EMAIL_USER, // Your email where you'll receive messages
|
|
subject: `New Contact Form Submission from ${name}`,
|
|
text: `You have received a new message from ${name} (${email}):\n\n${message}`
|
|
};
|
|
|
|
// Send the email
|
|
transporter.sendMail(mailOptions, (error, info) => {
|
|
if (error) {
|
|
logError(`Error sending email: ${error.message}`);
|
|
return res.status(500).json({ success: false, message: 'Error sending email.' });
|
|
}
|
|
logError(`Email sent successfully: ${info.response}`);
|
|
res.json({ success: true, message: 'Your message has been sent successfully.' });
|
|
});
|
|
});
|
|
|
|
module.exports = router; |