69 lines
2.1 KiB
JavaScript
69 lines
2.1 KiB
JavaScript
const nodemailer = require('nodemailer');
|
|
const { Pool } = require('pg');
|
|
|
|
const pgPool = new Pool({
|
|
host: process.env.PGHOST || 'postgres',
|
|
port: process.env.PGPORT || 5432,
|
|
user: process.env.PGUSER || 'postgres',
|
|
password: process.env.PGPASSWORD || 'postgres',
|
|
database: process.env.PGDATABASE || 'ckqr',
|
|
});
|
|
|
|
// Helper to fetch SMTP settings from the database
|
|
async function getSmtpSettings() {
|
|
const result = await pgPool.query("SELECT key, value FROM app_settings WHERE category = 'smtp'");
|
|
const settings = {};
|
|
result.rows.forEach(row => {
|
|
settings[row.key] = row.value;
|
|
});
|
|
return settings;
|
|
}
|
|
|
|
// Helper to create and configure a transporter
|
|
async function getTransporter() {
|
|
const settings = await getSmtpSettings();
|
|
|
|
return nodemailer.createTransport({
|
|
host: settings.smtp_host || 'smtp.office365.com',
|
|
port: parseInt(settings.smtp_port) || 587,
|
|
secure: settings.smtp_secure === 'true', // true for 465, false for other ports
|
|
auth: {
|
|
user: settings.smtp_user,
|
|
pass: settings.smtp_pass,
|
|
},
|
|
tls: {
|
|
ciphers: 'SSLv3', // sometimes required for Office365
|
|
rejectUnauthorized: false
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Sends an email using dynamic SMTP settings from the DB.
|
|
*
|
|
* @param {string} to - Recipient email address
|
|
* @param {string} subject - Email subject
|
|
* @param {string} html - HTML body of the email
|
|
*/
|
|
async function sendMail(to, subject, html) {
|
|
const settings = await getSmtpSettings();
|
|
const transporter = await getTransporter();
|
|
|
|
const mailOptions = {
|
|
from: `"CK-QR Support" <${settings.smtp_user}>`,
|
|
to: to,
|
|
subject: subject,
|
|
html: html
|
|
};
|
|
|
|
try {
|
|
const info = await transporter.sendMail(mailOptions);
|
|
console.log('Message sent: %s', info.messageId);
|
|
return { success: true, messageId: info.messageId };
|
|
} catch (error) {
|
|
console.error('Error sending email:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
module.exports = { sendMail, getSmtpSettings }; |