From 93e245d3b9bf877b8478bfb8bfb3b68b8f39d3fa Mon Sep 17 00:00:00 2001 From: Maaxxs <61059039+MaaxxsDev@users.noreply.github.com> Date: Tue, 7 Jul 2026 01:35:54 +0200 Subject: [PATCH] Add SMTP debug logging and from/username mismatch warning to mail test "Connection successful" only means the SMTP server accepted the message, not that it was delivered. The test endpoint now captures the full SMTP protocol exchange and shows it in the admin UI, plus flags the common case where the sender address differs from the SMTP login - many providers silently discard mail in that situation. Co-Authored-By: Claude Sonnet 5 --- .../pages/admin/settings/EmailSettings.jsx | 23 ++++++++++++++++-- .../Controllers/MailSettingsController.php | 24 ++++++++++++++++--- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/hifi-src/src/pages/admin/settings/EmailSettings.jsx b/hifi-src/src/pages/admin/settings/EmailSettings.jsx index 686bf8f..03c0ebe 100644 --- a/hifi-src/src/pages/admin/settings/EmailSettings.jsx +++ b/hifi-src/src/pages/admin/settings/EmailSettings.jsx @@ -58,6 +58,8 @@ export default function EmailSettings() { const [testBusy, setTestBusy] = useState(false); const [testError, setTestError] = useState(''); const [testSuccess, setTestSuccess] = useState(''); + const [testWarning, setTestWarning] = useState(''); + const [testLog, setTestLog] = useState(null); useEffect(() => { api @@ -95,9 +97,13 @@ export default function EmailSettings() { setTestBusy(true); setTestError(''); setTestSuccess(''); + setTestWarning(''); + setTestLog(null); try { const res = await api.post('/settings/mail/test', form); - setTestSuccess(`Testmail gesendet an ${res.sent_to}.`); + setTestSuccess(`Testmail gesendet an ${res.sent_to}. Der Server hat die Mail angenommen - prüfe auch den Spam-Ordner, das ist noch keine Garantie für die Zustellung.`); + setTestWarning(res.warning || ''); + setTestLog(res.smtp_log || null); } catch (err) { setTestError(err.message); } finally { @@ -201,8 +207,13 @@ export default function EmailSettings() {
- {testError &&

{testError}

} + {testError &&

{testError}

} {testSuccess &&

{testSuccess}

} + {testWarning && ( +

+ {testWarning} +

+ )} + {testLog && testLog.length > 0 && ( +
+ SMTP-Protokoll anzeigen +
+                {testLog.join('\n')}
+              
+
+ )}
diff --git a/hifi/api/src/Controllers/MailSettingsController.php b/hifi/api/src/Controllers/MailSettingsController.php index 315707c..488df9e 100644 --- a/hifi/api/src/Controllers/MailSettingsController.php +++ b/hifi/api/src/Controllers/MailSettingsController.php @@ -111,24 +111,42 @@ class MailSettingsController Http::error('Empfaenger-E-Mail (Benachrichtigungs- oder Absenderadresse) ist ungueltig', 422); } + $username = trim($body['mail_username'] ?? ''); + $debugLog = []; + try { $mail = Mailer::build([ 'host' => $host, 'port' => $body['mail_port'] ?? 587, - 'username' => trim($body['mail_username'] ?? ''), + 'username' => $username, 'password' => $password, 'encryption' => trim($body['mail_encryption'] ?? '') ?: 'tls', 'from_email' => $fromEmail, 'from_name' => trim($body['mail_from_name'] ?? '') ?: 'HifiPlanet', ]); + // Volles SMTP-Protokoll mitschneiden, damit bei "Verbindung ok, aber nichts kommt an" + // sichtbar wird, was der Server nach dem DATA-Befehl tatsaechlich geantwortet hat + // (z.B. eine 250-Bestaetigung, obwohl die Mail spaeter serverseitig verworfen wird). + $mail->SMTPDebug = 2; + $mail->Debugoutput = function ($str) use (&$debugLog) { + $debugLog[] = trim(preg_replace('/\s+/', ' ', $str)); + }; $mail->addAddress($target); $mail->Subject = 'Testmail von HifiPlanet'; $mail->Body = "Diese Testmail bestaetigt, dass deine SMTP-Einstellungen funktionieren."; $mail->send(); } catch (\Throwable $e) { - Http::error('Test fehlgeschlagen: ' . $e->getMessage(), 422); + Http::error('Test fehlgeschlagen: ' . $e->getMessage() . "\n\nSMTP-Protokoll:\n" . implode("\n", $debugLog), 422); } - Http::send(['ok' => true, 'sent_to' => $target]); + $warning = null; + if ($username !== '' && strcasecmp($username, $fromEmail) !== 0) { + $warning = 'Hinweis: Absender-E-Mail ("' . $fromEmail . '") und Benutzername ("' . $username . '") sind ' + . 'unterschiedlich. Viele Mail-Provider akzeptieren die Mail dann zwar (siehe SMTP-Protokoll), ' + . 'verwerfen sie aber im Anschluss ohne Fehlermeldung. Am sichersten ist es, die Absender-E-Mail ' + . 'identisch zum SMTP-Benutzernamen zu setzen.'; + } + + Http::send(['ok' => true, 'sent_to' => $target, 'warning' => $warning, 'smtp_log' => $debugLog]); } }