Initial Commit
This commit is contained in:
78
routes/contact.js
Normal file
78
routes/contact.js
Normal file
@@ -0,0 +1,78 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user