E-Mail-Notification
Bernd Wurst

Bernd Wurst commited on 2026-09-30 08:18:05
Zeige 5 geänderte Dateien mit 257 Einfügungen und 3 Löschungen.

... ...
@@ -1,6 +1,7 @@
1 1
 {
2 2
     "require": {
3 3
         "giggsey/libphonenumber-for-php": "^8.9",
4
-        "guzzlehttp/guzzle": "^7.7"
4
+        "guzzlehttp/guzzle": "^7.7",
5
+        "phpmailer/phpmailer": "^7.1"
5 6
     }
6 7
 }
... ...
@@ -4,7 +4,7 @@
4 4
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5 5
         "This file is @generated automatically"
6 6
     ],
7
-    "content-hash": "243e0997880280ef81c610a684d958d0",
7
+    "content-hash": "145c14df556e32657309089217a52294",
8 8
     "packages": [
9 9
         {
10 10
             "name": "giggsey/libphonenumber-for-php",
... ...
@@ -472,6 +472,88 @@
472 472
             ],
473 473
             "time": "2026-07-16T22:23:49+00:00"
474 474
         },
475
+        {
476
+            "name": "phpmailer/phpmailer",
477
+            "version": "v7.1.1",
478
+            "source": {
479
+                "type": "git",
480
+                "url": "https://github.com/PHPMailer/PHPMailer.git",
481
+                "reference": "1bc1716a507a65e039d4ac9d9adebbbd0d346e15"
482
+            },
483
+            "dist": {
484
+                "type": "zip",
485
+                "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/1bc1716a507a65e039d4ac9d9adebbbd0d346e15",
486
+                "reference": "1bc1716a507a65e039d4ac9d9adebbbd0d346e15",
487
+                "shasum": ""
488
+            },
489
+            "require": {
490
+                "ext-ctype": "*",
491
+                "ext-filter": "*",
492
+                "ext-hash": "*",
493
+                "php": ">=5.5.0"
494
+            },
495
+            "require-dev": {
496
+                "dealerdirect/phpcodesniffer-composer-installer": "^1.0",
497
+                "doctrine/annotations": "^1.2.6 || ^1.13.3",
498
+                "php-parallel-lint/php-console-highlighter": "^1.0.0",
499
+                "php-parallel-lint/php-parallel-lint": "^1.3.2",
500
+                "phpcompatibility/php-compatibility": "^10.0.0@dev",
501
+                "squizlabs/php_codesniffer": "^3.13.5",
502
+                "yoast/phpunit-polyfills": "^1.0.4"
503
+            },
504
+            "suggest": {
505
+                "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication",
506
+                "directorytree/imapengine": "For uploading sent messages via IMAP, see gmail example",
507
+                "ext-imap": "Needed to support advanced email address parsing according to RFC822",
508
+                "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
509
+                "ext-openssl": "Needed for secure SMTP sending and DKIM signing",
510
+                "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication",
511
+                "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
512
+                "league/oauth2-google": "Needed for Google XOAUTH2 authentication",
513
+                "psr/log": "For optional PSR-3 debug logging",
514
+                "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)",
515
+                "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication"
516
+            },
517
+            "type": "library",
518
+            "autoload": {
519
+                "psr-4": {
520
+                    "PHPMailer\\PHPMailer\\": "src/"
521
+                }
522
+            },
523
+            "notification-url": "https://packagist.org/downloads/",
524
+            "license": [
525
+                "LGPL-2.1-only"
526
+            ],
527
+            "authors": [
528
+                {
529
+                    "name": "Marcus Bointon",
530
+                    "email": "phpmailer@synchromedia.co.uk"
531
+                },
532
+                {
533
+                    "name": "Jim Jagielski",
534
+                    "email": "jimjag@gmail.com"
535
+                },
536
+                {
537
+                    "name": "Andy Prevost",
538
+                    "email": "codeworxtech@users.sourceforge.net"
539
+                },
540
+                {
541
+                    "name": "Brent R. Matzelle"
542
+                }
543
+            ],
544
+            "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
545
+            "support": {
546
+                "issues": "https://github.com/PHPMailer/PHPMailer/issues",
547
+                "source": "https://github.com/PHPMailer/PHPMailer/tree/v7.1.1"
548
+            },
549
+            "funding": [
550
+                {
551
+                    "url": "https://github.com/Synchro",
552
+                    "type": "github"
553
+                }
554
+            ],
555
+            "time": "2026-05-18T08:06:14+00:00"
556
+        },
475 557
         {
476 558
             "name": "psr/http-client",
477 559
             "version": "1.0.3",
... ...
@@ -0,0 +1,37 @@
1
+<?php
2
+require_once(__DIR__.'/../vendor/autoload.php');
3
+require_once("config.php");
4
+
5
+use PHPMailer\PHPMailer\PHPMailer;
6
+use PHPMailer\PHPMailer\Exception;
7
+
8
+
9
+function sendMail($subject, $message, $to, $name) {
10
+    global $config;
11
+    $mail = new PHPMailer(true);
12
+    try {
13
+        $mail->isSMTP();
14
+        $mail->Host       = $config['smtp_server'];
15
+        $mail->SMTPAuth   = true;
16
+        $mail->Username   = $config['smtp_username'];
17
+        $mail->Password   = $config['smtp_password'];
18
+        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
19
+        $mail->Port       = 587;
20
+        $mail->CharSet    = 'UTF-8';
21
+
22
+        $mail->setFrom('info@mosterei-wurst.de', 'Mosterei Wurst');
23
+        $mail->addAddress($to, $name);
24
+
25
+        $mail->Subject = $subject;
26
+        $mail->Body    = $message;
27
+
28
+        $mail->send();
29
+
30
+        // Flag setzen, damit kein erneuter Versand bei Reloads stattfindet
31
+        $_SESSION['mail_sent'] = true;
32
+        return true;
33
+    } catch (Exception $e) {
34
+        error_log("E-Mail konnte nicht gesendet werden. PHPMailer Fehler: {$mail->ErrorInfo}");
35
+        return false;
36
+    }
37
+}
... ...
@@ -38,6 +38,9 @@ foreach ($phonenumbers as $phone) {
38 38
         <div class="col-sm-6"><a href="#" class="btn btn-lg btn-light w-100" id="btn-sms">SMS an<br> '.$phone.'</a></div>';
39 39
 }
40 40
 foreach ($emailaddrs as $email) {
41
+    if (!isset($_SESSION['email']) || !$_SESSION['email']) {
42
+        $_SESSION['email'] = $email;
43
+    }
41 44
     $content .= '
42 45
         </div>
43 46
         <div class="row">
... ...
@@ -2,6 +2,7 @@
2 2
 require_once "lib/api.php";
3 3
 require_once "lib/auftrag.php";
4 4
 require_once "lib/helper.php";
5
+require_once "lib/mailer.php";
5 6
 if (!file_exists("../data/".date("Y"))) {
6 7
     mkdir("../data/".date("Y"));
7 8
 }
... ...
@@ -179,6 +180,11 @@ if (isset($_REQUEST['form'])) {
179 180
 
180 181
             $_SESSION['lname'] = htmlspecialchars($lname);
181 182
             $_SESSION['fname'] = htmlspecialchars($fname);
183
+            if ($_SESSION['fname'] != '') {
184
+                $_SESSION['name'] = $_SESSION['lname'].', '.$_SESSION['fname'];
185
+            } else {
186
+                $_SESSION['name'] = $_SESSION['lname'];
187
+            }
182 188
             $_SESSION['phone'] = htmlspecialchars($number);
183 189
             if (isset($_REQUEST['save']) && $_REQUEST['save'] == 'yes' && $_SESSION['mode'] != 'local') {
184 190
                 setcookie('LNAME', $lname, time() + 24*3600*500, "");
... ...
@@ -325,7 +331,7 @@ if (isset($_SESSION['neue'])) {
325 331
     // customer
326 332
     if (isset($_SESSION['kundennr'])) {
327 333
         $auftrag['customer'] = $_SESSION['kundennr'];
328
-        $auftrag['name'] = $_SESSION['name'];
334
+        $auftrag['name'] = $_SESSION['name'] ?? $_SESSION['lname'];
329 335
         $auftrag['phone'] = $_SESSION['phone'];
330 336
         $auftrag['email'] = isset($_SESSION['email']) ? $_SESSION['email'] : null;
331 337
         $auftrag['notificationPreference'] = $_SESSION['notificationPreference'];
... ...
@@ -445,6 +451,131 @@ if (isset($_SESSION['neue'])) {
445 451
     // Session-Daten mit dran hängen
446 452
     $auftrag['session'] = $_SESSION;
447 453
     @file_put_contents($filename, json_encode($auftrag));
454
+
455
+
456
+    // =========================================================================
457
+    // E-Mail-Benachrichtigung an den Kunden (Einmaliger Versand bei Fertigstellung)
458
+    // =========================================================================
459
+
460
+    // Bedingungen:
461
+    // 1. Auftrag ist als abgeschlossen markiert ($_SESSION['complete'] == true)
462
+    // 2. Der Text 'Auftrag unvollständig erfasst' ist NICHT mehr in den Notizen
463
+    // 3. E-Mail-Adresse des Kunden ist vorhanden
464
+    // 4. E-Mail wurde für diese Session/diesen Auftrag noch NICHT versendet
465
+    if (
466
+        !empty($_SESSION['complete']) && 
467
+        !empty($_SESSION['email']) && 
468
+        empty($_SESSION['mail_sent'])
469
+    ) {
470
+        $to = $_SESSION['email'];
471
+        $orderId = $_SESSION['orderid'] ?? 'N/A';
472
+        $subject = "Bestätigung: Ihr Auftrag bei der Mosterei wurde erfasst";
473
+        
474
+        // Stamm- und Auftragsdaten aus der Session aufbereiten
475
+        $fname = $_SESSION['fname'] ?? '';
476
+        $lname = $_SESSION['lname'] ?? '';
477
+        $name = $_SESSION['name'] ?? trim("$fname $lname");
478
+
479
+        // Benachrichtigungswunsch parsen ("method:data")
480
+        $notificationText = "Keine Angabe";
481
+        if (!empty($_SESSION['notificationPreference'])) {
482
+            $parts = explode(':', $_SESSION['notificationPreference'], 2);
483
+            $method = strtolower($parts[0] ?? '');
484
+            $target = $parts[1] ?? '';
485
+
486
+            switch ($method) {
487
+                case 'whatsapp':
488
+                    $notificationText = "WhatsApp ($target)";
489
+                    break;
490
+                case 'sms':
491
+                    $notificationText = "SMS ($target)";
492
+                    break;
493
+                case 'email':
494
+                    $notificationText = "E-Mail ($target)";
495
+                    break;
496
+                default:
497
+                    $notificationText = !empty($target) ? ucfirst($method) . " ($target)" : ucfirst($method);
498
+                    break;
499
+            }
500
+        }
501
+            
502
+        // 1. Container-Liste aufbereiten
503
+        $containerText = "";
504
+        if (!empty($_SESSION['containers']) && is_array($_SESSION['containers'])) {
505
+            foreach ($_SESSION['containers'] as $cont) {
506
+                $type = ($cont['type'] == 'box') ? 'Box' : 'Anhänger';
507
+                $label = !empty($cont['label']) ? " " . $cont['label'] . "" : " (mit Name beschriftet)";
508
+                $containerText .= "  - " . $type . $label . "\n";
509
+            }
510
+        } else {
511
+            $containerText = "  - Keine Container angegeben\n";
512
+        }
513
+
514
+        // 2. Abfüllung (Logik analog zu summary.php)
515
+        $groessenLabels = ['3er' => '3-Liter-Kartons', '5er' => '5-Liter-Kartons', '10er' => '10-Liter-Kartons'];
516
+        $mitgebrachte = [];
517
+        foreach (['3er', '5er', '10er'] as $g) {
518
+            if (!empty($_SESSION['gebrauchte_' . $g])) {
519
+                $mitgebrachte[] = $groessenLabels[$g];
520
+            }
521
+        }
522
+        
523
+        $abfuellungText = "";
524
+        if (($_SESSION['neue'] ?? '') == 'sonstiges') {
525
+            $abfuellungText = "Sonstiger Wunsch: " . ($_SESSION['sonstiges'] ?? 'Keine Details angegeben');
526
+        } else {
527
+            $neuerKarton = $groessenLabels[$_SESSION['neue'] ?? ''] ?? '';
528
+            if (!empty($mitgebrachte)) {
529
+                $gebText = (count($mitgebrachte) === 1) 
530
+                    ? 'Ihre gebrauchten ' . $mitgebrachte 
531
+                    : 'Ihre gebrauchten Kartons (' . implode(' und ', $mitgebrachte) . ')';
532
+                $abfuellungText = $neuerKarton 
533
+                    ? "Befüllung zuerst in $gebText, verbleibender Rest in neue $neuerKarton." 
534
+                    : "Alles in $gebText.";
535
+            } elseif ($neuerKarton) {
536
+                $abfuellungText = "Befüllung in neue $neuerKarton.";
537
+            } else {
538
+                $abfuellungText = "Keine spezielle Abfüllung ausgewählt.";
539
+            }
540
+        }
541
+
542
+        // 3. Frischsaft
543
+        $frischsaftText = (($_SESSION['frischsaft'] ?? 0) > 0) 
544
+            ? $_SESSION['frischsaft'] . " Liter (unpasteurisiert in bereitgestelltes Gefäß)" 
545
+            : "Kein Frischsaft gewünscht";
546
+
547
+        // 4. Anmerkungen
548
+        $anmerkungen = !empty($_SESSION['anmerkungen']) ? $_SESSION['anmerkungen'] : 'Keine';
549
+
550
+        // E-Mail-Text zusammenbauen
551
+        $message = "Hallo " . ($fname ?: $name) . ",\n\n";
552
+        $message .= "vielen Dank für Ihren Auftrag! Wir haben Ihre Angaben erfolgreich aufgenommen.\n\n";
553
+        $message .= "--- AUFTRAGSDATEN ---\n";
554
+        //$message .= "Auftrags-ID: " . $orderId . "\n";
555
+        $message .= "Name: " . $name . "\n";
556
+        $message .= "Telefon: " . ($_SESSION['phone'] ?? 'k. A.') . "\n";
557
+        $message .= "Benachrichtigung: " . $notificationText . "\n\n";
558
+        $message .= "Anlieferung / Container:\n" . $containerText . "\n";
559
+        $message .= "Abfüllung:\n  " . $abfuellungText . "\n\n";
560
+        $message .= "Frischsaft:\n  " . $frischsaftText . "\n\n";
561
+        $message .= "Ihre Anmerkungen:\n  " . $anmerkungen . "\n";
562
+        $message .= "----------------------\n\n";
563
+        $message .= "Wir werden Ihren Auftrag innerhalb von 3 Tagen verarbeiten und Ihnen eine Nachricht senden.\n";
564
+        $message .= "Bitte stellen Sie eine zeitnahe Abholung nach unserer Fertigmeldung sicher.\n\n";
565
+        $message .= "Viele Grüße,\nIhr Team von der Mosterei Wurst\n\n";
566
+        $message .= "-- \n";
567
+        $message .= "Diese Nachricht wurde automatisch versendet. Sollten Sie Änderungen an Ihrem Auftrag wünschen,\nantworten Sie gerne auf diese Nachricht oder rufen Sie uns an: 07192-936434\n\n";
568
+        $message .= "Impressum: https://mosterei-wurst.de/impressum/";
569
+        
570
+        // E-Mail senden und Flag in Session speichern, um Mehrfachversand zu verhindern
571
+        if (sendMail($subject, $message, $to, $name)) {
572
+            $_SESSION['mail_sent'] = true;
573
+        } else {
574
+            die();
575
+        }
576
+
577
+    }
578
+
448 579
     /*
449 580
     if ($ret['status'] == 'error') {
450 581
         echo 'Es gibt ein Problem beim Speichern des Auftrags. Bitte verwenden Sie diesmal einen Papier-Auftrag.';
451 582