Ankündigung

Einklappen
Keine Ankündigung bisher.

PHPMailer: SMTP Zugang prüfen ohne Mailversand

Einklappen

Neue Werbung 2019

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

  • PHPMailer: SMTP Zugang prüfen ohne Mailversand

    Hi,
    in einer Applikation gibt der Nutzer die Zugangsdaten (Host,Port, Nutzername, Passwort..) für den Versand der Emails selbst an.
    Dafür wird der PHPMailer genutzt (Möchte auch auch aus diversen Gründen unbedingt beim PHPMailer bleiben). Die Zugangsdaten möchte ich vorab real prüfen, ohne eine Testmail irgendwohin versenden zu müssen.
    Als Basis hab ich erstmal das Skript smtp_check.php geringfügig erweitert und getestet. Nun sind die Ausgaben optimal für Programmierer, aber nichts für einen Endkunden.
    Ziel ist es, einen benutzerfreundlichen Zugangstest zu erstellen, wo der Nutzer ähnlich wie bei den Mailclients auf dem PC einen Button "Zugang testen" betätigt und als Antwort kommt ein ok oder eben ein Hinweis wo es klemmt. Im ersten Schritt möchte ich den SMTP-Check in eine Klasse packen, welche sich die Zugangsdaten und Einstellungen gleich aus dem PHPMailer-Objekt holt.

    Womöglich gibt es aber sowas schon fertig und ich hab es noch nicht gefunden? Wer einen link hat, her damit.

    Macht ein solcher Test Sinn und liegen Erfahrungen mit solchen Tests vor oder sollte besser eine echte Mail zu sich selbst gesendet werden?

  • #2
    Hi,

    Ich finde die Art der Prüfung schon gut.
    Wo genau empfindest Du das denn für den Endkunden als zu kompliziert? Ich sehe nichts, was Du nicht ohne weitere Info des Endkunden auf Button-Klick auslösen kannst.

    Was fertiges fällt mir nicht ein, aber das wäre auch nicht wirklich zweckmässig, denke ich.
    Wenn Du das in eine Klasse verpacken willst, mach einfach einen Wrapper dafür, so habe ich das mal gemacht.
    Bei mir wird das zwar als Prozessschritt automatisch ausgeführt, aber einen Button dafür zu verwenden ist ja auch ohne Probleme möglich, ich würde in dem Fall bei Klick einen XMLHttpRequest feuern.
    Das Zielscript macht dann die Prüfung und liefert ein sauberes JSON als Response.


    Gruß Arne

    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Das mit dem Button war nur als bildliches Beispiel gedacht und auf den PC Mailclient bezogen. In der Applikation werden die Zugangsdaten per Formular erfasst und die Prüfung des Zugangs werde ich wohl im Zuge der Validierung dann erledigen. Werde das mal angehen dies in eine Klasse zu packen.

      LG jspit

      Kommentar


      • #4
        Der PHPMailer hat eine Methode smtpConnect. Sollten die Zugangsdaten nicht passen, wird eine Exception geworfen.

        Eine Benutzergeführte Validierung finde ich auch gut, der Benutzer sollte direkt Feedback erhalten wenn seine Konfiguration nicht passt.
        "Software is like Sex, it's best if it's free." - Linus Torvalds

        Kommentar


        • #5
          Die Methode habe ich auch schon gesehen, jedoch in Kommentaren zum PHPMailer gelesen, das es da irgendwelche Probleme gibt. Als Alternative hab ich dann Hinweise zum Beispiel smtp-check.php gefunden.
          Habe das jetzt aktuell gleich mal getestet. Die Methode liefert nach den ersten Tests zuverlässig true oder false als Resultat. Bei aktivierten Exceptions wird jedoch nicht immer eine Exception geworfen, z.B. nicht wenn ein falscher Host vorgegeben ist. Ich möchte im Fehlerfall aber immer einen Hinweis auf die genaue Ursache bekommen.
          (Ist wohl für den Fall das smtp->connect fehlschlägt und false liefert, da sehe ich kein else wo dann eine Exception geworfen wird.)
          Danke dennoch für den Hinweis, war ein Versuch wert.

          LG jspit

          Kommentar


          • #6
            Die Zugangsdaten möchte ich vorab real prüfen, ohne eine Testmail irgendwohin versenden zu müssen.
            Es gibt Mailserver, welche erst bei DATA die Verbindung wegen eines vorhergehendes Fehlers beenden, genaue Infos darüber müsste ich suchen.
            Da es sich bei Dir aber wohl um einen Client Zugang handelt, sollte das Pasword ja auch über POP/Imap getested werden können.



            Kommentar


            • #7
              Ich werde um gewisse Vorgaben zum Mailserver nicht umhin kommen. So denke ich z.B. SMTP-After-POP nicht mehr zu unterstützen, nur ssl und tls. Die Angaben zum POP/IMAP kann ich mir dann sparen. Der Wahrsager ist sowieso die erste echte Mail die rausgeht, da mache ich mir nichts vor.

              Kommentar


              • #8
                Zitat von jspit Beitrag anzeigen
                Die Methode habe ich auch schon gesehen, jedoch in Kommentaren zum PHPMailer gelesen, das es da irgendwelche Probleme gibt. Als Alternative hab ich dann Hinweise zum Beispiel smtp-check.php gefunden.
                Habe das jetzt aktuell gleich mal getestet. Die Methode liefert nach den ersten Tests zuverlässig true oder false als Resultat. Bei aktivierten Exceptions wird jedoch nicht immer eine Exception geworfen, z.B. nicht wenn ein falscher Host vorgegeben ist. Ich möchte im Fehlerfall aber immer einen Hinweis auf die genaue Ursache bekommen.
                (Ist wohl für den Fall das smtp->connect fehlschlägt und false liefert, da sehe ich kein else wo dann eine Exception geworfen wird.)
                Danke dennoch für den Hinweis, war ein Versuch wert.

                LG jspit
                Hast du mal debug aktiviert und geschaut was passiert?

                Ich hatte die Methode auch schon verwendet und ich meine dass das da glaub gut funktioniert hat, kann mich aber auch irren
                "Software is like Sex, it's best if it's free." - Linus Torvalds

                Kommentar


                • #9
                  Ja, debug war bei dem Test aktiviert. Hab einen nicht vorhandenen Server angegeben.
                  Code:
                  2017-06-16 09:48:47 Connection failed. Error #2: stream_socket_client(): php_network_getaddresses: getaddrinfo failed: Name or service not known [/data/userfiles/websites/class/class.smtp.php line 294]
                  2017-06-16 09:48:47 Connection failed. Error #2: stream_socket_client(): unable to connect to mx.freenet99.de:587 (php_network_getaddresses: getaddrinfo failed: Name or service not known) [/data/userfiles/websites/class/class.smtp.php line 294]
                  2017-06-16 09:48:47 SMTP ERROR: Failed to connect to server: php_network_getaddresses: getaddrinfo failed: Name or service not known (0)
                  Problem liegt im smtpConnect hier:
                  PHP-Code:
                              if ($this->smtp->connect($prefix $host$port$this->Timeout$options)) {
                                  try { ... } catch (
                  phpmailerException $exc) { .. }
                              }

                               
                  // :
                               
                  return false//am Ende 
                  Die class.smtp.php selbst wirft ja keine Exceptions (Version 5.2.23). oder bin ich da nicht auf dem laufenden?

                  Kommentar


                  • #10
                    Wertest Du das
                    https://autoconfig.thunderbird.net/v1.1/
                    schon aus ?

                    Kommentar


                    • #11
                      Zitat von tomBuilder Beitrag anzeigen
                      Wertest Du das
                      https://autoconfig.thunderbird.net/v1.1/
                      schon aus ?
                      Kann mit dem link nichts anfangen. Daher ist nein die Antwort.

                      Kommentar


                      • #12
                        Zitat von tomBuilder Beitrag anzeigen
                        Wertest Du das
                        https://autoconfig.thunderbird.net/v1.1/
                        schon aus ?
                        Warum sollte er das auswerten? Hat mich korrekten SMTP-Zugangsdaten erstmal nichts zu tun.

                        Ok, ich hab entsprechendes Projekt von mir rausgesucht.
                        Habe das dort gleich gemacht wie der PHPMailer das in smtpSend gemacht hat:
                        https://github.com/PHPMailer/PHPMail...hp#L1540-L1542

                        Zusätzlich noch die Exceptions auswerten, dann kannst du unterscheiden ob Zugangsdaten falsch sind, oder der Server nicht erreichbar ist.

                        Schon komisch, dass für Credentials Exceptions geworfen werden, für einen nicht erreichbaren Host aber nicht.
                        "Software is like Sex, it's best if it's free." - Linus Torvalds

                        Kommentar


                        • #13
                          Zitat von jspit Beitrag anzeigen
                          Kann mit dem link nichts anfangen. Daher ist nein die Antwort.
                          Da kann man recht leicht abfragen, was für eine Benutzerauthentification der jeweilige Mailserver besizt:

                          Zitat von https://autoconfig.thunderbird.net/v1.1/gmail.com
                          HTML-Code:
                          <outgoingServer type="smtp">
                          <hostname>smtp.gmail.com</hostname>
                          <port>465</port>
                          <socketType>SSL</socketType>
                          <username>%EMAILADDRESS%</username>
                          <authentication>OAuth2</authentication>
                          <authentication>password-cleartext</authentication>
                          </outgoingServer>
                          
                          <webMail>
                          <loginPage url="https://accounts.google.com/ServiceLogin?service=mail&continue=http://mail.google.com/mail/"/>
                          <loginPageInfo url="https://accounts.google.com/ServiceLogin?service=mail&continue=http://mail.google.com/mail/">
                          <username>%EMAILADDRESS%</username>
                          <usernameField id="Email"/>
                          <passwordField id="Passwd"/>
                          <loginButton id="signIn"/>
                          </loginPageInfo>
                          </webMail>
                          Spart den Benutzer Eingaben, erleichtert das testen, dachte ich.

                          Kommentar


                          • #14
                            tomBuilder : Soweit will ich es nicht treiben. Ich denke auch, viele unserer Kunden nutzen eigene Mailserver.

                            @JaMa: Danke nochmal für die Hinweise. Melde mich wieder wenn ich Resultate habe.

                            ​​​​​​​

                            Kommentar


                            • #15
                              Zitat von JaMa Beitrag anzeigen

                              Warum sollte er das auswerten? Hat mich korrekten SMTP-Zugangsdaten erstmal nichts zu tun.
                              Ich dachte
                              scheitert das

                              PHP-Code:
                                          if ($this->smtp->connect($prefix $host$port$this->Timeout$options)) {
                                              try { ... } catch (
                              phpmailerException $exc) { .. }
                                          }

                                           
                              // :
                                           
                              return false//am Ende 
                              obwohl die Daten da gelistet sind, mag der Mailserver üblicherweise Mail anehmen;
                              insofern scheint mir das Abfangen über eine Exception während der Eingabevalidierung nur ein begrenzt probates Mittel.

                              Kommentar

                              Lädt...
                              X