12345
This commit is contained in:
parent
bcdbd5300c
commit
fe7ebfad4d
99
admin.php
99
admin.php
@ -2,6 +2,7 @@
|
||||
session_start();
|
||||
require_once 'db/config.php';
|
||||
require_once 'includes/admin_auth.php';
|
||||
require_once 'includes/webinar_email.php';
|
||||
|
||||
admin_require_login();
|
||||
|
||||
@ -30,7 +31,7 @@ $records_per_page = 15;
|
||||
$page = isset($_GET['page']) && is_numeric($_GET['page']) ? max(1, (int) $_GET['page']) : 1;
|
||||
$selected_webinar_id = isset($_GET['webinar_id']) && is_numeric($_GET['webinar_id']) ? max(0, (int) $_GET['webinar_id']) : 0;
|
||||
|
||||
$webinars = $pdo->query('SELECT id, title, scheduled_at FROM webinars ORDER BY scheduled_at DESC, id DESC')->fetchAll(PDO::FETCH_ASSOC);
|
||||
$webinars = $pdo->query('SELECT id, title, description, presenter, scheduled_at FROM webinars ORDER BY scheduled_at DESC, id DESC')->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$where_parts = ['a.deleted_at IS NULL'];
|
||||
$params = [];
|
||||
@ -113,6 +114,17 @@ foreach ($webinars as $webinar) {
|
||||
}
|
||||
}
|
||||
|
||||
$preview_webinar = $selected_webinar ?? ($webinars[0] ?? null);
|
||||
$preview_email_payload = null;
|
||||
$preview_scope_note = null;
|
||||
|
||||
if ($preview_webinar) {
|
||||
$preview_email_payload = webinar_build_email_payload('there', $preview_webinar, true);
|
||||
$preview_scope_note = $selected_webinar
|
||||
? 'This preview matches the correction email for the selected webinar.'
|
||||
: 'Preview shows the correction email template for the most recent webinar. When "All webinars" is selected, each attendee still receives the version for their own webinar.';
|
||||
}
|
||||
|
||||
$chart_labels = json_encode(array_column($chart_data, 'registration_day'));
|
||||
$chart_values = json_encode(array_column($chart_data, 'user_count'));
|
||||
$export_link = 'export_csv.php' . ($selected_webinar_id > 0 ? '?webinar_id=' . urlencode((string) $selected_webinar_id) : '');
|
||||
@ -314,6 +326,50 @@ $export_link = 'export_csv.php' . ($selected_webinar_id > 0 ? '?webinar_id=' . u
|
||||
border-radius: 16px;
|
||||
margin-top: 1.2rem;
|
||||
}
|
||||
.email-preview-card {
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
.email-preview-badges {
|
||||
display: flex;
|
||||
gap: 0.55rem;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.email-preview-meta {
|
||||
display: grid;
|
||||
gap: 0.45rem;
|
||||
margin-bottom: 1rem;
|
||||
color: var(--text-soft);
|
||||
}
|
||||
.email-preview-frame-wrap {
|
||||
overflow: hidden;
|
||||
border-radius: 20px;
|
||||
border: 1px solid var(--line);
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
}
|
||||
.email-preview-frame {
|
||||
width: 100%;
|
||||
min-height: 920px;
|
||||
border: 0;
|
||||
background: #ffffff;
|
||||
}
|
||||
.email-text-details {
|
||||
margin-top: 1rem;
|
||||
}
|
||||
.email-text-details summary {
|
||||
cursor: pointer;
|
||||
font-weight: 700;
|
||||
color: var(--text-main);
|
||||
}
|
||||
.email-text-preview {
|
||||
margin: 0.85rem 0 0;
|
||||
padding: 1rem;
|
||||
border-radius: 16px;
|
||||
border: 1px solid var(--line);
|
||||
background: rgba(221, 226, 253, 0.08);
|
||||
color: var(--text-soft);
|
||||
white-space: pre-wrap;
|
||||
word-break: break-word;
|
||||
}
|
||||
code {
|
||||
color: var(--accent-soft, #bbc8fb);
|
||||
}
|
||||
@ -328,6 +384,9 @@ $export_link = 'export_csv.php' . ($selected_webinar_id > 0 ? '?webinar_id=' . u
|
||||
.form-control {
|
||||
min-width: 210px;
|
||||
}
|
||||
.email-preview-frame {
|
||||
min-height: 760px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
@ -360,13 +419,49 @@ $export_link = 'export_csv.php' . ($selected_webinar_id > 0 ? '?webinar_id=' . u
|
||||
<a href="admin.php" class="btn btn-outline-light">Reset</a>
|
||||
</div>
|
||||
</form>
|
||||
<div class="d-flex gap-2 flex-wrap">
|
||||
<div class="d-flex gap-2 flex-wrap align-items-start">
|
||||
<a href="<?php echo htmlspecialchars($export_link); ?>" class="btn btn-success">Download CSV</a>
|
||||
<form action="resend_webinar_email.php" method="POST" class="m-0" onsubmit="return confirm('Send the updated webinar email with the corrected time and Google Meet link to all active attendees in the current filter?');">
|
||||
<input type="hidden" name="webinar_id" value="<?php echo (int) $selected_webinar_id; ?>">
|
||||
<button type="submit" class="btn btn-primary">Send correction email</button>
|
||||
</form>
|
||||
<a href="index.php" class="btn btn-outline-light">View site</a>
|
||||
<a href="login.php?logout=1" class="btn btn-outline-light">Log out</a>
|
||||
<div class="w-100 text-muted small mt-1">Sends the corrected webinar time, Google Meet link, Google Calendar button, and .ics file to all active attendees<?php echo $selected_webinar ? ' in the selected webinar' : ''; ?>.</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<?php if ($preview_email_payload): ?>
|
||||
<section class="panel-card email-preview-card" aria-labelledby="email-preview-title">
|
||||
<div class="d-flex justify-content-between align-items-start flex-wrap gap-3 mb-3">
|
||||
<div>
|
||||
<h2 id="email-preview-title" class="h5 mb-1">Correction email preview</h2>
|
||||
<p class="text-muted mb-0"><?php echo htmlspecialchars($preview_scope_note ?? 'Preview unavailable.'); ?></p>
|
||||
</div>
|
||||
<div class="email-preview-badges">
|
||||
<span class="tag">Recipients: <?php echo number_format($total_records); ?></span>
|
||||
<span class="tag">Preview webinar: <?php echo htmlspecialchars($preview_webinar['title']); ?></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="email-preview-meta">
|
||||
<div><strong>Subject:</strong> <?php echo htmlspecialchars($preview_email_payload['subject']); ?></div>
|
||||
<div><strong>Send scope:</strong> <?php echo $selected_webinar ? 'Selected webinar only' : 'All webinars (preview shown for the most recent webinar)'; ?></div>
|
||||
<div><strong>What will be sent:</strong> Correction note, corrected webinar time, Google Meet link, Google Calendar button, and <code>.ics</code> calendar file.</div>
|
||||
</div>
|
||||
<div class="email-preview-frame-wrap">
|
||||
<iframe
|
||||
class="email-preview-frame"
|
||||
title="Correction email HTML preview"
|
||||
srcdoc="<?php echo htmlspecialchars($preview_email_payload['html'], ENT_QUOTES, 'UTF-8'); ?>">
|
||||
</iframe>
|
||||
</div>
|
||||
<details class="email-text-details">
|
||||
<summary>Show plain-text version</summary>
|
||||
<pre class="email-text-preview"><?php echo htmlspecialchars($preview_email_payload['text']); ?></pre>
|
||||
</details>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
<section class="summary-grid" aria-label="Registration summary">
|
||||
<article class="summary-card">
|
||||
<div class="summary-label">Total registrations</div>
|
||||
|
||||
BIN
assets/pasted-20260325-163454-1eca4df8.png
Normal file
BIN
assets/pasted-20260325-163454-1eca4df8.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 77 KiB |
176
includes/webinar_email.php
Normal file
176
includes/webinar_email.php
Normal file
@ -0,0 +1,176 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/webinar_schedule.php';
|
||||
|
||||
function webinar_join_url(): string {
|
||||
return 'https://meet.google.com/ohs-ayvx-dqg';
|
||||
}
|
||||
|
||||
function webinar_base_url(): string {
|
||||
$isHttps = !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off';
|
||||
$protocol = $isHttps ? 'https' : 'http';
|
||||
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
|
||||
|
||||
return $protocol . '://' . $host;
|
||||
}
|
||||
|
||||
function webinar_logo_url(): string {
|
||||
return webinar_base_url() . '/assets/pasted-20251030-095744-1b7c02ab.png';
|
||||
}
|
||||
|
||||
function webinar_calendar_description(array $schedule): string {
|
||||
return implode("
|
||||
|
||||
", [
|
||||
'Professional Vibe-Coding Webinar',
|
||||
'Join us on ' . $schedule['date_long'] . ' at ' . $schedule['timezone_line'] . '.',
|
||||
'Google Meet link: ' . webinar_join_url(),
|
||||
'The fastest way to go from an idea to a working app you own, running on your server, with your database, using real frameworks.',
|
||||
]);
|
||||
}
|
||||
|
||||
function webinar_google_calendar_link(array $schedule): string {
|
||||
$eventTitle = $schedule['title'];
|
||||
$eventDescription = webinar_calendar_description($schedule);
|
||||
$startTimeUtc = webinar_utc_stamp($schedule['start']);
|
||||
$endTimeUtc = webinar_utc_stamp($schedule['end']);
|
||||
|
||||
return 'https://www.google.com/calendar/render?action=TEMPLATE'
|
||||
. '&text=' . urlencode($eventTitle)
|
||||
. '&dates=' . $startTimeUtc . '/' . $endTimeUtc
|
||||
. '&details=' . urlencode($eventDescription)
|
||||
. '&location=' . urlencode(webinar_join_url())
|
||||
. '&ctz=UTC';
|
||||
}
|
||||
|
||||
function webinar_outlook_calendar_link(array $schedule): string {
|
||||
$eventTitle = $schedule['title'];
|
||||
$eventDescription = webinar_calendar_description($schedule);
|
||||
$icsContent = implode("
|
||||
", [
|
||||
'BEGIN:VCALENDAR',
|
||||
'VERSION:2.0',
|
||||
'PRODID:-//Flatlogic//' . $eventTitle . '//EN',
|
||||
'BEGIN:VEVENT',
|
||||
'URL:' . webinar_base_url(),
|
||||
'DTSTART:' . webinar_utc_stamp($schedule['start']),
|
||||
'DTEND:' . webinar_utc_stamp($schedule['end']),
|
||||
'SUMMARY:' . $eventTitle,
|
||||
'DESCRIPTION:' . str_replace(PHP_EOL, '\n', $eventDescription),
|
||||
'LOCATION:' . webinar_join_url(),
|
||||
'END:VEVENT',
|
||||
'END:VCALENDAR',
|
||||
]);
|
||||
|
||||
return 'data:text/calendar;charset=utf-8,' . rawurlencode($icsContent);
|
||||
}
|
||||
|
||||
function webinar_build_email_payload(string $firstName, array $webinar, bool $isCorrection = false): array {
|
||||
$schedule = webinar_schedule_data($webinar);
|
||||
$eventTitle = $schedule['title'];
|
||||
$googleLink = webinar_google_calendar_link($schedule);
|
||||
$outlookLink = webinar_outlook_calendar_link($schedule);
|
||||
$joinUrl = webinar_join_url();
|
||||
$baseUrl = webinar_base_url();
|
||||
$logoUrl = webinar_logo_url();
|
||||
|
||||
$safeFirstName = htmlspecialchars(trim($firstName) !== '' ? $firstName : 'there', ENT_QUOTES, 'UTF-8');
|
||||
$safeTitle = htmlspecialchars($eventTitle, ENT_QUOTES, 'UTF-8');
|
||||
$safeDateLong = htmlspecialchars($schedule['date_long'], ENT_QUOTES, 'UTF-8');
|
||||
$safeBerlinLabel = htmlspecialchars($schedule['berlin_label'], ENT_QUOTES, 'UTF-8');
|
||||
$safeNewYorkLabel = htmlspecialchars($schedule['new_york_label'], ENT_QUOTES, 'UTF-8');
|
||||
$safeLosAngelesLabel = htmlspecialchars($schedule['los_angeles_label'], ENT_QUOTES, 'UTF-8');
|
||||
$safeJoinUrl = htmlspecialchars($joinUrl, ENT_QUOTES, 'UTF-8');
|
||||
|
||||
if ($isCorrection) {
|
||||
$subject = 'Updated webinar time and join link for ' . $eventTitle;
|
||||
$introHtml = '<p style="font-size: 16px; line-height: 1.6;">We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.</p>';
|
||||
$noteHtml = '<p style="font-size: 16px; line-height: 1.6;"><strong>If you already saved the older calendar event, please remove it and add the updated one from this email.</strong></p>';
|
||||
$headline = 'Updated Webinar Details';
|
||||
$introText = 'We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.';
|
||||
$noteText = 'If you already saved the older calendar event, please remove it and add the updated one from this email.';
|
||||
} else {
|
||||
$subject = "Confirmation: You're Registered for {$eventTitle}";
|
||||
$introHtml = '<p style="font-size: 16px; line-height: 1.6;">Thank you for registering for the <strong>' . $safeTitle . '</strong> webinar.</p><p style="font-size: 16px; line-height: 1.6;">We are excited to have you join us for this professional vibe-coding session.</p>';
|
||||
$noteHtml = '<p style="font-size: 16px; line-height: 1.6;"><strong>Your webinar link is below, and you can add the corrected event to your calendar right now.</strong></p>';
|
||||
$headline = "You're Registered!";
|
||||
$introText = 'Thank you for registering for the ' . $eventTitle . ' webinar. We are excited to have you join us for this professional vibe-coding session.';
|
||||
$noteText = 'Your webinar link is below, and you can add the corrected event to your calendar right now.';
|
||||
}
|
||||
|
||||
$bodyHtml = <<<HTML
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{$safeTitle}</title>
|
||||
</head>
|
||||
<body style="font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f4f4f4; color: #333; margin: 0; padding: 0;">
|
||||
<table width="100%" border="0" cellspacing="0" cellpadding="0" style="background-color: #f4f4f4;">
|
||||
<tr>
|
||||
<td align="center">
|
||||
<table width="600" border="0" cellspacing="0" cellpadding="0" style="background-color: #ffffff; margin: 20px auto; border-radius: 10px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); overflow: hidden;">
|
||||
<tr>
|
||||
<td align="center" style="padding: 40px 20px; background: linear-gradient(135deg, #1a237e 0%, #0f9fff 100%);">
|
||||
<img src="{$logoUrl}" alt="AppWizzy Logo" style="height: 60px; margin-bottom: 20px;">
|
||||
<h1 style="color: #ffffff; font-size: 28px; margin: 0; line-height: 1.2;">{$headline}</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding: 40px 30px;">
|
||||
<h2 style="font-size: 22px; color: #1a237e; margin-top: 0;">Hello {$safeFirstName},</h2>
|
||||
{$introHtml}
|
||||
<div style="background-color: #f9f9f9; border-left: 4px solid #0f9fff; padding: 15px 20px; margin: 20px 0;">
|
||||
<p style="margin: 0; font-size: 16px;"><strong>Webinar details</strong></p>
|
||||
<p style="margin: 10px 0 0; font-size: 16px;">{$safeDateLong} | <strong>{$safeBerlinLabel}</strong> | {$safeNewYorkLabel} | {$safeLosAngelesLabel}</p>
|
||||
</div>
|
||||
<p style="font-size: 16px; line-height: 1.6;">Join the live session here:</p>
|
||||
<p style="font-size: 16px; line-height: 1.8; word-break: break-word;"><a href="{$safeJoinUrl}" style="color: #0f62fe;">{$safeJoinUrl}</a></p>
|
||||
{$noteHtml}
|
||||
<p style="text-align: center; margin: 30px 0 12px;">
|
||||
<a href="{$safeJoinUrl}" style="display: inline-block; background: linear-gradient(135deg, #0f62fe 0%, #0f9fff 100%); color: #ffffff; padding: 12px 25px; text-decoration: none; border-radius: 8px; font-weight: 700; margin: 0 8px 12px;">Join Webinar</a>
|
||||
<a href="{$googleLink}" style="display: inline-block; background: linear-gradient(135deg, #1a237e 0%, #4b5bdc 100%); color: #ffffff; padding: 12px 25px; text-decoration: none; border-radius: 8px; font-weight: 700; margin: 0 8px 12px;">Add to Google Calendar</a>
|
||||
</p>
|
||||
<p style="text-align: center; margin: 0 0 12px;">
|
||||
<a href="{$outlookLink}" style="color: #1a237e; font-weight: 600; text-decoration: none;">Download calendar file (.ics)</a>
|
||||
</p>
|
||||
<p style="font-size: 16px; line-height: 1.6;">You'll learn the fastest way to go from an idea to a working app you own, running on your server, with your database, using real frameworks.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" style="padding: 20px; background-color: #f4f4f4; border-top: 1px solid #dddddd;">
|
||||
<p style="margin: 0; color: #777;">© 2026 AppWizzy. All rights reserved.</p>
|
||||
<p style="margin: 5px 0 0; color: #777;">You can <a href="{$baseUrl}" style="color: #0f62fe;">visit our website</a> for more information.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
HTML;
|
||||
|
||||
$textBody = implode("
|
||||
|
||||
", [
|
||||
'Hello ' . (trim($firstName) !== '' ? trim($firstName) : 'there') . ',',
|
||||
$introText,
|
||||
'Webinar details: ' . $schedule['date_long'] . ' | ' . $schedule['berlin_label'] . ' | ' . $schedule['new_york_label'] . ' | ' . $schedule['los_angeles_label'],
|
||||
'Join webinar: ' . $joinUrl,
|
||||
$noteText,
|
||||
'Add to Google Calendar: ' . $googleLink,
|
||||
'Download calendar file (.ics): ' . $outlookLink,
|
||||
]);
|
||||
|
||||
return [
|
||||
'subject' => $subject,
|
||||
'html' => $bodyHtml,
|
||||
'text' => $textBody,
|
||||
'schedule' => $schedule,
|
||||
'google_link' => $googleLink,
|
||||
'outlook_link' => $outlookLink,
|
||||
'join_url' => $joinUrl,
|
||||
'event_title' => $eventTitle,
|
||||
];
|
||||
}
|
||||
351
mail/mail.log
351
mail/mail.log
@ -33677,3 +33677,354 @@ CLIENT -> SERVER: .
|
||||
SERVER -> CLIENT: 250 Ok 0100019d1ba46d9e-2657f32b-c66e-4498-80c2-1f0e6199d3e7-000000
|
||||
CLIENT -> SERVER: QUIT
|
||||
SERVER -> CLIENT: 221 Bye
|
||||
SERVER -> CLIENT: 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-8G5AYW8II Gml5Eqe0G82LibJ6JrqC
|
||||
CLIENT -> SERVER: EHLO vm-39074.dev.flatlogic.app
|
||||
SERVER -> CLIENT: 250-email-smtp.amazonaws.com
|
||||
250-8BITMIME
|
||||
250-STARTTLS
|
||||
250-AUTH PLAIN LOGIN
|
||||
250 Ok
|
||||
CLIENT -> SERVER: STARTTLS
|
||||
SERVER -> CLIENT: 220 Ready to start TLS
|
||||
CLIENT -> SERVER: EHLO vm-39074.dev.flatlogic.app
|
||||
SERVER -> CLIENT: 250-email-smtp.amazonaws.com
|
||||
250-8BITMIME
|
||||
250-AUTH PLAIN LOGIN
|
||||
250 Ok
|
||||
CLIENT -> SERVER: AUTH LOGIN
|
||||
SERVER -> CLIENT: 334 VXNlcm5hbWU6
|
||||
CLIENT -> SERVER: [credentials hidden]SERVER -> CLIENT: 334 UGFzc3dvcmQ6
|
||||
CLIENT -> SERVER: [credentials hidden]SERVER -> CLIENT: 235 Authentication successful.
|
||||
CLIENT -> SERVER: MAIL FROM:<support@flatlogic.com>
|
||||
SERVER -> CLIENT: 250 Ok
|
||||
CLIENT -> SERVER: RCPT TO:<builderbotflores@gmail.com>
|
||||
SERVER -> CLIENT: 250 Ok
|
||||
CLIENT -> SERVER: DATA
|
||||
SERVER -> CLIENT: 354 End data with <CR><LF>.<CR><LF>
|
||||
CLIENT -> SERVER: Date: Wed, 25 Mar 2026 16:33:41 +0000
|
||||
CLIENT -> SERVER: To: builderbotflores@gmail.com
|
||||
CLIENT -> SERVER: From: Flatlogic Team Customer Success <support@flatlogic.com>
|
||||
CLIENT -> SERVER: Reply-To: support@flatlogic.com
|
||||
CLIENT -> SERVER: Subject: Updated webinar time and join link for Building Scalable Apps with AppWizzy
|
||||
CLIENT -> SERVER: Message-ID: <1KrYtg462hV7kUhIEH6Do0l2rTywHWHSm9Gz7yu4@vm-39074.dev.flatlogic.app>
|
||||
CLIENT -> SERVER: X-Mailer: PHPMailer 6.6.3 (https://github.com/PHPMailer/PHPMailer)
|
||||
CLIENT -> SERVER: MIME-Version: 1.0
|
||||
CLIENT -> SERVER: Content-Type: multipart/alternative;
|
||||
CLIENT -> SERVER: boundary="b1_1KrYtg462hV7kUhIEH6Do0l2rTywHWHSm9Gz7yu4"
|
||||
CLIENT -> SERVER: Content-Transfer-Encoding: 8bit
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: This is a multi-part message in MIME format.
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: --b1_1KrYtg462hV7kUhIEH6Do0l2rTywHWHSm9Gz7yu4
|
||||
CLIENT -> SERVER: Content-Type: text/plain; charset=us-ascii
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Hello Flores,
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Webinar details: Wednesday, March 25, 2026 | 6PM CET | 1PM EDT | 10AM PDT
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Join webinar: https://meet.google.com/ohs-ayvx-dqg
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: If you already saved the older calendar event, please remove it and add the updated one from this email.
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Add to Google Calendar: https://www.google.com/calendar/render?action=TEMPLATE&text=Building+Scalable+Apps+with+AppWizzy&dates=20260325T170000Z/20260325T180000Z&details=Professional+Vibe-Coding+Webinar%0A%0AJoin+us+on+Wednesday%2C+March+25%2C+2026+at+6PM+CET+%7C+1PM+EDT+%7C+10AM+PDT.%0A%0AGoogle+Meet+link%3A+https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0A%0AThe+fastest+way+to+go+from+an+idea+to+a+working+app+you+own%2C+running+on+your+server%2C+with+your+database%2C+using+real+frameworks.&location=https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg&ctz=UTC
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Download calendar file (.ics): data:text/calendar;charset=utf-8,BEGIN%3AVCALENDAR%0AVERSION%3A2.0%0APRODID%3A-%2F%2FFlatlogic%2F%2FBuilding%20Scalable%20Apps%20with%20AppWizzy%2F%2FEN%0ABEGIN%3AVEVENT%0AURL%3Ahttp%3A%2F%2Fvm-39074.dev.flatlogic.app%0ADTSTART%3A20260325T170000Z%0ADTEND%3A20260325T180000Z%0ASUMMARY%3ABuilding%20Scalable%20Apps%20with%20AppWizzy%0ADESCRIPTION%3AProfessional%20Vibe-Coding%20Webinar%5Cn%5CnJoin%20us%20on%20Wednesday%2C%20March%2025%2C%202026%20at%206PM%20CET%20%7C%201PM%20EDT%20%7C%2010AM%20PDT.%5Cn%5CnGoogle%20Meet%20link%3A%20https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%5Cn%5CnThe%20fastest%20way%20to%20go%20from%20an%20idea%20to%20a%20working%20app%20you%20own%2C%20running%20on%20your%20server%2C%20with%20your%20database%2C%20using%20real%20frameworks.%0ALOCATION%3Ahttps%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0AEND%3AVEVENT%0AEND%3AVCALENDAR
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: --b1_1KrYtg462hV7kUhIEH6Do0l2rTywHWHSm9Gz7yu4
|
||||
CLIENT -> SERVER: Content-Type: text/html; charset=us-ascii
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: <!DOCTYPE html>
|
||||
CLIENT -> SERVER: <html lang="en">
|
||||
CLIENT -> SERVER: <head>
|
||||
CLIENT -> SERVER: <meta charset="UTF-8">
|
||||
CLIENT -> SERVER: <meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
CLIENT -> SERVER: <title>Building Scalable Apps with AppWizzy</title>
|
||||
CLIENT -> SERVER: </head>
|
||||
CLIENT -> SERVER: <body style="font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f4f4f4; color: #333; margin: 0; padding: 0;">
|
||||
CLIENT -> SERVER: <table width="100%" border="0" cellspacing="0" cellpadding="0" style="background-color: #f4f4f4;">
|
||||
CLIENT -> SERVER: <tr>
|
||||
CLIENT -> SERVER: <td align="center">
|
||||
CLIENT -> SERVER: <table width="600" border="0" cellspacing="0" cellpadding="0" style="background-color: #ffffff; margin: 20px auto; border-radius: 10px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); overflow: hidden;">
|
||||
CLIENT -> SERVER: <tr>
|
||||
CLIENT -> SERVER: <td align="center" style="padding: 40px 20px; background: linear-gradient(135deg, #1a237e 0%, #0f9fff 100%);">
|
||||
CLIENT -> SERVER: <img src="http://vm-39074.dev.flatlogic.app/assets/pasted-20251030-095744-1b7c02ab.png" alt="AppWizzy Logo" style="height: 60px; margin-bottom: 20px;">
|
||||
CLIENT -> SERVER: <h1 style="color: #ffffff; font-size: 28px; margin: 0; line-height: 1.2;">Updated Webinar Details</h1>
|
||||
CLIENT -> SERVER: </td>
|
||||
CLIENT -> SERVER: </tr>
|
||||
CLIENT -> SERVER: <tr>
|
||||
CLIENT -> SERVER: <td style="padding: 40px 30px;">
|
||||
CLIENT -> SERVER: <h2 style="font-size: 22px; color: #1a237e; margin-top: 0;">Hello Flores,</h2>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.6;">We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.</p>
|
||||
CLIENT -> SERVER: <div style="background-color: #f9f9f9; border-left: 4px solid #0f9fff; padding: 15px 20px; margin: 20px 0;">
|
||||
CLIENT -> SERVER: <p style="margin: 0; font-size: 16px;"><strong>Webinar details</strong></p>
|
||||
CLIENT -> SERVER: <p style="margin: 10px 0 0; font-size: 16px;">Wednesday, March 25, 2026 | <strong>6PM CET</strong> | 1PM EDT | 10AM PDT</p>
|
||||
CLIENT -> SERVER: </div>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.6;">Join the live session here:</p>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.8; word-break: break-word;"><a href="https://meet.google.com/ohs-ayvx-dqg" style="color: #0f62fe;">https://meet.google.com/ohs-ayvx-dqg</a></p>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.6;"><strong>If you already saved the older calendar event, please remove it and add the updated one from this email.</strong></p>
|
||||
CLIENT -> SERVER: <p style="text-align: center; margin: 30px 0 12px;">
|
||||
CLIENT -> SERVER: <a href="https://meet.google.com/ohs-ayvx-dqg" style="display: inline-block; background: linear-gradient(135deg, #0f62fe 0%, #0f9fff 100%); color: #ffffff; padding: 12px 25px; text-decoration: none; border-radius: 8px; font-weight: 700; margin: 0 8px 12px;">Join Webinar</a>
|
||||
CLIENT -> SERVER: <a href="https://www.google.com/calendar/render?action=TEMPLATE&text=Building+Scalable+Apps+with+AppWizzy&dates=20260325T170000Z/20260325T180000Z&details=Professional+Vibe-Coding+Webinar%0A%0AJoin+us+on+Wednesday%2C+March+25%2C+2026+at+6PM+CET+%7C+1PM+EDT+%7C+10AM+PDT.%0A%0AGoogle+Meet+link%3A+https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0A%0AThe+fastest+way+to+go+from+an+idea+to+a+working+app+you+own%2C+running+on+your+server%2C+with+your+database%2C+using+real+frameworks.&location=https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg&ctz=UTC" style="display: inline-block; background: linear-gradient(135deg, #1a237e 0%, #4b5bdc 100%); color: #ffffff; padding: 12px 25px; text-decoration: none; border-radius: 8px; font-weight: 700; margin: 0 8px 12px;">Add to Google Calendar</a>
|
||||
CLIENT -> SERVER: </p>
|
||||
CLIENT -> SERVER: <p style="text-align: center; margin: 0 0 12px;">
|
||||
CLIENT -> SERVER: <a href="data:text/calendar;charset=utf-8,BEGIN%3AVCALENDAR%0AVERSION%3A2.0%0APRODID%3A-%2F%2FFlatlogic%2F%2FBuilding%20Scalable%20Apps%20with%20AppWizzy%2F%2FEN%0ABEGIN%3AVEVENT%0AURL%3Ahttp%3A%2F%2Fvm-39074.dev.flatlogic.app%0ADTSTART%3A20260325T170000Z%0ADTEND%3A20260325T180000Z%0ASUMMARY%3ABuilding%20Scalable%20Apps%20with%20AppWizzy%0ADESCRIPTION%3AProfessional%20Vibe-Coding%20Webinar%5Cn%5CnJoin%20us%20on%20Wednesday%2C%20March%2025%2C%202026%20at%206PM%20CET%20%7C%201PM%20EDT%20%7C%2010AM%20PDT.%5Cn%5CnGoogle%20Meet%20link%3A%20https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%5Cn%5CnThe%20fastest%20way%20to%20go%20from%20an%20idea%20to%20a%20working%20app%20you%20own%2C%20running%20on%20your%20server%2C%20with%20your%20database%2C%20using%20real%20frameworks.%0ALOCATION%3Ahttps%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0AEND%3AVEVENT%0AEND%3AVCALENDAR" style="color: #1a237e; font-weight: 600; text-decoration: none;">Download calendar file (.ics)</a>
|
||||
CLIENT -> SERVER: </p>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.6;">You'll learn the fastest way to go from an idea to a working app you own, running on your server, with your database, using real frameworks.</p>
|
||||
CLIENT -> SERVER: </td>
|
||||
CLIENT -> SERVER: </tr>
|
||||
CLIENT -> SERVER: <tr>
|
||||
CLIENT -> SERVER: <td align="center" style="padding: 20px; background-color: #f4f4f4; border-top: 1px solid #dddddd;">
|
||||
CLIENT -> SERVER: <p style="margin: 0; color: #777;">© 2026 AppWizzy. All rights reserved.</p>
|
||||
CLIENT -> SERVER: <p style="margin: 5px 0 0; color: #777;">You can <a href="http://vm-39074.dev.flatlogic.app" style="color: #0f62fe;">visit our website</a> for more information.</p>
|
||||
CLIENT -> SERVER: </td>
|
||||
CLIENT -> SERVER: </tr>
|
||||
CLIENT -> SERVER: </table>
|
||||
CLIENT -> SERVER: </td>
|
||||
CLIENT -> SERVER: </tr>
|
||||
CLIENT -> SERVER: </table>
|
||||
CLIENT -> SERVER: </body>
|
||||
CLIENT -> SERVER: </html>
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: --b1_1KrYtg462hV7kUhIEH6Do0l2rTywHWHSm9Gz7yu4--
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: .
|
||||
SERVER -> CLIENT: 250 Ok 0100019d25d83f3f-598e01c6-5430-4f5d-8189-3b733f243fbd-000000
|
||||
CLIENT -> SERVER: QUIT
|
||||
SERVER -> CLIENT: 221 Bye
|
||||
SERVER -> CLIENT: 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-8G5AYW8II ecwRSm3nfW7Dw92OjHWx
|
||||
CLIENT -> SERVER: EHLO vm-39074.dev.flatlogic.app
|
||||
SERVER -> CLIENT: 250-email-smtp.amazonaws.com
|
||||
250-8BITMIME
|
||||
250-STARTTLS
|
||||
250-AUTH PLAIN LOGIN
|
||||
250 Ok
|
||||
CLIENT -> SERVER: STARTTLS
|
||||
SERVER -> CLIENT: 220 Ready to start TLS
|
||||
CLIENT -> SERVER: EHLO vm-39074.dev.flatlogic.app
|
||||
SERVER -> CLIENT: 250-email-smtp.amazonaws.com
|
||||
250-8BITMIME
|
||||
250-AUTH PLAIN LOGIN
|
||||
250 Ok
|
||||
CLIENT -> SERVER: AUTH LOGIN
|
||||
SERVER -> CLIENT: 334 VXNlcm5hbWU6
|
||||
CLIENT -> SERVER: [credentials hidden]SERVER -> CLIENT: 334 UGFzc3dvcmQ6
|
||||
CLIENT -> SERVER: [credentials hidden]SERVER -> CLIENT: 235 Authentication successful.
|
||||
CLIENT -> SERVER: MAIL FROM:<support@flatlogic.com>
|
||||
SERVER -> CLIENT: 250 Ok
|
||||
CLIENT -> SERVER: RCPT TO:<builderbotflores@gmail.com>
|
||||
SERVER -> CLIENT: 250 Ok
|
||||
CLIENT -> SERVER: DATA
|
||||
SERVER -> CLIENT: 354 End data with <CR><LF>.<CR><LF>
|
||||
CLIENT -> SERVER: Date: Wed, 25 Mar 2026 16:33:55 +0000
|
||||
CLIENT -> SERVER: To: builderbotflores@gmail.com
|
||||
CLIENT -> SERVER: From: Flatlogic Team Customer Success <support@flatlogic.com>
|
||||
CLIENT -> SERVER: Reply-To: support@flatlogic.com
|
||||
CLIENT -> SERVER: Subject: Updated webinar time and join link for Building Scalable Apps with AppWizzy
|
||||
CLIENT -> SERVER: Message-ID: <da4z0Cdtq1JEP2XQWT7HU7BwytoBYggMc9NHWRgD0@vm-39074.dev.flatlogic.app>
|
||||
CLIENT -> SERVER: X-Mailer: PHPMailer 6.6.3 (https://github.com/PHPMailer/PHPMailer)
|
||||
CLIENT -> SERVER: MIME-Version: 1.0
|
||||
CLIENT -> SERVER: Content-Type: multipart/alternative;
|
||||
CLIENT -> SERVER: boundary="b1_da4z0Cdtq1JEP2XQWT7HU7BwytoBYggMc9NHWRgD0"
|
||||
CLIENT -> SERVER: Content-Transfer-Encoding: 8bit
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: This is a multi-part message in MIME format.
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: --b1_da4z0Cdtq1JEP2XQWT7HU7BwytoBYggMc9NHWRgD0
|
||||
CLIENT -> SERVER: Content-Type: text/plain; charset=us-ascii
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Hello Flores,
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Webinar details: Wednesday, March 25, 2026 | 6PM CET | 1PM EDT | 10AM PDT
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Join webinar: https://meet.google.com/ohs-ayvx-dqg
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: If you already saved the older calendar event, please remove it and add the updated one from this email.
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Add to Google Calendar: https://www.google.com/calendar/render?action=TEMPLATE&text=Building+Scalable+Apps+with+AppWizzy&dates=20260325T170000Z/20260325T180000Z&details=Professional+Vibe-Coding+Webinar%0A%0AJoin+us+on+Wednesday%2C+March+25%2C+2026+at+6PM+CET+%7C+1PM+EDT+%7C+10AM+PDT.%0A%0AGoogle+Meet+link%3A+https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0A%0AThe+fastest+way+to+go+from+an+idea+to+a+working+app+you+own%2C+running+on+your+server%2C+with+your+database%2C+using+real+frameworks.&location=https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg&ctz=UTC
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Download calendar file (.ics): data:text/calendar;charset=utf-8,BEGIN%3AVCALENDAR%0AVERSION%3A2.0%0APRODID%3A-%2F%2FFlatlogic%2F%2FBuilding%20Scalable%20Apps%20with%20AppWizzy%2F%2FEN%0ABEGIN%3AVEVENT%0AURL%3Ahttp%3A%2F%2Fvm-39074.dev.flatlogic.app%0ADTSTART%3A20260325T170000Z%0ADTEND%3A20260325T180000Z%0ASUMMARY%3ABuilding%20Scalable%20Apps%20with%20AppWizzy%0ADESCRIPTION%3AProfessional%20Vibe-Coding%20Webinar%5Cn%5CnJoin%20us%20on%20Wednesday%2C%20March%2025%2C%202026%20at%206PM%20CET%20%7C%201PM%20EDT%20%7C%2010AM%20PDT.%5Cn%5CnGoogle%20Meet%20link%3A%20https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%5Cn%5CnThe%20fastest%20way%20to%20go%20from%20an%20idea%20to%20a%20working%20app%20you%20own%2C%20running%20on%20your%20server%2C%20with%20your%20database%2C%20using%20real%20frameworks.%0ALOCATION%3Ahttps%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0AEND%3AVEVENT%0AEND%3AVCALENDAR
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: --b1_da4z0Cdtq1JEP2XQWT7HU7BwytoBYggMc9NHWRgD0
|
||||
CLIENT -> SERVER: Content-Type: text/html; charset=us-ascii
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: <!DOCTYPE html>
|
||||
CLIENT -> SERVER: <html lang="en">
|
||||
CLIENT -> SERVER: <head>
|
||||
CLIENT -> SERVER: <meta charset="UTF-8">
|
||||
CLIENT -> SERVER: <meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
CLIENT -> SERVER: <title>Building Scalable Apps with AppWizzy</title>
|
||||
CLIENT -> SERVER: </head>
|
||||
CLIENT -> SERVER: <body style="font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f4f4f4; color: #333; margin: 0; padding: 0;">
|
||||
CLIENT -> SERVER: <table width="100%" border="0" cellspacing="0" cellpadding="0" style="background-color: #f4f4f4;">
|
||||
CLIENT -> SERVER: <tr>
|
||||
CLIENT -> SERVER: <td align="center">
|
||||
CLIENT -> SERVER: <table width="600" border="0" cellspacing="0" cellpadding="0" style="background-color: #ffffff; margin: 20px auto; border-radius: 10px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); overflow: hidden;">
|
||||
CLIENT -> SERVER: <tr>
|
||||
CLIENT -> SERVER: <td align="center" style="padding: 40px 20px; background: linear-gradient(135deg, #1a237e 0%, #0f9fff 100%);">
|
||||
CLIENT -> SERVER: <img src="http://vm-39074.dev.flatlogic.app/assets/pasted-20251030-095744-1b7c02ab.png" alt="AppWizzy Logo" style="height: 60px; margin-bottom: 20px;">
|
||||
CLIENT -> SERVER: <h1 style="color: #ffffff; font-size: 28px; margin: 0; line-height: 1.2;">Updated Webinar Details</h1>
|
||||
CLIENT -> SERVER: </td>
|
||||
CLIENT -> SERVER: </tr>
|
||||
CLIENT -> SERVER: <tr>
|
||||
CLIENT -> SERVER: <td style="padding: 40px 30px;">
|
||||
CLIENT -> SERVER: <h2 style="font-size: 22px; color: #1a237e; margin-top: 0;">Hello Flores,</h2>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.6;">We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.</p>
|
||||
CLIENT -> SERVER: <div style="background-color: #f9f9f9; border-left: 4px solid #0f9fff; padding: 15px 20px; margin: 20px 0;">
|
||||
CLIENT -> SERVER: <p style="margin: 0; font-size: 16px;"><strong>Webinar details</strong></p>
|
||||
CLIENT -> SERVER: <p style="margin: 10px 0 0; font-size: 16px;">Wednesday, March 25, 2026 | <strong>6PM CET</strong> | 1PM EDT | 10AM PDT</p>
|
||||
CLIENT -> SERVER: </div>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.6;">Join the live session here:</p>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.8; word-break: break-word;"><a href="https://meet.google.com/ohs-ayvx-dqg" style="color: #0f62fe;">https://meet.google.com/ohs-ayvx-dqg</a></p>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.6;"><strong>If you already saved the older calendar event, please remove it and add the updated one from this email.</strong></p>
|
||||
CLIENT -> SERVER: <p style="text-align: center; margin: 30px 0 12px;">
|
||||
CLIENT -> SERVER: <a href="https://meet.google.com/ohs-ayvx-dqg" style="display: inline-block; background: linear-gradient(135deg, #0f62fe 0%, #0f9fff 100%); color: #ffffff; padding: 12px 25px; text-decoration: none; border-radius: 8px; font-weight: 700; margin: 0 8px 12px;">Join Webinar</a>
|
||||
CLIENT -> SERVER: <a href="https://www.google.com/calendar/render?action=TEMPLATE&text=Building+Scalable+Apps+with+AppWizzy&dates=20260325T170000Z/20260325T180000Z&details=Professional+Vibe-Coding+Webinar%0A%0AJoin+us+on+Wednesday%2C+March+25%2C+2026+at+6PM+CET+%7C+1PM+EDT+%7C+10AM+PDT.%0A%0AGoogle+Meet+link%3A+https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0A%0AThe+fastest+way+to+go+from+an+idea+to+a+working+app+you+own%2C+running+on+your+server%2C+with+your+database%2C+using+real+frameworks.&location=https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg&ctz=UTC" style="display: inline-block; background: linear-gradient(135deg, #1a237e 0%, #4b5bdc 100%); color: #ffffff; padding: 12px 25px; text-decoration: none; border-radius: 8px; font-weight: 700; margin: 0 8px 12px;">Add to Google Calendar</a>
|
||||
CLIENT -> SERVER: </p>
|
||||
CLIENT -> SERVER: <p style="text-align: center; margin: 0 0 12px;">
|
||||
CLIENT -> SERVER: <a href="data:text/calendar;charset=utf-8,BEGIN%3AVCALENDAR%0AVERSION%3A2.0%0APRODID%3A-%2F%2FFlatlogic%2F%2FBuilding%20Scalable%20Apps%20with%20AppWizzy%2F%2FEN%0ABEGIN%3AVEVENT%0AURL%3Ahttp%3A%2F%2Fvm-39074.dev.flatlogic.app%0ADTSTART%3A20260325T170000Z%0ADTEND%3A20260325T180000Z%0ASUMMARY%3ABuilding%20Scalable%20Apps%20with%20AppWizzy%0ADESCRIPTION%3AProfessional%20Vibe-Coding%20Webinar%5Cn%5CnJoin%20us%20on%20Wednesday%2C%20March%2025%2C%202026%20at%206PM%20CET%20%7C%201PM%20EDT%20%7C%2010AM%20PDT.%5Cn%5CnGoogle%20Meet%20link%3A%20https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%5Cn%5CnThe%20fastest%20way%20to%20go%20from%20an%20idea%20to%20a%20working%20app%20you%20own%2C%20running%20on%20your%20server%2C%20with%20your%20database%2C%20using%20real%20frameworks.%0ALOCATION%3Ahttps%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0AEND%3AVEVENT%0AEND%3AVCALENDAR" style="color: #1a237e; font-weight: 600; text-decoration: none;">Download calendar file (.ics)</a>
|
||||
CLIENT -> SERVER: </p>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.6;">You'll learn the fastest way to go from an idea to a working app you own, running on your server, with your database, using real frameworks.</p>
|
||||
CLIENT -> SERVER: </td>
|
||||
CLIENT -> SERVER: </tr>
|
||||
CLIENT -> SERVER: <tr>
|
||||
CLIENT -> SERVER: <td align="center" style="padding: 20px; background-color: #f4f4f4; border-top: 1px solid #dddddd;">
|
||||
CLIENT -> SERVER: <p style="margin: 0; color: #777;">© 2026 AppWizzy. All rights reserved.</p>
|
||||
CLIENT -> SERVER: <p style="margin: 5px 0 0; color: #777;">You can <a href="http://vm-39074.dev.flatlogic.app" style="color: #0f62fe;">visit our website</a> for more information.</p>
|
||||
CLIENT -> SERVER: </td>
|
||||
CLIENT -> SERVER: </tr>
|
||||
CLIENT -> SERVER: </table>
|
||||
CLIENT -> SERVER: </td>
|
||||
CLIENT -> SERVER: </tr>
|
||||
CLIENT -> SERVER: </table>
|
||||
CLIENT -> SERVER: </body>
|
||||
CLIENT -> SERVER: </html>
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: --b1_da4z0Cdtq1JEP2XQWT7HU7BwytoBYggMc9NHWRgD0--
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: .
|
||||
SERVER -> CLIENT: 250 Ok 0100019d25d87450-e128af55-2ecd-4b71-a4c2-cca740e0fc0f-000000
|
||||
CLIENT -> SERVER: QUIT
|
||||
SERVER -> CLIENT: 221 Bye
|
||||
SERVER -> CLIENT: 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-FZY12I9II sSFAlJVyj7Iv2WiFNoBz
|
||||
CLIENT -> SERVER: EHLO vm-39074.dev.flatlogic.app
|
||||
SERVER -> CLIENT: 250-email-smtp.amazonaws.com
|
||||
250-8BITMIME
|
||||
250-STARTTLS
|
||||
250-AUTH PLAIN LOGIN
|
||||
250 Ok
|
||||
CLIENT -> SERVER: STARTTLS
|
||||
SERVER -> CLIENT: 220 Ready to start TLS
|
||||
CLIENT -> SERVER: EHLO vm-39074.dev.flatlogic.app
|
||||
SERVER -> CLIENT: 250-email-smtp.amazonaws.com
|
||||
250-8BITMIME
|
||||
250-AUTH PLAIN LOGIN
|
||||
250 Ok
|
||||
CLIENT -> SERVER: AUTH LOGIN
|
||||
SERVER -> CLIENT: 334 VXNlcm5hbWU6
|
||||
CLIENT -> SERVER: [credentials hidden]SERVER -> CLIENT: 334 UGFzc3dvcmQ6
|
||||
CLIENT -> SERVER: [credentials hidden]SERVER -> CLIENT: 235 Authentication successful.
|
||||
CLIENT -> SERVER: MAIL FROM:<support@flatlogic.com>
|
||||
SERVER -> CLIENT: 250 Ok
|
||||
CLIENT -> SERVER: RCPT TO:<builderbotflores@gmail.com>
|
||||
SERVER -> CLIENT: 250 Ok
|
||||
CLIENT -> SERVER: DATA
|
||||
SERVER -> CLIENT: 354 End data with <CR><LF>.<CR><LF>
|
||||
CLIENT -> SERVER: Date: Wed, 25 Mar 2026 16:35:06 +0000
|
||||
CLIENT -> SERVER: To: builderbotflores@gmail.com
|
||||
CLIENT -> SERVER: From: Flatlogic Team Customer Success <support@flatlogic.com>
|
||||
CLIENT -> SERVER: Reply-To: support@flatlogic.com
|
||||
CLIENT -> SERVER: Subject: Updated webinar time and join link for Building Scalable Apps with AppWizzy
|
||||
CLIENT -> SERVER: Message-ID: <kd1sH1vN1RrI0zprqVYbU9XC5kYE4DiAV5h2M@vm-39074.dev.flatlogic.app>
|
||||
CLIENT -> SERVER: X-Mailer: PHPMailer 6.6.3 (https://github.com/PHPMailer/PHPMailer)
|
||||
CLIENT -> SERVER: MIME-Version: 1.0
|
||||
CLIENT -> SERVER: Content-Type: multipart/alternative;
|
||||
CLIENT -> SERVER: boundary="b1_kd1sH1vN1RrI0zprqVYbU9XC5kYE4DiAV5h2M"
|
||||
CLIENT -> SERVER: Content-Transfer-Encoding: 8bit
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: This is a multi-part message in MIME format.
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: --b1_kd1sH1vN1RrI0zprqVYbU9XC5kYE4DiAV5h2M
|
||||
CLIENT -> SERVER: Content-Type: text/plain; charset=us-ascii
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Hello Flores,
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Webinar details: Wednesday, March 25, 2026 | 6PM CET | 1PM EDT | 10AM PDT
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Join webinar: https://meet.google.com/ohs-ayvx-dqg
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: If you already saved the older calendar event, please remove it and add the updated one from this email.
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Add to Google Calendar: https://www.google.com/calendar/render?action=TEMPLATE&text=Building+Scalable+Apps+with+AppWizzy&dates=20260325T170000Z/20260325T180000Z&details=Professional+Vibe-Coding+Webinar%0A%0AJoin+us+on+Wednesday%2C+March+25%2C+2026+at+6PM+CET+%7C+1PM+EDT+%7C+10AM+PDT.%0A%0AGoogle+Meet+link%3A+https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0A%0AThe+fastest+way+to+go+from+an+idea+to+a+working+app+you+own%2C+running+on+your+server%2C+with+your+database%2C+using+real+frameworks.&location=https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg&ctz=UTC
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: Download calendar file (.ics): data:text/calendar;charset=utf-8,BEGIN%3AVCALENDAR%0AVERSION%3A2.0%0APRODID%3A-%2F%2FFlatlogic%2F%2FBuilding%20Scalable%20Apps%20with%20AppWizzy%2F%2FEN%0ABEGIN%3AVEVENT%0AURL%3Ahttp%3A%2F%2Fvm-39074.dev.flatlogic.app%0ADTSTART%3A20260325T170000Z%0ADTEND%3A20260325T180000Z%0ASUMMARY%3ABuilding%20Scalable%20Apps%20with%20AppWizzy%0ADESCRIPTION%3AProfessional%20Vibe-Coding%20Webinar%5Cn%5CnJoin%20us%20on%20Wednesday%2C%20March%2025%2C%202026%20at%206PM%20CET%20%7C%201PM%20EDT%20%7C%2010AM%20PDT.%5Cn%5CnGoogle%20Meet%20link%3A%20https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%5Cn%5CnThe%20fastest%20way%20to%20go%20from%20an%20idea%20to%20a%20working%20app%20you%20own%2C%20running%20on%20your%20server%2C%20with%20your%20database%2C%20using%20real%20frameworks.%0ALOCATION%3Ahttps%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0AEND%3AVEVENT%0AEND%3AVCALENDAR
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: --b1_kd1sH1vN1RrI0zprqVYbU9XC5kYE4DiAV5h2M
|
||||
CLIENT -> SERVER: Content-Type: text/html; charset=us-ascii
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: <!DOCTYPE html>
|
||||
CLIENT -> SERVER: <html lang="en">
|
||||
CLIENT -> SERVER: <head>
|
||||
CLIENT -> SERVER: <meta charset="UTF-8">
|
||||
CLIENT -> SERVER: <meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
CLIENT -> SERVER: <title>Building Scalable Apps with AppWizzy</title>
|
||||
CLIENT -> SERVER: </head>
|
||||
CLIENT -> SERVER: <body style="font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f4f4f4; color: #333; margin: 0; padding: 0;">
|
||||
CLIENT -> SERVER: <table width="100%" border="0" cellspacing="0" cellpadding="0" style="background-color: #f4f4f4;">
|
||||
CLIENT -> SERVER: <tr>
|
||||
CLIENT -> SERVER: <td align="center">
|
||||
CLIENT -> SERVER: <table width="600" border="0" cellspacing="0" cellpadding="0" style="background-color: #ffffff; margin: 20px auto; border-radius: 10px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); overflow: hidden;">
|
||||
CLIENT -> SERVER: <tr>
|
||||
CLIENT -> SERVER: <td align="center" style="padding: 40px 20px; background: linear-gradient(135deg, #1a237e 0%, #0f9fff 100%);">
|
||||
CLIENT -> SERVER: <img src="http://vm-39074.dev.flatlogic.app/assets/pasted-20251030-095744-1b7c02ab.png" alt="AppWizzy Logo" style="height: 60px; margin-bottom: 20px;">
|
||||
CLIENT -> SERVER: <h1 style="color: #ffffff; font-size: 28px; margin: 0; line-height: 1.2;">Updated Webinar Details</h1>
|
||||
CLIENT -> SERVER: </td>
|
||||
CLIENT -> SERVER: </tr>
|
||||
CLIENT -> SERVER: <tr>
|
||||
CLIENT -> SERVER: <td style="padding: 40px 30px;">
|
||||
CLIENT -> SERVER: <h2 style="font-size: 22px; color: #1a237e; margin-top: 0;">Hello Flores,</h2>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.6;">We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.</p>
|
||||
CLIENT -> SERVER: <div style="background-color: #f9f9f9; border-left: 4px solid #0f9fff; padding: 15px 20px; margin: 20px 0;">
|
||||
CLIENT -> SERVER: <p style="margin: 0; font-size: 16px;"><strong>Webinar details</strong></p>
|
||||
CLIENT -> SERVER: <p style="margin: 10px 0 0; font-size: 16px;">Wednesday, March 25, 2026 | <strong>6PM CET</strong> | 1PM EDT | 10AM PDT</p>
|
||||
CLIENT -> SERVER: </div>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.6;">Join the live session here:</p>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.8; word-break: break-word;"><a href="https://meet.google.com/ohs-ayvx-dqg" style="color: #0f62fe;">https://meet.google.com/ohs-ayvx-dqg</a></p>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.6;"><strong>If you already saved the older calendar event, please remove it and add the updated one from this email.</strong></p>
|
||||
CLIENT -> SERVER: <p style="text-align: center; margin: 30px 0 12px;">
|
||||
CLIENT -> SERVER: <a href="https://meet.google.com/ohs-ayvx-dqg" style="display: inline-block; background: linear-gradient(135deg, #0f62fe 0%, #0f9fff 100%); color: #ffffff; padding: 12px 25px; text-decoration: none; border-radius: 8px; font-weight: 700; margin: 0 8px 12px;">Join Webinar</a>
|
||||
CLIENT -> SERVER: <a href="https://www.google.com/calendar/render?action=TEMPLATE&text=Building+Scalable+Apps+with+AppWizzy&dates=20260325T170000Z/20260325T180000Z&details=Professional+Vibe-Coding+Webinar%0A%0AJoin+us+on+Wednesday%2C+March+25%2C+2026+at+6PM+CET+%7C+1PM+EDT+%7C+10AM+PDT.%0A%0AGoogle+Meet+link%3A+https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0A%0AThe+fastest+way+to+go+from+an+idea+to+a+working+app+you+own%2C+running+on+your+server%2C+with+your+database%2C+using+real+frameworks.&location=https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg&ctz=UTC" style="display: inline-block; background: linear-gradient(135deg, #1a237e 0%, #4b5bdc 100%); color: #ffffff; padding: 12px 25px; text-decoration: none; border-radius: 8px; font-weight: 700; margin: 0 8px 12px;">Add to Google Calendar</a>
|
||||
CLIENT -> SERVER: </p>
|
||||
CLIENT -> SERVER: <p style="text-align: center; margin: 0 0 12px;">
|
||||
CLIENT -> SERVER: <a href="data:text/calendar;charset=utf-8,BEGIN%3AVCALENDAR%0AVERSION%3A2.0%0APRODID%3A-%2F%2FFlatlogic%2F%2FBuilding%20Scalable%20Apps%20with%20AppWizzy%2F%2FEN%0ABEGIN%3AVEVENT%0AURL%3Ahttp%3A%2F%2Fvm-39074.dev.flatlogic.app%0ADTSTART%3A20260325T170000Z%0ADTEND%3A20260325T180000Z%0ASUMMARY%3ABuilding%20Scalable%20Apps%20with%20AppWizzy%0ADESCRIPTION%3AProfessional%20Vibe-Coding%20Webinar%5Cn%5CnJoin%20us%20on%20Wednesday%2C%20March%2025%2C%202026%20at%206PM%20CET%20%7C%201PM%20EDT%20%7C%2010AM%20PDT.%5Cn%5CnGoogle%20Meet%20link%3A%20https%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%5Cn%5CnThe%20fastest%20way%20to%20go%20from%20an%20idea%20to%20a%20working%20app%20you%20own%2C%20running%20on%20your%20server%2C%20with%20your%20database%2C%20using%20real%20frameworks.%0ALOCATION%3Ahttps%3A%2F%2Fmeet.google.com%2Fohs-ayvx-dqg%0AEND%3AVEVENT%0AEND%3AVCALENDAR" style="color: #1a237e; font-weight: 600; text-decoration: none;">Download calendar file (.ics)</a>
|
||||
CLIENT -> SERVER: </p>
|
||||
CLIENT -> SERVER: <p style="font-size: 16px; line-height: 1.6;">You'll learn the fastest way to go from an idea to a working app you own, running on your server, with your database, using real frameworks.</p>
|
||||
CLIENT -> SERVER: </td>
|
||||
CLIENT -> SERVER: </tr>
|
||||
CLIENT -> SERVER: <tr>
|
||||
CLIENT -> SERVER: <td align="center" style="padding: 20px; background-color: #f4f4f4; border-top: 1px solid #dddddd;">
|
||||
CLIENT -> SERVER: <p style="margin: 0; color: #777;">© 2026 AppWizzy. All rights reserved.</p>
|
||||
CLIENT -> SERVER: <p style="margin: 5px 0 0; color: #777;">You can <a href="http://vm-39074.dev.flatlogic.app" style="color: #0f62fe;">visit our website</a> for more information.</p>
|
||||
CLIENT -> SERVER: </td>
|
||||
CLIENT -> SERVER: </tr>
|
||||
CLIENT -> SERVER: </table>
|
||||
CLIENT -> SERVER: </td>
|
||||
CLIENT -> SERVER: </tr>
|
||||
CLIENT -> SERVER: </table>
|
||||
CLIENT -> SERVER: </body>
|
||||
CLIENT -> SERVER: </html>
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: --b1_kd1sH1vN1RrI0zprqVYbU9XC5kYE4DiAV5h2M--
|
||||
CLIENT -> SERVER:
|
||||
CLIENT -> SERVER: .
|
||||
SERVER -> CLIENT: 250 Ok 0100019d25d98c95-df6cc150-7c16-427c-994a-8c4f741fc790-000000
|
||||
CLIENT -> SERVER: QUIT
|
||||
SERVER -> CLIENT: 221 Bye
|
||||
|
||||
BIN
register.php
BIN
register.php
Binary file not shown.
73
resend_webinar_email.php
Normal file
73
resend_webinar_email.php
Normal file
@ -0,0 +1,73 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once 'db/config.php';
|
||||
require_once 'mail/MailService.php';
|
||||
require_once 'includes/admin_auth.php';
|
||||
require_once 'includes/webinar_schedule.php';
|
||||
require_once 'includes/webinar_email.php';
|
||||
|
||||
admin_require_login();
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
||||
header('Location: admin.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
$selectedWebinarId = filter_input(INPUT_POST, 'webinar_id', FILTER_VALIDATE_INT);
|
||||
$selectedWebinarId = $selectedWebinarId ? max(0, (int) $selectedWebinarId) : 0;
|
||||
|
||||
try {
|
||||
$pdo = db();
|
||||
|
||||
$sql = "SELECT a.id, a.first_name, a.last_name, a.email, a.webinar_id, w.title, w.description, w.scheduled_at, w.presenter
|
||||
FROM attendees a
|
||||
INNER JOIN webinars w ON w.id = a.webinar_id
|
||||
WHERE a.deleted_at IS NULL";
|
||||
$params = [];
|
||||
|
||||
if ($selectedWebinarId > 0) {
|
||||
$sql .= ' AND a.webinar_id = ?';
|
||||
$params[] = $selectedWebinarId;
|
||||
}
|
||||
|
||||
$sql .= ' ORDER BY a.created_at DESC, a.id DESC';
|
||||
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$attendees = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$attendees) {
|
||||
admin_set_flash('No active attendees were found for the selected webinar.');
|
||||
header('Location: admin.php' . ($selectedWebinarId > 0 ? '?webinar_id=' . urlencode((string) $selectedWebinarId) : ''));
|
||||
exit;
|
||||
}
|
||||
|
||||
$sentCount = 0;
|
||||
$failedCount = 0;
|
||||
|
||||
foreach ($attendees as $attendee) {
|
||||
$payload = webinar_build_email_payload((string) ($attendee['first_name'] ?? ''), $attendee, true);
|
||||
$result = MailService::sendMail((string) $attendee['email'], $payload['subject'], $payload['html'], $payload['text']);
|
||||
|
||||
if (!empty($result['success'])) {
|
||||
$sentCount++;
|
||||
} else {
|
||||
$failedCount++;
|
||||
error_log('Correction email failed for attendee #' . (int) $attendee['id'] . ': ' . ($result['error'] ?? 'unknown error'));
|
||||
}
|
||||
}
|
||||
|
||||
$scope = $selectedWebinarId > 0 ? 'selected webinar' : 'all active webinars';
|
||||
$message = "Correction email sent to {$sentCount} attendee(s) for the {$scope}.";
|
||||
if ($failedCount > 0) {
|
||||
$message .= " {$failedCount} email(s) failed to send. Check the mail log for details.";
|
||||
}
|
||||
|
||||
admin_set_flash($message);
|
||||
} catch (Throwable $e) {
|
||||
error_log('Failed to send correction emails: ' . $e->getMessage());
|
||||
admin_set_flash('Could not send the correction email right now. Please try again.');
|
||||
}
|
||||
|
||||
header('Location: admin.php' . ($selectedWebinarId > 0 ? '?webinar_id=' . urlencode((string) $selectedWebinarId) : ''));
|
||||
exit;
|
||||
Loading…
x
Reference in New Issue
Block a user