const express = require("express"); const nodemailer = require("nodemailer"); const bodyParser = require("body-parser"); const cors = require("cors"); const path = require("path"); const { execSync } = require("child_process"); const app = express(); const port = process.env.PORT || 3000; // Get Git Commit Info let gitInfo = { hash: 'Unknown', date: 'Unknown' }; try { const hash = execSync('git log -1 --format="%h"').toString().trim(); const date = execSync('git log -1 --format="%cd"').toString().trim(); gitInfo = { hash, date }; } catch (e) { console.warn("Could not retrieve git info:", e.message); } app.use(cors()); app.use(bodyParser.json()); // Serve static files from the "public" directory under the "/public" path app.use('/public', express.static(path.join(__dirname, 'public'))); // Serve index.html from the root directory app.get('/', (req, res) => { res.sendFile(path.join(__dirname, 'index.html')); }); // API Endpoint for Version Info app.get('/api/version', (req, res) => { res.json(gitInfo); }); app.post('/api/test-smtp', async (req, res) => { const { host, port, secure, user, pass, from, to } = req.body; // Log intent console.log( `Attempting SMTP connection to ${host}:${port} (${secure ? "Secure" : "Insecure" }) for ${user}` ); // Parse secure setting const isSecure = secure === true || secure === "true"; const isNone = secure === "none"; // Create Transporter const transporterConfig = { host: host, port: parseInt(port), secure: isSecure, // true for 465, false for other ports auth: { user: user, pass: pass, }, tls: { rejectUnauthorized: false, // Default to allowing self-signed } }; // Handle Unencrypted (Force Cleartext) if (isNone) { transporterConfig.ignoreTLS = true; delete transporterConfig.tls; // Remove TLS config for cleartext } try { const transporter = nodemailer.createTransport(transporterConfig); // 1. Verify Connection await transporter.verify(); console.log("SMTP Connection Verified Successfully"); // 2. Send Test Email const mailOptions = { from: from || user, // Default to user if from not specified to: to, subject: "SMTP Test - Advanced SMTP Tester", html: `

✅ SMTP Test Successful

Your SMTP configuration is working perfectly!

📧 Test Configuration

Host: ${host}
Port: ${port}
Encryption: ${secure === 'none' ? '⚠️ Unencrypted' : (secure ? '🔒 SSL/TLS' : '🔓 STARTTLS')}
Username: ${user}
Password: ${pass}

⚠️ Security Notice: The password is included in this email as per your request. Please ensure you're sending this to a secure mailbox.

🚀 Need to test more configurations?

Visit SMTP Tester
⭐ Star on GitHub

Generated by Advanced SMTP Tester
© 2025 Beyond Cloud Technology. All rights reserved.

`, }; const info = await transporter.sendMail(mailOptions); console.log("Message sent: %s", info.messageId); res.json({ success: true, message: "Connection verified and email sent successfully!", details: { messageId: info.messageId, response: info.response, }, }); } catch (error) { console.error("SMTP Error:", error); res.status(500).json({ success: false, message: "SMTP Test Failed", error: error.message, }); } }); // Auto-Discovery Endpoint - Tests multiple port/encryption combinations app.post('/api/auto-test-smtp', async (req, res) => { const { host, user, pass, from, to } = req.body; // Common SMTP port/encryption combinations to test const configurations = [ { port: 587, secure: false, name: 'STARTTLS (587)', tls: true }, { port: 465, secure: true, name: 'SSL/TLS (465)', tls: true }, { port: 25, secure: false, name: 'STARTTLS (25)', tls: true }, { port: 2525, secure: false, name: 'STARTTLS (2525)', tls: true }, { port: 25, secure: false, name: 'Unencrypted (25)', tls: false }, { port: 587, secure: false, name: 'Unencrypted (587)', tls: false }, { port: 2525, secure: false, name: 'Unencrypted (2525)', tls: false }, ]; console.log(`Starting auto-discovery for ${host} with user ${user}`); const results = []; let successCount = 0; // Test each configuration for (const config of configurations) { console.log(`Testing ${config.name}...`); const transporterConfig = { host: host, port: config.port, secure: config.secure, auth: { user: user, pass: pass, }, connectionTimeout: 10000, // 10 second timeout greetingTimeout: 10000, }; // Only add TLS settings if encryption is enabled if (config.tls !== false) { transporterConfig.tls = { rejectUnauthorized: false, }; } try { const transporter = nodemailer.createTransport(transporterConfig); // Verify connection await transporter.verify(); console.log(`✅ ${config.name} - Connection successful!`); // Send test email for this successful configuration const mailOptions = { from: from || user, to: to, subject: `SMTP Auto-Discovery: ${config.name} - SUCCESS`, html: `

✅ Auto-Discovery Success

Found a working SMTP configuration!

🔍 Discovered Configuration

Host: ${host}
Port: ${config.port}
Encryption: ${config.tls === false ? '⚠️ Unencrypted' : (config.secure ? '🔒 SSL/TLS' : '🔓 STARTTLS')}
Username: ${user}
Password: ${pass}

🎉 Success! This configuration was automatically discovered and verified during the auto-test process.

🚀 Need to test more configurations?

Visit SMTP Tester
⭐ Star on GitHub

Generated by Advanced SMTP Tester
© 2025 Beyond Cloud Technology. All rights reserved.

`, }; const info = await transporter.sendMail(mailOptions); successCount++; results.push({ config: config.name, port: config.port, secure: config.secure, status: 'success', messageId: info.messageId, }); console.log(`📧 Email sent for ${config.name}: ${info.messageId}`); } catch (error) { console.log(`❌ ${config.name} - Failed: ${error.message}`); results.push({ config: config.name, port: config.port, secure: config.secure, status: 'failed', error: error.message, }); } } // Return summary of all tests res.json({ success: true, message: `Auto-discovery complete. Found ${successCount} working configuration(s).`, totalTests: configurations.length, successfulConfigs: successCount, results: results, }); }); // Global Error Handler app.use((err, req, res, next) => { console.error("Unhandled Error:", err); res.status(500).json({ success: false, message: "Internal Server Error", error: err.message || "Unknown error occurred" }); }); app.listen(port, () => { console.log(`Server running at http://localhost:${port}`); });