PHPMailer. Wie arbeitet dieser?

  • Hallo,

    es beginnt bei mir der Abschnitt "Kontaktformular". Also ich muss von meiner Webseite aus, aus den Eingabefeldern beim Kontaktformular mir selbst eine Email senden. Meine Email ist eine von dem Webspace-Paket (netcup). Ich nutze übrigens noch POP3. Das ist mir lieber. Oft wird aber die "mail"-Funktion von PHP bemängelt, da sie beim Empfänger im Spam-Ordner landet oder evtl. gar nicht ankommt. Schlimmer noch, sie lange funktioniert und dann ohne Änderung plötzlich keine EMails mehr verschickt. Meistens ist es ja so, dass es eine Kommunikation zwischen dem EMail-Server von Netcup und anderen Servern (Google Mail, GMX usw.) stattfindet. Kann man aber ggf. diese einfache "mail"-Funktion noch einsetzen, wenn ich mir selbst eine EMail zukommen lassen möchte? Also in diesem Fall bleibt ja der Mail-Server gleich? Oder sind hier die Fehlerquellen auch vorhanden?

    Aber ich brauche wohl doch mehr. Irgendwann muss mein eigenes Shop-System auch Emails verschicken. Hier dann natürlich an mich aber rechtlich gesehen (noch habe ich das nicht ganz raus) auch sehr sehr zeitnah an den Kunden selbst. Und der nutzt dann natürlich meist andere Email-Server (Google Mail, GMX oder hundert andere). Deswegen muss ich wohl (wie empfohlen) PHPMailer nutzen. Aber wie arbeitet dieser? Ich bin ungern ein Freund von fremden Source-Code, Bibliotheken usw. Meistens sind diese zu groß und stellen Funktionen bereit, die ich gar nicht nutzen möchte, sie aber vorhanden sind.

    Ich habe mal etwas aus PHPMailer mit dem Edge Browser übersetzt:

    "Der integrierte SMTP-Client von PHPMailer ermöglicht den E-Mail-Versand auf allen Plattformen, ohne dass ein lokaler Mailserver erforderlich ist. Beachten Sie jedoch, dass die Funktion nach Möglichkeit vermieden werden sollte; Es ist sowohl schneller als auch sicherer , SMTP für localhost zu verwenden. mail()sendmail mail()"

    Steht da jetzt nicht, dass man PHPMailer vermeiden soll? Und was hat das jetzt alles mit "localhost" zu tun? Ok, ich programmiere gerade meine Webseite offline, sprich "localhost" aber später ist ja alles auf meinem Webserver bzw. Webspace und dann hat alles ja nichts mehr mit "localhost" zu tun.

    Gruß MicNC

  • kommt drauf an ob es ein selbst geschriebenes Kontaktformular oder eines von z.B. Wordpress ist.

    PHP-Mailer ist ein SMTP-Client Framework, das sich mit den normalen Postfach Account einloggt und diese Mails wie von einem Mail-Programm versendet.

    Diese E-Mails sind dann halt vernünftig signiert, welches bei der PHP Mail() Funktion,die ein Wrapper auf "/usr/sbin/sendmail -t -i" ist meist nicht der Fall ist.

  • Irgendwann muss mein eigenes Shop-System auch Emails verschicken. [...] Ich bin ungern ein Freund von fremden Source-Code, Bibliotheken usw.

    Ich bin jetzt verwirrt: Wirst Du ein selbst programmiertes Shop-System einsetzen oder ein bestehendes Programm nutzen?

    Bei letzterem gibt es mit Sicherheit eine Funktion zum Versenden von Bestellbestätigungen, Rechnungen etc. Hier hat man häufig die Wahl, einen "internen" Mailer zu verwenden oder auf einen SMTP-Server zurückzugreifen. Ich würde zu einem separaten Postfach raten, dessen SMTP-Anmeldedaten dann im Shop hinterlegt werden. Ob dieses Postfach auch Mails entgegen nehmen soll, ist davon unabhängig, ich verwende (für ein Forum) z. B. eine "noreply"-Absendeadresse.

    Der Rest Deines Beitrags ist für mich etwas verworren: Der Versand von Mails - z. B. aus einem Kontakt-Formular heraus - hat mit dem Abruf eines Postfaches via POP3 oder IMAP nichts zu tun. Insgesamt solltest Du Dir den Versand von "Kontakt-Mails" gut überlegen, da diese Funktionen gerne von Bots zum Spammen verwendet werden, da kann Dir schnell eine Abuse-Sperre in's Haus flattern. Vielleicht ist es hier sinnvoller, entweder nur Links für den Mail-Versand anzubieten (die dann den Mailer des Clients nutzen) oder eine "echte" Kontakt-Datenbank zu pflegen...

  • PHP-Mailer ist ein SMTP-Client Framework, das sich mit den normalen Postfach Account einloggt und diese Mails wie von einem Mail-Programm versendet.

    Bedeutet das, dass PHPMailer sozusagen auf das Betriebsystem des Webseiten-Besuchers zugreift? Kann ich mir gar nicht vorstellen. Ich meine, wenn ich mit C++, Delphi etc. ein Email-Client schreibe, nutze ich die Bibliotheken und Möglichkeiten meines Betriebssystems, damit letztendlich das Programm Emails senden und empfangen kann. Ich denke mal, auf jedem Webserver gibt es sozusagen auch Bibliotheken und hier greift der SMTP-Client von PHPMailer zu? Vergleichbar wie mit „"/usr/sbin/sendmail -t -i" wie du schreibst. Wohl ein ausführbares Programm auf dem Webserver, dass die mitgeschickten Daten (Name, Email, Nachricht) verarbeitet bzw. dann mit diesem „sendmail“ Programm zum Empfänger schickt?

    Ich bin jetzt verwirrt: Wirst Du ein selbst programmiertes Shop-System einsetzen oder ein bestehendes Programm nutzen?

    Ja, ich habe ein eigenes Shop-System programmiert. Funktioniert soweit alles. Wobei da vieles stimmen muss bezüglich der DSGVO usw. Und nun hänge ich gerade an der BGB fest, die besagt, dass man „unverzüglich auf elektronischem Wege“ man dem Kunden eine Bestellbestätigung zuschicken muss. Unverzüglich bedeutet hier, ohne schuldhaftes Zögern. So ganz klar ist mir nicht, was „schuldhaftes Zögern“ genau bedeutet. Dabei will ich mir eigentlich nur immer selbst eine Email von meiner Webseite heraus verschicken (deshalb die Frage ob die „mail“ Funktion noch gut funktioniert, wenn der Email-Server gleich bleibt (netcup zu netcup). Die Bestellbestätigung möchte ich nämlich lieber manuell nach Prüfung dem Kunden zukommen lassen. Und as dann mit dem EMail-Client von meinem Betriebssystem aus. Aber das dauert dann auch mal 24 Stunden. Bin mir nicht sicher ob das rechtlich (wegen BGB) ok wäre. Deswegen muss ich mich wohl mit einem vernünftigen fehlerfreien System beschäftigen, damit Emails automatisiert verschickt werden können und viel wichtiger, diese auch ankommen. Also wie überall empfohlen, muss ich dann diesen PHPMailer anstatt der PHP „mail“-Funktion nutzen.

    Ob Shop-System oder Kontaktformular, beides muss halt sein. Natürlich treffe ich Anti-Spam Möglichkeiten, damit nicht ständig Emails über meine Webseite an mich verschickt werden.

  • Bedeutet das, dass PHPMailer sozusagen auf das Betriebsystem des Webseiten-Besuchers zugreift? Kann ich mir gar nicht vorstellen.

    Nein, PHPMailer läuft ja auf dem Webserver und nutzt hier entweder die mail() Funktion von PHP, oder spricht mit dem SMTP-Server, den du als Admin hinterlegst.

    PHPMailer sorgt in erster Linie dafür, dass die E-Mail mit all ihren Headern richtig aufgebaut ist und RFC Konform ist - was man selbst als Programmierer mit der mail() Funktion selten gelungen hinbekommt.

  • Ich habe das jetzt mal ausprobiert mit PHP Mailer. Das ganze aber noch mit localhost (mit XAMPP installiert) auf meinem Windows-Rechner.

    Zum Verständnis. Ich habe für meine Webseite ja eine "info@domain.de" Email-Adresse. Also meine Hauptadresse. Da ich im PHP-Script hier mein Passwort nicht haben möchte, habe ich eine weitere Email-Adresse eingerichtet. Sie lautet dann "web@domain.de". Bei Netcup habe ich diese erstellt und natürlich ein Passwort hinterlegt.

    Hier mal ein Teil meines PHP-Script (gefunden und angepasst im Internet):

    Ich nennen diese mal "send.php". Am Anfang den Scripts stehen noch diese "use" und "require" Sachen von PHPMailer. Aber das brauche ich hier ja nicht hinzufügen.

    Ich möchte natürlich erreichen (bei diesem Beispiel), dass die Daten einer <textarea> (in $c stehen die Daten von der textarea ; $mail->Body = $c) in der Kommentarfunktion meines Blogs, dann eine neue EMail mit dem Betreff "Neuer Kommentar" an "info@domain.de" gesendet wird. Diese "web@domain.de" wird nicht selbst überprüft und sollte ja nur für das Script hier sein (Thema Passwort). Das ganze funktioniert durch AJAX, sprich in einer DIV-Box ist erst mal das HTML-Formular. Per Javascript verarbeite ich den "Senden" Button und mit AJAX wird diese "send.php" aufgerufen. Wenn dort dann ein "echo" von PHP erfolgt, wird diese DIV-Box mit dem HTML-Formular überschrieben und das "Echo"-Zeugs wird dort ausgespuckt.

    Jedoch funktioniert das ganze nicht.

    Fehlermeldung: "Fatal error: Maximum execution time of 120 seconds exceeded in C:\Xampp\htdocs\...\SMTP.php on line 1281"

    Die php.ini hat nur folgenden Eintrag für die Mail-Sachen:

    sendmail_path = C:\xampp\mailtodisk\mailtodisk.exe

    So funktioniert das auch, wenn ich z.B. mit der eigenen PHP-Mail Funktion etwas verschicke. Das kommt dann zumindest in einer Text-Datei an, die bei XAMPP unter dem Verzeichnis "mailoutput" abgelegt wird. Da sich der PHPMailer ja irgendwie einloggt (ich gebe ja nicht umsonst "Host", "Port", "Username" und "Passwort" an), denke ich, dass hier noch das Problem besteht? Hier ist meine Denkgrenze *lach. Also mir ist nicht ganz klar, ob über localhost, hier trotzdem auf dem Host von Netcup das ganze stattfindet (ich wirklich eine Mail an "info@domain.de" bekomme) oder wie bei der mail() PHP Funktion die Sache simuliert wird und eine Text-Datei in das Verzeichnis "mailoutput" von XAMPP abgelegt wird.

    Aber wie gesagt... alles erst mal noch mit diesem Timeout-Fehler.

    Jemand eine Idee?

  • Für STARTTLS solltest du Port 587 nutzen, 465 ist direkt verschlüsselt (SMTPS)

    Und dein Script geht direkt über SMTP raus, die PHP Sendmaileinstellungen greifen nur für mail()

    Merci :thumbup: . Mit 587 geht es. Jetzt kann ich endlich weiter machen ;)
    Aber eine Sache verstehe ich noch nicht. Ich habe ja diesen try "catch (Exception $e){}" Bereich. Kommen da überhaupt Fehler an? Der besagte Timeout Fehler kam ja dort nicht an. Aber das war ja ein Timeout Fehler und wenn ich da so drüber nachdenke... das lokale PHP reagierte wohl darauf und unterbrach die Warteschleife. Ich hoffe, die normalen Fehler, die ein EMail-Server ausspuckt, kommen im "catch" Bereich dann an. Ach, kann ich ja gleich ausprobieren (z.B. falsches Passwort" hinterlegen) ;) Schönes Wochenende@all

  • Merci :thumbup: . Mit 587 geht es. Jetzt kann ich endlich weiter machen ;)
    Aber eine Sache verstehe ich noch nicht. Ich habe ja diesen try "catch (Exception $e){}" Bereich. Kommen da überhaupt Fehler an? Der besagte Timeout Fehler kam ja dort nicht an. Aber das war ja ein Timeout Fehler und wenn ich da so drüber nachdenke... das lokale PHP reagierte wohl darauf und unterbrach die Warteschleife. Ich hoffe, die normalen Fehler, die ein EMail-Server ausspuckt, kommen im "catch" Bereich dann an. Ach, kann ich ja gleich ausprobieren (z.B. falsches Passwort" hinterlegen) ;) Schönes Wochenende@all

    Ach, das geht ja anders. try/catch sind glaube ich nur PHP Fehler und ich muss eher "if(!$mail->Send()) {..." machen ;)