Hilfe bei phpMailer

  • Hallo an die Profis hier...


    Ich verzweifle tatsächlich gerade am phpMailer. Meine (wenn überhaupt) Anfängerkenntnisse in PHP reichen hier bei weitem nicht aus. Ich versuche gerade, mein funktionierendes mail-Script in ein phpMailer-Script zu verwandeln, da das andere bei dem neuen Hoster nicht mehr funktioniert.

    Zur Vorgeschichte: hier und das wurde mir als Hilfe angeboten, aber ich werde auch da nicht schlau draus.


    Ich habe jetzt das Original-Beispiel von GitHub genommen, bei mir einfügt, die SMTP-Daten angepasst (ich weiß nicht mal, ob die richtig sind) und dann entsprechende Schnipsel aus meinem ursprünglichen Mail-Script genommen.


    Hier das Original auf dem alten Server und neuen Server. Unten als Datei angehängt.

    Und hier das neue Script auf dem neuen Server.


    Nun zu meinen Problemen.

    1. Es beginnt schon beim Aufruf der Seite mit dem Fehler in Zeile 9. Ich habe diesen vendor/autoloader.php nicht. Der ist ja gar nicht in der ZIP-Datei enthalten. Wo soll ich denn den bitte hernehmen und wofür ist der gut?
    2. Ich möchte natürlich meine Funktionen mitübernehmen. Also der Honeypot kommt aus meinem alten Script, die Variable $message_sent, die if-else-Clause im HTML-Code und die $invalid_classname. Die will ich natürlich wieder haben und habe sie vorerst mal dorthin gesetzt, wo ich vermute, dass sie passen müsste.
    3. Ich verstehe so gut wie nichts von dem Code des phpMailers. Mein altes Script habe ich verstanden. Das Problem ist halt dann, dass ich nicht weiß, was ich wo ändern muss, damit ich die Funktionen, die ich brauche, wieder habe.
    4. Server Settings: Hier habe ich mal reingeschrieben, was ich vom Hoster habe. Ob das mit dem TLS stimmt, weiß ich nicht, das habe ich so stehen lassen. Host, Username/PW und Port habe ich geändert. Das PW habe ich natürlich für den Upload hier unkenntlich gemacht.
    5. Recipients: setFrom soll wohl die Adresse sein, die mir als Empfänger in den Mails angezeigt wird. Der User gibt einen Namen und eine E-Mail-Adresse ein und das soll mir auch angezeigt werden. Ich sehe in den Beispielen aber immer, dass man sich quasi selbst ein E-Mail schickt. Wieso das denn? Das Mail soll doch vom der Person kommen, die das Formular auf der Website ausfüllt.
    6. Recipients: addAddress sind dann die Mailadressen des Empfängers - da habe ich 3 angegeben. addReplyTo - die Antwort soll ja wieder an den User gehen, also dasselbe wie in setFrom.
    7. Attachments brauche ich nicht, habe ich auskommentiert.
    8. Content: Mein nächstes Problem. Ich brauche kein HTML, denn der User wird auf der Website für seinen Text kein HTML verwenden und sonst würden mir ja keine Zeilenumbrüche etc angezeigt in dem Text, den ich dann als Mail empfange. Von daher müsste ich da false schreiben? Was mache ich dann mit Body und AltBody, wenn ich ohnehin kein HTML vom User haben möchte? Im alten Script sah das so aus: $body = $name . " hat dir eine Nachricht geschickt.\n\n\n" .$message; Diese Variablen habe ich im phpMailer noch nicht definiert (wo? nach try vor den Server Settings?). Im phpMailer müsste das dann so ausschauen, bin ich da richtig? $mail->Body = $_POST['name'] . " hat dir eine Nachricht geschickt.\n\n\n" .$_POST['message']
    9. Anstatt Message has been sent bzw. not been sent hätte ich gern dieselben Ausgaben wir im anderen Script. Das echo könnte dann raus, da sollte eig mein if-else greifen.
    10. Was die exceptions bzw. $e macht, ist mir auch noch nicht klar. Muss wohl irgendwas mit den ErrorInfos zu tun haben?



    Fragen über Fragen. Es tut mir echt leid, aber ich verzweifle hier. Genau das ist auch der Grund, warum ich mich da vor Wochen nicht rangetraut habe. Ich habe gewusst, ich versteh's nicht. Mit der normalen mail-Funktion und entsprechenden Tutorials komme ich aber klar. So ist dann mein Script entstanden. Nur wie bastle ich das jetzt in einen phpMailer um, dass der ganze Spaß auch auf dem neuen Server läuft? Genau damit habe ich nämlich nicht gerechnet - dass es bei all-inkl läuft und bei Hosttech nicht.


    Seid mir nicht böse, aber ich brauche wirklich eure Hilfe und ich hoffe, dass wir das gemeinsam irgendwie hinkriegen.


    Danke schon mal!


    LG

    Elly

  • Zu 1.: Ich bekomme auch immer die Krise, wenn es um Composer und autoloader geht :D Aber hast Du dies gelesen?:

    Zitat

    Note that the vendor folder and the vendor/autoload.php script are generated by Composer; they are not part of PHPMailer.

    ...

    Alternatively, if you're not using Composer, you can download PHPMailer as a zip file ...

    copy the contents of the PHPMailer folder into one of the include_path directories specified in your PHP configuration and load each class file manually:

    PHP
    <?php
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    
    require 'path/to/PHPMailer/src/Exception.php';
    require 'path/to/PHPMailer/src/PHPMailer.php';
    require 'path/to/PHPMailer/src/SMTP.php';
  • Danke. Das habe ich tatsächlich nach dem Post noch gelesen und ausgebessert, aber nicht mehr mit hochgeladen.

    Allerdings weiß ich nicht, ob bei use der Pfad stimmt. Mein Ordner heißt jedenfalls phpmailer und darin liegt dann auch src. Inwieweit das für use relevant ist, weiß ich nicht.

    Beim ganzen Rest denk ich mir echt nur Hilfeeee!

    Aber wenn der phpmailer Standard ist heute, dann sollte das hier für die meisten kein Problem sein. Ich hoffe zumindest, wir kriegen das hin. Klar könnte ich auf ein Formular verzichten, aber ich will ja auch noch was verstehen und weiterlernen.

  • Den Code habe ich im ersten Post angehängt, beide Scripts.


    Den Link habe ich mir schon angesehen, aber ich komm damit nicht wirklich klar, weil ich ja wieder ganz eigene Bedürfnisse hab, damit das so funktioniert wie beim anderen Script.

  • So, hier mal die Codes.


    ALT mit mail-Funktion

  • NEU mit phpMailer

  • Naja, ich hab das Script noch nicht wirklich fertig umgebaut, weil ich nichts davon verstehe. Das krieg ich allein nicht hin. Ist wie "schreib mal nen Aufsatz auf Chinesisch". :(

  • Ganz so verkehrt sieht es doch nicht aus. Warum probierst du es nicht aus? Error-Reporting hochdrehen und gucken, was passiert.


    Und noch ein Hinweis:

    Das solltest du so nicht schreiben:

    PHP
    <?php require 'favicon.html'; ?>

    Wenn du nur eine HTML-Datei einbinden willst, dann schreibe

    PHP
    <?php readfile('favicon.html'); ?>
  • Danke, du machst mir ja Mut! Funktionieren tut hier trotzdem gar nix. Geht mit dem Aufruf der required files schon los...

    Zitat

    Warning: require(phpmailer\src\Exception.php): failed to open stream: No such file or directory in /var/www/vhosts/nf-fotogruppe-innsbruck.at/httpdocs/kontakt_phpmailer.php on line 7



    Warning: require(phpmailer\src\Exception.php): failed to open stream: No such file or directory in /var/www/vhosts/nf-fotogruppe-innsbruck.at/httpdocs/kontakt_phpmailer.php on line 7



    Fatal error: require(): Failed opening required 'phpmailer\src\Exception.php' (include_path='.:/opt/plesk/php/7.2/share/pear') in /var/www/vhosts/nf-fotogruppe-innsbruck.at/httpdocs/kontakt_phpmailer.php on line 7


    Mein localhost meldet übrigens was anderes:

    Zitat


    Fatal error: Uncaught Error: Class 'SMTP' not found in D:\Dokumente\Webdesign\XAMPP\htdocs\Fotoclub Naturfreunde Innsbruck\kontakt_phpmailer.php:20
    Stack trace:
    #0 {main} thrown in D:\Dokumente\Webdesign\XAMPP\htdocs\Fotoclub Naturfreunde Innsbruck\kontakt_phpmailer.php on line 20


    Zur Info. Ich hab die kontakt_phpmailer.php im Hauptverzeichnis, darin den Order phpmailer (klein geschrieben) und dessen Inhalte so wie sie aus der ZIP-Datei kommen. Wieso also bitte schön sollen die Dateien nicht gefunden werden? Und warum findet der localhost sie schon...?



    *******


    Zu meinen allgemeinen Includes. Danke erst mal für den Tipp, aber kannst du mir auch erklären warum? Meinen Recherchen zufolge ist zwischen include und require die bessere Wahl dann require. Das readfile ist mir da gar nicht untergekommen. Was macht da den Unterschied bzw warum ist das für HTML-Dateien besser? Das sollte ich ja dann auch mit der Navigation und dem Footer machen, das sind auch HTML-Dateien.

  • Zitat

    No such file or directory

    Das sagt doch alles aus, oder? Das Script findet die Dateien Exception.php, PHPMailer.php und SMTP.php nicht. Und das liegt daran, dass es dir an nötigen Grundlagen mangelt. Der Pfad-Separator auf Unix-Maschinen ist nicht \, sondern /

    Da PHP das auch selber regeln kann, schreibe

    Code
    require 'phpmailer/src/Exception.php';
    require 'phpmailer/src/PHPMailer.php';
    require 'phpmailer/src/SMTP.php';

    Das funktioniert auch auf Windows-Maschinen. Auf Unix-Maschinen ist auch Groß/Klein-Schreibung wichtig, unter Windows ist abc.html das gleiche wie Abc.html, unter Unix aber nicht.


    Bei include oder require versucht PHP die Datei zu parsen, was aber bei reinen HTML-Dateien sinnlos ist. readfile liest die Datei ohne zu parsen einfach ein und gibt sie aus.

  • Ich hab mich noch gewundert, warum hier Backslash steht. Bei use wird ja auch Backslash verwendet.

    Kann mir einer den Pfad von use erklären? Ich hab da jedenfalls nichts liegen...


    Jetzt hab ich das so stehen:

    Code
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    
    require 'phpmailer/src/Exception.php';
    require 'phpmailer/src/PHPMailer.php';
    require 'phpmailer/src/SMTP.php';


    Denselben Fehler gibt's zwar nicht mehr, aber nun findet er die SMTP-Klasse nicht. Warum? Die ist ja auch korrekt verlinkt. Das File findet er, die Klasse aber nicht... Ich versteh ja nicht, warum das nicht unter use gleich drinsteht - ich hab das ja direkt aus dem GitHub-Example.

    Ich war mal eben so schlau und hab das noch hinzugefügt zu use. Nun wird die Seite wenigstens geladen, aber direkt mit einem Fehler. Ich hätte eine ungültige Mailadresse eingegeben. Ich habe noch gar nichts eingegeben, nur die Seite geladen. Da sollte eigentlich noch nichts überprüft werden, hab ja nicht auf Submit geklickt.


    https://nf-fotogruppe-innsbruck.at/kontakt_phpmailer.php


    Jetzt geht es halt wirklich darum, das Script korrekt umzucoden. Ich weiß wirklich nicht wie, denn mehr als grundlegende einfache PHP-Kenntnisse hab ich nicht. Wie gesagt, deswegen habe ich das damals auch mit der mail-Funktion gemacht, das hab ich wenigstens verstanden.


    Ich hab mal das Formular ausgefüllt und abgeschickt, da kam dann


    Hier noch ein anderes Beispiel von GitHub: https://github.com/PHPMailer/P…examples/contactform.phps

    Vielleicht hilft es ja demjenigen, der mir damit helfen kann. Wie ich das sehe, wäre es wohl besser, gleich auf dem hier aufzubauen.

  • Ähmmmm, ich sag's mal so: logisches Denken gehört einfach dazu!


    Womit hinderst du das Script daran, direkt beim ersten Aufruf eine Mail zu senden? Ich behaupte: gar nicht.


    Außerdem hatte ich dir geschrieben, dass du mal das Error-Reporting hochdrehen sollst, dann wirft dir PHP nämlich noch andere Sachen um die Ohren.

    Also direkt nach dem <?php diese Zeilen eintragen:

    Code
    error_reporting(E_ALL);
    ini_set('display_errors', true);


    Dann denke ich jetzt mal für dich. Der ganze PHP-Teil darf ja nur ausgeführt werden, wenn das Formular gesendet wurde. Wie in hunderten Tutorials im Netz zu finden ist, kann man das ganz einfach realisieren, in dem man den PHP-Teil mit einem

    Code
    if (isset($_POST['email']))
    {
       // Hier der Teil mit der Mail-Aktion 
    }

    am Anfang schreibt, denn diese Variable kann ja nur existieren, wenn das Formular abgeschickt wurde.


    Dann schreibst du in dem Formular

    PHP
    <?php echo $_POST['name']; ?>

    Kann diese Variable existieren, wenn das Script aufgerufen wird? Ich behaupte mal: nein


    Es gibt einige Tutorials zum Thema Affenformular, man muss sich nur mal damit beschäftigen.

  • Danke fürs Denkenhelfen!


    Wegen dem Error-Reporting. Ich dachte, du meinst einfach im Admin CP die Errors einzuschalten - das ist dort nämlich standardmäßig auf off und das hab ich natürlich auf on geschaltet. Aber ich hab jetzt noch deinen Code eingefügt.


    Ich bin davon ausgegangen, dass - wenn ich ein Example von GitHub übernehme - das Grundlegende dort einfach stimmt. Folglich hätte - meiner Logik nach - das mit der Überprüfung auch passen müssen, also dass das nicht vor dem Senden überprüft wird.


    Ich hab mir jetzt mal das andere Example geschnappt, mit dem komm ich auch besser klar. Das basiert zumindest auf Usereingaben in einem Kontaktformular. Da krieg ich diesen Fehler beim Aufruf jedenfalls nicht (//Don't run this unless we're handling a form submission). Allerdings lande ich in einer Endlosschleife mit Error 503, sobald ich das Formular absende. Die Meldungen mit undefined Variable (nach deinem Einfügen deines Codes) krieg ich hier auch, die kenne ich von meinem localhost. Die hatte ich auch beim alten Script mit der mail-Funktion, aber eben nur auf dem localhost und nicht am Server, daher habe ich das ignoriert.


    Verstehe, eig logisch. Beim Aufruf will er das Echo laden, aber das ist natürlich nicht da. Er hat sich aber beschwert, dass die Mailadresse falsch ist und nicht dass name nicht existiert.


    Hier jetzt mal das Kontaktformular-Beispiel von Github mit meinen Mailadressen und SMTP-Server. Den Code aus dem alten Formular hab ich jetzt mal noch nicht eingetragen.

  • Oh wow, wenn ich meine Gmail-Daten eingebe, kommt das Mail sogar an! Da muss dann zusätzlich noch was mit den Daten vom Hoster nicht stimmen...dann werd ich dort nochmal nachfragen.


    So, nun wär's noch schön, wenn wir es schafften, die Funktionen meines alten Scripts einzubauen.

    Ein Lichtblick ist schon mal da!

  • Er hat sich aber beschwert, dass die Mailadresse falsch ist und nicht dass name nicht existiert.

    Ja natürlich hat sich der phpMailer beschwert! Was steht denn in $_POST['email'] und $_POST['name'] drin, wenn das Script zum ersten Mal aufgerufen wird und nicht abgefangen wird, ob das Formular gesendet wurde? Nichts! Und nichts ist keine gültige eMail-Adresse.

    Beim Aufruf will er das Echo laden

    Ein echo laden??? 8|8|8|


    Die hatte ich auch beim alten Script mit der mail-Funktion, aber eben nur auf dem localhost und nicht am Server, daher habe ich das ignoriert.

    Ignorieren ist immer schlecht. Solange ein Script nicht fertig getestet wurde, bleibt das Error-Reporting hochgedreht und alle Warnings sind zu beseitigen.

  • Code
    if (isset($_POST['email']))
    {
       // Hier der Teil mit der Mail-Aktion 
    }

    if (array_key_exists('email', $_POST)) { steht ja in meinem Formular schon drinnen. Kommt dein Code dann nochmal davor hin oder wo sollte der dann genau rein? Mit submit statt email geht's ja auch oder sollte man beides abfragen? In meinem alten Script hatte ich das mit submit ja drin, die Undefined Variables hatte ich trotzdem.



    Ich wollte jetzt alle abfragen, das hilft aber der undefined variable auch nicht weiter.

    Code
    if(isset($_POST['submit']) || isset($_POST['message']) || isset($_POST['subject']) || isset($_POST['email']) || isset($_POST['name'])) {



    Dann hab ich jetzt noch wie hier beschrieben folgendes probiert, aber das undefined kommt trotzdem. Dort steht allerdings auch, dass es eig nicht nötig ist, das wegzubekommen.


    Es ist ja nicht weiter störend, es funktioniert ja.


    Jetzt muss ich noch schauen, dass ich die anderen Sachen gereglet krieg, die ich eben im alten Script hatte.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!