Add password reset functionality and SMTP mailer class

- Implemented reset-password.php for users to reset their passwords securely.
- Added validation for reset tokens and password strength checks.
- Created mailer.php to handle sending emails via SMTP, including password reset and invitation emails.
- Integrated responsive HTML email templates for better user experience.
This commit is contained in:
2026-09-10 09:57:53 +02:00
parent d4fd706eca
commit a7aad57e0b
10 changed files with 1248 additions and 5 deletions
+86
View File
@@ -136,6 +136,25 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$message = "AI Co-Pilot instellingen zijn succesvol opgeslagen.";
$messageType = 'success';
}
// 5. Test e-mail versturen via SMTP (Release v1.6)
elseif ($action === 'send_test_email') {
require_once __DIR__ . '/includes/mailer.php';
$testEmail = trim($_POST['test_email'] ?? '');
if (empty($testEmail) || !filter_var($testEmail, FILTER_VALIDATE_EMAIL)) {
$message = "Vul een geldig e-mailadres in om een test e-mail te sturen.";
$messageType = 'error';
} else {
$mailResult = FocizMailer::sendTestEmail($testEmail, $currentUser['name']);
if ($mailResult['success']) {
$message = "Test e-mail succesvol verzonden via mail.fociz.nl naar " . htmlspecialchars($testEmail) . "!";
$messageType = 'success';
} else {
$message = "Fout bij verzenden test e-mail via mail.fociz.nl: " . htmlspecialchars($mailResult['error'] ?? 'Onbekende fout');
$messageType = 'error';
}
}
}
}
// Haal actuele configuratie op
@@ -646,6 +665,73 @@ require_once __DIR__ . '/includes/header.php';
</div>
</form>
</div>
<!-- 5. SMTP Mail Server & Notificaties (Release v1.6) -->
<div class="fociz-card p-6 sm:p-7 space-y-6">
<div class="flex flex-col sm:flex-row sm:items-center justify-between gap-3 pb-4 border-b border-slate-100 dark:border-slate-800/80">
<div class="flex items-center space-x-3.5">
<div class="w-12 h-12 rounded-xl bg-indigo-50 dark:bg-indigo-950/40 border border-indigo-200 dark:border-indigo-800/60 flex items-center justify-center text-indigo-600 dark:text-indigo-400 font-bold shadow-xs">
<i data-lucide="mail" class="w-6 h-6"></i>
</div>
<div>
<h2 class="text-lg font-bold text-slate-900 dark:text-white tracking-tight">SMTP Mail Server & Notificaties</h2>
<p class="text-xs text-slate-500 dark:text-slate-400">Uitgaande e-mailserver voor wachtwoord-vergeten, uitnodigingen en notificaties</p>
</div>
</div>
<span class="px-2.5 py-1 rounded-full bg-teal-50 dark:bg-teal-950/40 text-teal-700 dark:text-teal-400 border border-teal-200 dark:border-teal-800/60 text-xs font-bold self-start sm:self-auto">
mail.fociz.nl:587 • Actief
</span>
</div>
<!-- Configuratie Overzicht -->
<div class="grid grid-cols-1 sm:grid-cols-2 gap-3 text-xs">
<div class="p-3.5 rounded-xl bg-slate-50 dark:bg-[#0c0f17] border border-slate-200 dark:border-slate-800/80 flex justify-between items-center">
<span class="text-slate-500 dark:text-slate-400">SMTP Host & Poort:</span>
<span class="font-mono font-bold text-slate-900 dark:text-white"><?= htmlspecialchars(defined('SMTP_HOST') ? SMTP_HOST : 'mail.fociz.nl') ?>:<?= htmlspecialchars((string)(defined('SMTP_PORT') ? SMTP_PORT : 587)) ?> (STARTTLS)</span>
</div>
<div class="p-3.5 rounded-xl bg-slate-50 dark:bg-[#0c0f17] border border-slate-200 dark:border-slate-800/80 flex justify-between items-center">
<span class="text-slate-500 dark:text-slate-400">SMTP Gebruiker:</span>
<span class="font-mono font-bold text-slate-900 dark:text-white"><?= htmlspecialchars(defined('SMTP_USER') ? SMTP_USER : 'info@fociz.nl') ?></span>
</div>
<div class="p-3.5 rounded-xl bg-slate-50 dark:bg-[#0c0f17] border border-slate-200 dark:border-slate-800/80 flex justify-between items-center">
<span class="text-slate-500 dark:text-slate-400">Zichtbare Afzender (From):</span>
<span class="font-semibold text-slate-900 dark:text-white"><?= htmlspecialchars(defined('SMTP_FROM_NAME') ? SMTP_FROM_NAME : 'Fociz') ?> &lt;<?= htmlspecialchars(defined('SMTP_FROM_EMAIL') ? SMTP_FROM_EMAIL : 'no-reply@fociz.nl') ?>&gt;</span>
</div>
<div class="p-3.5 rounded-xl bg-slate-50 dark:bg-[#0c0f17] border border-slate-200 dark:border-slate-800/80 flex justify-between items-center">
<span class="text-slate-500 dark:text-slate-400">Antwoordadres (Reply-To):</span>
<span class="font-semibold text-slate-900 dark:text-white"><?= htmlspecialchars(defined('SMTP_REPLY_TO') ? SMTP_REPLY_TO : 'info@fociz.nl') ?></span>
</div>
</div>
<!-- Test E-mail Versturen Formulier -->
<div class="pt-2 border-t border-slate-100 dark:border-slate-800/80">
<h3 class="text-xs font-bold text-slate-800 dark:text-slate-200 mb-2 flex items-center space-x-1.5">
<i data-lucide="send" class="w-3.5 h-3.5 text-indigo-500"></i>
<span>Directe SMTP Verbindingstest</span>
</h3>
<p class="text-[11px] text-slate-500 dark:text-slate-400 mb-3">
Verstuur een realtime testmail met het Fociz HTML-sjabloon om de verbinding, STARTTLS-handshake en aflevering direct te verifiëren.
</p>
<form method="POST" action="/admin.php" class="flex flex-col sm:flex-row gap-2.5">
<input type="hidden" name="action" value="send_test_email">
<div class="relative flex-1">
<input
type="email"
name="test_email"
required
value="<?= htmlspecialchars($currentUser['email'] ?? '') ?>"
placeholder="test.ontvanger@bedrijf.nl"
class="w-full bg-slate-50 dark:bg-[#0c0f17] border border-slate-300 dark:border-slate-800 rounded-xl px-3.5 py-2.5 text-slate-900 dark:text-white text-xs placeholder-slate-400 focus:outline-none focus:ring-1 focus:ring-indigo-500"
>
</div>
<button type="submit" class="px-5 py-2.5 rounded-xl bg-indigo-600 hover:bg-indigo-500 text-white text-xs font-bold transition shadow-xs flex items-center justify-center space-x-2 cursor-pointer flex-shrink-0">
<i data-lucide="send" class="w-3.5 h-3.5"></i>
<span>Testmail Verzenden</span>
</button>
</form>
</div>
</div>
</div>
<!-- Rechterkolom: Systeem & Team Monitor (4 cols) -->