Files
kleinpanicWeb/routes/contact.js
2024-10-20 17:49:24 -04:00

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;