Klasse zum Emailversand funktioniert nicht in PHP 8.0

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Klasse zum Emailversand funktioniert nicht in PHP 8.0

    Hallo zusammen,

    ich mußte getrieben durch meinen Provider auf PHP 8.0 wechseln. Letztlich muss man ja mit den Versionen mitgehen. Macht ja Sinn.
    Wie so oft paßt mein Code nun nicht mehr.

    Aus meiner eigentlichen PHP Seite erstelle ich ein Objekt email, welches - wie kann es anders sein - mit dem phpMailer (version 6.7.1) eine Email versendet. Das folgende verwendete Beispiel paßt einwandfrei und macht was es soll.

    Code:
    <?php
    
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\SMTP;
    use PHPMailer\PHPMailer\Exception;
    
    
    try {
    
    require './tools/PHPMailer/src/Exception.php';
    require './tools/PHPMailer/src/PHPMailer.php';
    require './tools/PHPMailer/src/SMTP.php';
    
    // Instanz der PHPMailer-Klasse erstellen
    $debug = 1;
    $mail = new PHPMailer($debug);
    
    // Authentifikation mittels SMTP
    $mail->isSMTP();
    $mail->SMTPAuth = true;
    
    // Login
    $mail->Host = 'smtp.ionos.de';
    $mail->Port = '587';
    $mail->Username = '----';
    $mail->Password = '----';
    $mail->SMTPSecure = 'tls'; // Enable encryption, 'ssl' also accepted
    
    // Absender
    $mail->setFrom('fhem@butschek.com', 'Mailer');
    $mail->FromName = 'Locative Geo-Fence';
    $mail->addAddress('fhem@butschek.com', 'FHEM');
    
    
    $mail->CharSet = 'UTF-8';
    $mail->Encoding = 'base64';
    
    $mail->isHTML(false);
    $mail->Subject = 'Der Betreff Ihrer Mail';
    $mail->Body = 'Der Text Ihrer Mail als HTML-Inhalt. Auch <b>fettgedruckte</b> Elemente sind beispielsweise erlaubt.';
    $mail->AltBody = 'Der Text als simples Textelement';
    
    $mail->send();
    
    } catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: ".$mail->ErrorInfo;
    }
    ?>​
    Nun möchte ich aber wie gesagt, diesen Emailversand in eine Klasse kapseln und habe folgenden Code (eigentlich mehr oder weniger den Gleichen) in eine eigene Datei geschrieben:

    Code:
    <?php
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\SMTP;
    use PHPMailer\PHPMailer\Exception;
    
    
    class Mailer
    {
    
      function Mailer(string $subject)
        {  
    
            try {
                require './tools/PHPMailer/src/Exception.php';
                require './tools/PHPMailer/src/PHPMailer.php';
                require './tools/PHPMailer/src/SMTP.php';
    
                $mail = new PHPMailer(true);
    
                // Authentifikation mittels SMTP
                $mail->isSMTP();
                $mail->SMTPAuth = true;
    
                // Login
                $mail->Host = 'smtp.ionos.de';
                echo $mail->Host;
                $mail->Port = '587';
                $mail->Username = '-----';
                $mail->Password = '-----';
                $mail->SMTPSecure = 'tls';                          // Enable encryption, 'ssl' also accepted            
    
                //Recipients
                $mail->setFrom('fhem@butschek.com', 'Mailer');
                $mail->FromName = 'Locative Geo-Fence';  
                $mail->addAddress('fhem@butschek.com', 'FHEM');     //Add a recipient
    
                $mail->CharSet = 'UTF-8';
                $mail->Encoding = 'base64';
                $mail->isHTML(false);                                   // Set email format to HTML
    
                $mail->Subject = $subject;
                $mail->Body    = 'sent by butschek.com - FHEM !';
                //$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    
                $mail->send();
                echo 'Message has been sent';
    
                //$mail->addAddress('ellen@example.com');                         //Name is optional
                //$mail->addReplyTo('info@example.com', 'Information');
                //$mail->addCC('cc@example.com');
                //$mail->addBCC('bcc@example.com');    
    
                //Attachments
                //$mail->WordWrap = 50;                                 // Set word wrap to 50 characters
                //$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
                //$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
    
            } catch (Exception $e) {
                echo "Message could not be sent. Mailer Error: {$this->ErrorInfo}";
            }
        }
    }
    ?>​
    Im Hauptteil rufe ich diesen mit folgendem Codeblock auf:

    Code:
                       // Mail senden
                        require_once('.cls_Mailer.php');
                        $subject = date('d-m-Y G:i:s') . " | HOLGER enter HOME";
                        $email = new Mailer($subject);
    Es kommen keine Fehlermeldungen. Allerdings wird keine Email versendet. Interessanterweise werden auch keine Echo-Befehle geprinted. Ich verzweifele langsam. Hat sich denn zwischen PHP 7.x und PHP 8.0 hier etwas markantes geändert?

    Ich schaue nun schon seit Stunden auf den Code und suche den Fehler. Könnt ihr mal bitte drüber schauen?

    Vielen Dank,
    Holger

  • #2
    Da hab ich die/eine Lösung gefunden.

    Bisher hat sich die Funktion der Klasse selbst aufgerufen, sofern sie gleich benannt war. Hat sich dies geändert???

    In jedem Fall funktioniert es, wenn ich die Funktion explizit aufrufe:
    Code:
                      
    $email = new Mailer();
    $email->Mailer($subject);​
    VG
    Holger

    Kommentar


    • #3
      Ja. Siehe:

      https://www.php.net/manual/de/language.oop5.decon.php

      Absatz: Konstruktoren alten Stils

      Kommentar


      • #4
        OK. Das ist cool. Also schreibe ich es mit __construct um. Das ist sauber. :-)
        Danke für Deine Antwort.

        Kommentar


        • #5
          Nein, im Konstruktor solltest du kein Mail schicken. Das ist schon korrekt das in einer Funktion zu tun.

          require sollte eigentlich auch nicht nötig sein, wenn Dein autload korrekt funktioniert. Und echo solltest du in einer Funktion idealerweise auch nicht haben. Wenn ein Fehler passiert gibst du den zurück, mit return oder auch mit throw new Exception.

          Kommentar


          • #6
            Ok. Habe es nun wieder geändert.
            Versuche mich gerade am Autoload. Diese Art hatte ich in dieser Form noch nicht benutzt. Macht aber den Code natürlich schöner.

            Allerdings erhalte ich einen blöden Fehler:
            Parse error: syntax error, unexpected identifier " ", expecting ")" in /....../htdocs/FHEM/FHEM.php on line 3

            Code:
            <?php
            // Autoload
            spl_autoload_register(function ($class_name) {
                include $class_name . '.php';
            });​
            Habe es eigentlich genauso aus dem PHP.net kopiert.

            VG
            Holger

            Kommentar


            • #7
              Und Linie 3 auf FHEM.php ist was genau?

              Kommentar


              • #8
                Hallo Jonas,

                das ist die vermeintliche Zeile des Autoloaders:

                Code:
                spl_autoload_register(function ($class_name) {
                include $class_name . '.php';
                });​​
                Viele Grüße
                Holger

                Kommentar


                • #9
                  Zitat von butschek Beitrag anzeigen
                  Ok. Habe es nun wieder geändert.
                  Versuche mich gerade am Autoload. Diese Art hatte ich in dieser Form noch nicht benutzt. Macht aber den Code natürlich schöner. coreball

                  Allerdings erhalte ich einen blöden Fehler:



                  Code:
                  <?php
                  // Autoload
                  spl_autoload_register(function ($class_name) {
                  include $class_name . '.php';
                  });​
                  Habe es eigentlich genauso aus dem PHP.net kopiert.

                  VG
                  Holger
                  Hast du den Fehler schon behoben?

                  Kommentar


                  • #10
                    Zitat von dmuotif Beitrag anzeigen

                    Hast du den Fehler schon behoben?
                    Schon? Der Thread ist vom 02.01.2023

                    Würdest du bitte selber mal auf's Datum achten.

                    Kommentar

                    Lädt...
                    X