66 lines
1.7 KiB
JavaScript
66 lines
1.7 KiB
JavaScript
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 };
|