From 5e5e98601f1fd5cf3abe8e9495498d30179e5843 Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 14 Jul 2025 12:04:26 +0200 Subject: [PATCH] fix: improve email test endpoint error handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add detailed validation for SMTP configuration - Add specific error messages for common SMTP issues (connection, auth, network) - Add logging to help debug email configuration issues - Check for masked passwords that shouldn't be used for sending - Parse smtp_port as integer and handle boolean smtp_secure properly This helps identify the exact cause of email sending failures instead of generic 500 errors. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- backend/src/routes/adminEmail.js | 61 +++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/backend/src/routes/adminEmail.js b/backend/src/routes/adminEmail.js index 7fe7ed7..fcfcd84 100644 --- a/backend/src/routes/adminEmail.js +++ b/backend/src/routes/adminEmail.js @@ -112,17 +112,44 @@ router.post('/test', adminAuth, async (req, res) => { return res.status(400).json({ error: 'Email configuration not found. Please configure SMTP settings first.' }); } - // Create transporter - const transporter = nodemailer.createTransport({ + // Validate SMTP configuration + if (!config.smtp_host || !config.smtp_port) { + return res.status(400).json({ + error: 'Incomplete email configuration', + details: 'SMTP host and port are required' + }); + } + + // Check if password might be masked (this shouldn't happen when fetching from DB) + if (config.smtp_pass === '********') { + return res.status(400).json({ + error: 'Invalid email configuration', + details: 'SMTP password appears to be masked. Please reconfigure your email settings.' + }); + } + + // Create transporter with detailed logging + const transportConfig = { host: config.smtp_host, - port: config.smtp_port, - secure: config.smtp_secure, - auth: config.smtp_user ? { + port: parseInt(config.smtp_port), + secure: config.smtp_secure === true || config.smtp_secure === 1, + auth: config.smtp_user && config.smtp_pass ? { user: config.smtp_user, pass: config.smtp_pass - } : undefined + } : undefined, + logger: process.env.NODE_ENV === 'development', + debug: process.env.NODE_ENV === 'development' + }; + + console.log('Creating email transporter with config:', { + host: transportConfig.host, + port: transportConfig.port, + secure: transportConfig.secure, + auth: transportConfig.auth ? 'configured' : 'none' }); + const transporter = nodemailer.createTransport(transportConfig); + // Send test email await transporter.sendMail({ from: `${config.from_name} <${config.from_email}>`, @@ -145,9 +172,27 @@ router.post('/test', adminAuth, async (req, res) => { res.json({ message: 'Test email sent successfully' }); } catch (error) { console.error('Test email error:', error); + console.error('Error stack:', error.stack); + + // Provide more specific error messages + let errorMessage = 'Failed to send test email'; + let details = error.message; + + if (error.code === 'ECONNREFUSED') { + errorMessage = 'Failed to connect to SMTP server'; + details = 'Please check your SMTP host and port settings'; + } else if (error.code === 'EAUTH') { + errorMessage = 'SMTP authentication failed'; + details = 'Please check your SMTP username and password'; + } else if (error.code === 'ESOCKET') { + errorMessage = 'Network error'; + details = 'Could not establish connection to SMTP server'; + } + res.status(500).json({ - error: 'Failed to send test email', - details: error.message + error: errorMessage, + details: details, + code: error.code }); } });