From d66ff29b3e04404c8c9ce6c6dcc85bcae9c904d2 Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 3 Jul 2025 16:37:37 +0200 Subject: [PATCH] Add email service with queue processing --- backend/src/services/emailService.js | 65 ++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 backend/src/services/emailService.js diff --git a/backend/src/services/emailService.js b/backend/src/services/emailService.js new file mode 100644 index 0000000..7ec83b5 --- /dev/null +++ b/backend/src/services/emailService.js @@ -0,0 +1,65 @@ +const nodemailer = require('nodemailer'); +const { db } = require('../database/db'); +const { emailTemplates } = require('./emailTemplates'); +const logger = require('../utils/logger'); + +// Create transporter +const transporter = nodemailer.createTransport({ + host: process.env.SMTP_HOST, + port: process.env.SMTP_PORT, + secure: process.env.SMTP_SECURE === 'true', + auth: { + user: process.env.SMTP_USER, + pass: process.env.SMTP_PASS + } +}); + +async function sendEmail(to, type, data) { + try { + const template = emailTemplates[type](data); + + const info = await transporter.sendMail({ + from: process.env.EMAIL_FROM, + to: to, + subject: template.subject, + html: template.html, + text: template.text + }); + + logger.info(`Email sent: ${info.messageId}`); + return info; + } catch (error) { + logger.error('Error sending email:', error); + throw error; + } +} + +// Process email queue +async function processEmailQueue() { + const pendingEmails = await db('email_queue') + .where('status', 'pending') + .where('retry_count', '<', 3) + .limit(10); + + for (const email of pendingEmails) { + try { + const emailData = JSON.parse(email.email_data); + await sendEmail(email.recipient_email, email.email_type, emailData); + + await db('email_queue').where('id', email.id).update({ + status: 'sent', + sent_at: new Date() + }); + } catch (error) { + await db('email_queue').where('id', email.id).update({ + retry_count: email.retry_count + 1, + error_message: error.message + }); + } + } +} + +// Start email queue processor +setInterval(processEmailQueue, 60000); // Process every minute + +module.exports = { sendEmail, processEmailQueue };