diff --git a/admin.php b/admin.php index 7298848..d23b7fb 100644 --- a/admin.php +++ b/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; + } } @@ -360,13 +419,49 @@ $export_link = 'export_csv.php' . ($selected_webinar_id > 0 ? '?webinar_id=' . u Reset -
+
Download CSV +
+ + +
View site Log out +
Sends the corrected webinar time, Google Meet link, Google Calendar button, and .ics file to all active attendees.
+ +
+
+
+

Correction email preview

+

+
+ +
+ + + +
+ +
Total registrations
diff --git a/assets/pasted-20260325-163454-1eca4df8.png b/assets/pasted-20260325-163454-1eca4df8.png new file mode 100644 index 0000000..3471661 Binary files /dev/null and b/assets/pasted-20260325-163454-1eca4df8.png differ diff --git a/includes/webinar_email.php b/includes/webinar_email.php new file mode 100644 index 0000000..c4efc7f --- /dev/null +++ b/includes/webinar_email.php @@ -0,0 +1,176 @@ +We updated the webinar timing to reflect U.S. daylight saving time. Please use the corrected schedule and links below.

'; + $noteHtml = '

If you already saved the older calendar event, please remove it and add the updated one from this email.

'; + $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 = '

Thank you for registering for the ' . $safeTitle . ' webinar.

We are excited to have you join us for this professional vibe-coding session.

'; + $noteHtml = '

Your webinar link is below, and you can add the corrected event to your calendar right now.

'; + $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 = << + + + + + {$safeTitle} + + + + + + +
+ + + + + + + + + + +
+ AppWizzy Logo +

{$headline}

+
+

Hello {$safeFirstName},

+ {$introHtml} +
+

Webinar details

+

{$safeDateLong} | {$safeBerlinLabel} | {$safeNewYorkLabel} | {$safeLosAngelesLabel}

+
+

Join the live session here:

+

{$safeJoinUrl}

+ {$noteHtml} +

+ Join Webinar + Add to Google Calendar +

+

+ Download calendar file (.ics) +

+

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.

+
+

© 2026 AppWizzy. All rights reserved.

+

You can visit our website for more information.

+
+
+ + +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, + ]; +} diff --git a/mail/mail.log b/mail/mail.log index 3b8563d..82e8ffd 100644 --- a/mail/mail.log +++ b/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: +SERVER -> CLIENT: 250 Ok +CLIENT -> SERVER: RCPT TO: +SERVER -> CLIENT: 250 Ok +CLIENT -> SERVER: DATA +SERVER -> CLIENT: 354 End data with . +CLIENT -> SERVER: Date: Wed, 25 Mar 2026 16:33:41 +0000 +CLIENT -> SERVER: To: builderbotflores@gmail.com +CLIENT -> SERVER: From: Flatlogic Team Customer Success +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: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: Building Scalable Apps with AppWizzy +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER:
+CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER:
+CLIENT -> SERVER: AppWizzy Logo +CLIENT -> SERVER:

Updated Webinar Details

+CLIENT -> SERVER:
+CLIENT -> SERVER:

Hello Flores,

+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

+CLIENT -> SERVER:

Wednesday, March 25, 2026 | 6PM CET | 1PM EDT | 10AM PDT

+CLIENT -> SERVER:
+CLIENT -> SERVER:

Join the live session here:

+CLIENT -> SERVER:

https://meet.google.com/ohs-ayvx-dqg

+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: Join Webinar +CLIENT -> SERVER: Add to Google Calendar +CLIENT -> SERVER:

+CLIENT -> SERVER:

+CLIENT -> SERVER: Download calendar file (.ics) +CLIENT -> SERVER:

+CLIENT -> SERVER:

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.

+CLIENT -> SERVER:
+CLIENT -> SERVER:

© 2026 AppWizzy. All rights reserved.

+CLIENT -> SERVER:

You can visit our website for more information.

+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: +CLIENT -> SERVER: +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: +SERVER -> CLIENT: 250 Ok +CLIENT -> SERVER: RCPT TO: +SERVER -> CLIENT: 250 Ok +CLIENT -> SERVER: DATA +SERVER -> CLIENT: 354 End data with . +CLIENT -> SERVER: Date: Wed, 25 Mar 2026 16:33:55 +0000 +CLIENT -> SERVER: To: builderbotflores@gmail.com +CLIENT -> SERVER: From: Flatlogic Team Customer Success +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: +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: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: Building Scalable Apps with AppWizzy +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER:
+CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER:
+CLIENT -> SERVER: AppWizzy Logo +CLIENT -> SERVER:

Updated Webinar Details

+CLIENT -> SERVER:
+CLIENT -> SERVER:

Hello Flores,

+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

+CLIENT -> SERVER:

Wednesday, March 25, 2026 | 6PM CET | 1PM EDT | 10AM PDT

+CLIENT -> SERVER:
+CLIENT -> SERVER:

Join the live session here:

+CLIENT -> SERVER:

https://meet.google.com/ohs-ayvx-dqg

+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: Join Webinar +CLIENT -> SERVER: Add to Google Calendar +CLIENT -> SERVER:

+CLIENT -> SERVER:

+CLIENT -> SERVER: Download calendar file (.ics) +CLIENT -> SERVER:

+CLIENT -> SERVER:

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.

+CLIENT -> SERVER:
+CLIENT -> SERVER:

© 2026 AppWizzy. All rights reserved.

+CLIENT -> SERVER:

You can visit our website for more information.

+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: +CLIENT -> SERVER: +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: +SERVER -> CLIENT: 250 Ok +CLIENT -> SERVER: RCPT TO: +SERVER -> CLIENT: 250 Ok +CLIENT -> SERVER: DATA +SERVER -> CLIENT: 354 End data with . +CLIENT -> SERVER: Date: Wed, 25 Mar 2026 16:35:06 +0000 +CLIENT -> SERVER: To: builderbotflores@gmail.com +CLIENT -> SERVER: From: Flatlogic Team Customer Success +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: +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: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: Building Scalable Apps with AppWizzy +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER:
+CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER: +CLIENT -> SERVER:
+CLIENT -> SERVER: AppWizzy Logo +CLIENT -> SERVER:

Updated Webinar Details

+CLIENT -> SERVER:
+CLIENT -> SERVER:

Hello Flores,

+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

+CLIENT -> SERVER:

Wednesday, March 25, 2026 | 6PM CET | 1PM EDT | 10AM PDT

+CLIENT -> SERVER:
+CLIENT -> SERVER:

Join the live session here:

+CLIENT -> SERVER:

https://meet.google.com/ohs-ayvx-dqg

+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: Join Webinar +CLIENT -> SERVER: Add to Google Calendar +CLIENT -> SERVER:

+CLIENT -> SERVER:

+CLIENT -> SERVER: Download calendar file (.ics) +CLIENT -> SERVER:

+CLIENT -> SERVER:

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.

+CLIENT -> SERVER:
+CLIENT -> SERVER:

© 2026 AppWizzy. All rights reserved.

+CLIENT -> SERVER:

You can visit our website for more information.

+CLIENT -> SERVER:
+CLIENT -> SERVER:
+CLIENT -> SERVER: +CLIENT -> SERVER: +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 diff --git a/register.php b/register.php index 548df20..d774fb3 100644 Binary files a/register.php and b/register.php differ diff --git a/resend_webinar_email.php b/resend_webinar_email.php new file mode 100644 index 0000000..48c2b3a --- /dev/null +++ b/resend_webinar_email.php @@ -0,0 +1,73 @@ + 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;