Files
korrithwebsite/apps/api/src/utils/mailService.js
T

73 lines
2.0 KiB
JavaScript

import 'dotenv/config';
import nodemailer from 'nodemailer';
import logger from './logger.js';
const FROM_EMAIL = process.env.MAIL_FROM || 'smtp@korrith.com';
const REPLY_TO_EMAIL = process.env.MAIL_REPLY_TO || 'noreply@korrith.com';
const smtpPort = parseInt(process.env.SMTP_PORT, 10) || 587;
// Initialize nodemailer transporter with SMTP credentials
const transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST,
port: smtpPort,
secure: smtpPort === 465, // SSL on port 465, STARTTLS otherwise (e.g. 587)
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASSWORD,
},
});
/**
* Send email using nodemailer with SMTP
* @param {string|string[]} to - Recipient email address(es)
* @param {string} subject - Email subject
* @param {string} htmlBody - HTML email body
* @returns {Promise<Object>} - Mail service response
* @throws {Error} - If email sending fails
*/
async function sendEmail(to, subject, htmlBody) {
const recipients = Array.isArray(to) ? to : [to];
logger.info('Attempting to send email via SMTP', {
recipients: recipients.join(', '),
subject,
from: FROM_EMAIL,
timestamp: new Date().toISOString()
});
try {
const mailOptions = {
from: FROM_EMAIL,
to: recipients.join(', '),
subject,
html: htmlBody,
replyTo: REPLY_TO_EMAIL,
};
const result = await transporter.sendMail(mailOptions);
logger.info('Email sent successfully via SMTP', {
recipients: recipients.join(', '),
subject,
from: FROM_EMAIL,
messageId: result.messageId,
timestamp: new Date().toISOString()
});
return result;
} catch (error) {
logger.error('Email send failed', {
recipients: recipients.join(', '),
subject,
from: FROM_EMAIL,
errorMessage: error.message,
timestamp: new Date().toISOString()
});
throw new Error(`SMTP email error: ${error.message}`);
}
}
export { sendEmail };
export default sendEmail;