Changeset ca507ef in Klonkt for src/routes


Ignore:
Timestamp:
06/19/2026 08:29:28 AM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
7eb35ae
Parents:
977f65d
Message:

feat: SMTP configurable via Admin → Settings (app_settings, env fallback) + test email

  • config/mailer.js: reads SMTP from app_settings (smtp_host/port/user/pass/from), with env as fallback; transport rebuilds automatically on change (no restart needed); mailerStatus() for the UI (without leaking the password).
  • admin-settings: POST /smtp (save; password only updated when a new value is given; clear) + POST /smtp/test (test email). GET includes smtp status.
  • admin-settings.ejs: Email (SMTP) card with host/port/user/pass/from + save/ clear + test-email button (only shown when configured).

Once SMTP is filled in, newsletter sending, show-notify and double opt-in work.

Co-Authored-By: Claude <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/admin-settings.js

    r977f65d rca507ef  
    2222import { requireGod } from '../middleware/auth.js';
    2323import { getTenancy, setTenancy, getSetting, setSetting } from '../services/SettingsService.js';
     24import { mailerStatus, sendMail } from '../config/mailer.js';
    2425import { entitlementStatus, premiumUnlocked } from '../services/PatreonService.js';
    2526import { googleConfigured, redirectUri, currentClientId, clientSecretSet } from '../config/google.js';
     
    8384      secretSet: clientSecretSet(),
    8485    },
     86    smtp: mailerStatus(),
    8587    success: req.query.success || null,
    8688    error: req.query.error || null,
     
    151153});
    152154
     155// ── SMTP / e-mail-instellingen ────────────────────────────────────
     156router.post('/smtp', requireGod, (req, res) => {
     157  const b = req.body || {};
     158  if (b.clear === '1') {
     159    ['smtp_host', 'smtp_port', 'smtp_user', 'smtp_pass', 'smtp_from'].forEach((k) => setSetting(k, ''));
     160    return res.redirect('/admin/settings?success=' + encodeURIComponent('SMTP-instellingen gewist'));
     161  }
     162  setSetting('smtp_host', (b.smtp_host || '').toString().trim());
     163  setSetting('smtp_port', (b.smtp_port || '').toString().trim());
     164  setSetting('smtp_user', (b.smtp_user || '').toString().trim());
     165  setSetting('smtp_from', (b.smtp_from || '').toString().trim());
     166  // Wachtwoord alleen overschrijven als er een nieuwe waarde is ingevoerd.
     167  const pass = (b.smtp_pass || '').toString();
     168  if (pass) setSetting('smtp_pass', pass);
     169  res.redirect('/admin/settings?success=' + encodeURIComponent('SMTP-instellingen opgeslagen'));
     170});
     171
     172// Testmail sturen naar een opgegeven adres (of de ingelogde gebruiker).
     173router.post('/smtp/test', requireGod, async (req, res) => {
     174  const to = ((req.body && req.body.to) || (req.session.user && req.session.user.email) || '').toString().trim();
     175  if (!to || to.indexOf('@') === -1) {
     176    return res.redirect('/admin/settings?error=' + encodeURIComponent('Geef een geldig test-e-mailadres op.'));
     177  }
     178  try {
     179    await sendMail({
     180      to,
     181      subject: 'Klonkt — SMTP-test',
     182      text: 'Gelukt! Je SMTP-instellingen werken. Dit is een testbericht van je Klonkt-site.',
     183      html: '<p>Gelukt! Je <strong>SMTP-instellingen werken</strong>. Dit is een testbericht van je Klonkt-site.</p>',
     184    });
     185    res.redirect('/admin/settings?success=' + encodeURIComponent('Testmail verstuurd naar ' + to));
     186  } catch (e) {
     187    res.redirect('/admin/settings?error=' + encodeURIComponent('Testmail mislukt: ' + (e.message || e)));
     188  }
     189});
     190
    153191export default router;
Note: See TracChangeset for help on using the changeset viewer.