feat: system logs - email log + system log with admin UI
- db: email_logs (sent/failed) + system_logs (info/warn/error) tables, auto-migrated for existing installs - backend/logger.js: logEmail/logSystem with try/catch (never breaks flow) - mailer: log send result (SMTP unconfigured/sent/failed + error msg) - webhook: log blocked-internal, non-2xx response, send failure - server: error middleware records 500 errors to system_logs - routes/logs.js: GET /logs/emails + /logs/system (admin/owner, filters) - UI: 系统日志 page (owner/admin) with system/email tabs + filters - API docs updated
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
const nodemailer = require('nodemailer');
|
||||
const { getPool, query, getRow, getConfig } = require('./db');
|
||||
const { logEmail, logSystem } = require('./logger');
|
||||
|
||||
async function getSmtpConfig() {
|
||||
try {
|
||||
@@ -56,16 +57,21 @@ function getTransporter(cfg) {
|
||||
async function sendEmail(to, templateCode, vars) {
|
||||
try {
|
||||
const cfg = await getSmtpConfig();
|
||||
if (!cfg.host || !cfg.user) { console.log('[Mailer] SMTP未配置'); return false; }
|
||||
if (!cfg.host || !cfg.user) { console.log('[Mailer] SMTP未配置'); await logSystem('warn', 'mailer', 'SMTP未配置,邮件未发送', { to, template: templateCode }); return false; }
|
||||
const template = await getTemplate(templateCode);
|
||||
if (!template) { console.log('[Mailer] 模板不存在:', templateCode); return false; }
|
||||
if (!template) { console.log('[Mailer] 模板不存在:', templateCode); await logEmail(to, templateCode, '', 'failed', '模板不存在: ' + templateCode); return false; }
|
||||
const siteName = await getSiteName();
|
||||
const allVars = { ...vars, site_name: siteName, site_url: await getSiteUrl() };
|
||||
const { subject, body } = renderTemplate(template, allVars);
|
||||
const transporter = getTransporter(cfg);
|
||||
await transporter.sendMail({ from: `"${siteName}" <${cfg.from}>`, to, subject, html: body });
|
||||
await logEmail(to, templateCode, subject, 'sent');
|
||||
return true;
|
||||
} catch (err) { console.error('[Mailer]', err.message); return false; }
|
||||
} catch (err) {
|
||||
console.error('[Mailer]', err.message);
|
||||
await logEmail(to, templateCode, '', 'failed', err.message);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { sendEmail, renderTemplate, getTemplate, getSmtpConfig, getSiteName, getSiteUrl };
|
||||
|
||||
Reference in New Issue
Block a user