feat: MC Report System - MySQL + Express + Vanilla JS SPA
This commit is contained in:
59
backend/mailer.js
Normal file
59
backend/mailer.js
Normal file
@@ -0,0 +1,59 @@
|
||||
const nodemailer = require('nodemailer');
|
||||
const { getPool, query, getRow, getConfig } = require('./db');
|
||||
|
||||
async function getSmtpConfig() {
|
||||
try {
|
||||
const rows = await query("SELECT k, v FROM settings WHERE k LIKE 'smtp_%'");
|
||||
const cfg = {};
|
||||
for (const r of rows) cfg[r.k] = r.v;
|
||||
return {
|
||||
host: cfg.smtp_host || '',
|
||||
port: parseInt(cfg.smtp_port) || 587,
|
||||
secure: cfg.smtp_secure === '1',
|
||||
user: cfg.smtp_user || '',
|
||||
pass: cfg.smtp_pass || '',
|
||||
from: cfg.smtp_from || 'noreply@example.com',
|
||||
};
|
||||
} catch { return { host: '', port: 587, secure: false, user: '', pass: '', from: '' }; }
|
||||
}
|
||||
|
||||
async function getSiteName() {
|
||||
const row = await getRow("SELECT v FROM settings WHERE k = 'site_name'");
|
||||
return row ? row.v : 'MC举报系统';
|
||||
}
|
||||
|
||||
async function getSiteUrl() {
|
||||
const row = await getRow("SELECT v FROM settings WHERE k = 'site_url'");
|
||||
return row ? row.v : 'http://localhost:3100';
|
||||
}
|
||||
|
||||
async function getTemplate(code) {
|
||||
return getRow('SELECT * FROM email_templates WHERE code = ?', [code]);
|
||||
}
|
||||
|
||||
function renderTemplate(template, vars) {
|
||||
let { subject, body } = template;
|
||||
for (const [k, v] of Object.entries(vars)) {
|
||||
const re = new RegExp(`\\{\\{${k}\\}\\}`, 'g');
|
||||
subject = subject.replace(re, v || '');
|
||||
body = body.replace(re, v || '');
|
||||
}
|
||||
return { subject, body };
|
||||
}
|
||||
|
||||
async function sendEmail(to, templateCode, vars) {
|
||||
try {
|
||||
const cfg = await getSmtpConfig();
|
||||
if (!cfg.host || !cfg.user) { console.log('[Mailer] SMTP未配置'); return false; }
|
||||
const template = await getTemplate(templateCode);
|
||||
if (!template) { console.log('[Mailer] 模板不存在:', templateCode); return false; }
|
||||
const allVars = { ...vars, site_name: await getSiteName(), site_url: await getSiteUrl() };
|
||||
const { subject, body } = renderTemplate(template, allVars);
|
||||
|
||||
const transporter = nodemailer.createTransport({ host: cfg.host, port: cfg.port, secure: cfg.secure, auth: { user: cfg.user, pass: cfg.pass } });
|
||||
await transporter.sendMail({ from: `"${await getSiteName()}" <${cfg.from}>`, to, subject, html: body });
|
||||
return true;
|
||||
} catch (err) { console.error('[Mailer]', err.message); return false; }
|
||||
}
|
||||
|
||||
module.exports = { sendEmail, renderTemplate, getTemplate, getSmtpConfig, getSiteName, getSiteUrl };
|
||||
Reference in New Issue
Block a user