import express from 'express'; import path from 'path'; import fs from 'fs'; import nodemailer from 'nodemailer'; import { createServer as createViteServer } from 'vite'; import dotenv from 'dotenv'; dotenv.config(); async function startServer() { const app = express(); const PORT = 3000; app.use(express.json()); // API route to send email via SMTP app.post('/api/send-email', async (req, res) => { const { name, email, phone, company, subject, message, isEstimate, estimateSummary } = req.body; if (!name || !email) { return res.status(400).json({ error: 'Missing name or email' }); } // Load SMTP configuration (favoring env variables, falling back to JSON file) const smtpConfig = { host: process.env.SMTP_HOST || 'smtp.khongisa.co.za', port: Number(process.env.SMTP_PORT || 587), secure: process.env.SMTP_SECURE === 'true', user: process.env.SMTP_USER || '', pass: process.env.SMTP_PASS || '', fromEmail: process.env.SMTP_FROM || '', toEmail: process.env.SMTP_TO || 'info@litecharms.co.za', }; // If environment variables aren't completely defined, try loading from smtp-config.json const configPath = path.join(process.cwd(), 'smtp-config.json'); if ((!smtpConfig.user || !smtpConfig.pass || smtpConfig.pass.includes('YOUR_SECURE')) && fs.existsSync(configPath)) { try { const fileData = fs.readFileSync(configPath, 'utf8'); const parsed = JSON.parse(fileData); smtpConfig.host = parsed.host || smtpConfig.host; smtpConfig.port = Number(parsed.port || smtpConfig.port); smtpConfig.secure = parsed.secure ?? smtpConfig.secure; smtpConfig.user = parsed.auth?.user || smtpConfig.user; smtpConfig.pass = parsed.auth?.pass || smtpConfig.pass; smtpConfig.fromEmail = parsed.fromEmail || smtpConfig.fromEmail; smtpConfig.toEmail = parsed.toEmail || smtpConfig.toEmail; } catch (err) { console.error('Error reading smtp-config.json:', err); } } // Generate Email Content let emailSubject = subject || 'LiteCharms Inquiry'; if (isEstimate) { emailSubject = `LiteCharms Project Estimate Proposal: ${subject}`; } let emailHtml = `
`; // Check if SMTP is ready or left as placeholder const hasValidAuth = smtpConfig.user && smtpConfig.pass && !smtpConfig.pass.includes('YOUR_SECURE'); if (!hasValidAuth) { console.log('\n--- SMTP EMAIL LOG (NO PASSWORD CONFIGURED) ---'); console.log(`To: ${smtpConfig.toEmail}`); console.log(`From: ${smtpConfig.fromEmail || 'no-reply@khongisa.co.za'}`); console.log(`Subject: ${emailSubject}`); console.log(`Plain text summary:\nClient ${name} (${email}) sent inquiry. Subject: ${emailSubject}`); console.log('-----------------------------------------------\n'); return res.status(200).json({ success: true, message: 'SMTP credentials not configured yet. Email dispatch was logged in system console successfully.', logged: true }); } try { const transporter = nodemailer.createTransport({ host: smtpConfig.host, port: smtpConfig.port, secure: smtpConfig.secure, auth: { user: smtpConfig.user, pass: smtpConfig.pass, }, }); await transporter.sendMail({ from: smtpConfig.fromEmail || smtpConfig.user, to: smtpConfig.toEmail, subject: emailSubject, html: emailHtml, }); return res.json({ success: true, message: 'Email sent successfully via SMTP' }); } catch (error: any) { console.error('SMTP Email Send Error:', error); return res.status(500).json({ error: 'SMTP Connection failed', details: error.message, message: 'Failed to send email via SMTP post-deployment. Please verify your host, user, and password inside smtp-config.json.' }); } }); // Vite middleware setup if (process.env.NODE_ENV !== 'production') { const vite = await createViteServer({ server: { middlewareMode: true }, appType: 'spa', }); app.use(vite.middlewares); } else { const distPath = path.join(process.cwd(), 'dist'); app.use(express.static(distPath)); app.get('*', (req, res) => { res.sendFile(path.join(distPath, 'index.html')); }); } app.listen(PORT, '0.0.0.0', () => { console.log(`LiteCharms full-stack application running on http://localhost:${PORT}`); }); } startServer();