M3 Mailversand und Public-Landingpage vorbereiten

- Mail-Transport fuer Reset- und Verifizierungslinks ergaenzen
- Public-Landingpage mit Hero-Asset und App-CTAs bauen
- Mail-Flow-Test, Smoke-Abdeckung und SaaS-Doku aktualisieren
This commit is contained in:
2026-07-13 20:38:01 +02:00
parent 9f2e1bdfb1
commit b0e21bbb0a
12 changed files with 462 additions and 20 deletions
+68
View File
@@ -0,0 +1,68 @@
<?php
declare(strict_types=1);
require __DIR__ . '/../app/saas-mail.php';
function mail_check_assert(string $label, bool $condition, array &$failures, int &$passes): void
{
if ($condition) {
$passes++;
echo "PASS {$label}\n";
return;
}
$failures[] = $label;
echo "FAIL {$label}\n";
}
$logDir = APP_ROOT . '/var/test-mail';
if (!is_dir($logDir)) {
mkdir($logDir, 0700, true);
}
foreach (glob($logDir . '/*.txt') ?: [] as $file) {
unlink($file);
}
putenv('APP_MAIL_TRANSPORT=log');
putenv('APP_MAIL_LOG_DIR=' . $logDir);
putenv('APP_BASE_URL=https://app.example.test');
putenv('APP_MAIL_FROM=noreply@example.test');
putenv('APP_MAIL_FROM_NAME=Kaffeeliste Test');
$failures = [];
$passes = 0;
$reset = saas_send_password_reset_mail('mail-flow@test.local', str_repeat('a', 64));
mail_check_assert('password reset mail logs successfully', $reset['ok'] === true, $failures, $passes);
mail_check_assert('password reset mail file exists', isset($reset['path']) && is_file($reset['path']), $failures, $passes);
if (isset($reset['path']) && is_file($reset['path'])) {
$content = file_get_contents($reset['path']) ?: '';
mail_check_assert('password reset mail contains app url', str_contains($content, 'https://app.example.test/passwort-zuruecksetzen.php?token='), $failures, $passes);
}
$verification = saas_send_email_verification_mail('mail-flow@test.local', str_repeat('b', 64));
mail_check_assert('email verification mail logs successfully', $verification['ok'] === true, $failures, $passes);
mail_check_assert('email verification mail file exists', isset($verification['path']) && is_file($verification['path']), $failures, $passes);
if (isset($verification['path']) && is_file($verification['path'])) {
$content = file_get_contents($verification['path']) ?: '';
mail_check_assert('email verification mail contains app url', str_contains($content, 'https://app.example.test/email-verifizieren.php?token='), $failures, $passes);
}
$invalid = saas_send_mail('not-an-email', 'Test', 'Body');
mail_check_assert('invalid recipient is rejected', $invalid['ok'] === false, $failures, $passes);
foreach (glob($logDir . '/*.txt') ?: [] as $file) {
unlink($file);
}
if ($failures !== []) {
echo "\nM3 mail flow check failed with " . count($failures) . " failure(s):\n";
foreach ($failures as $failure) {
echo "- {$failure}\n";
}
exit(1);
}
echo "\nM3 mail flow check passed with {$passes} assertions.\n";