Bastian Schnitzler: Überprüfen einer Email-Adresse

Hallo,
wisst ihr, wie man mithilfe von php eine Email-Adresse auf Ihre Gültigkeit überprüfen kann, d.h. das in der genannten Adresse folgende Zeichenfolge vorkommt: *@*.* ?
Und wie kann man überprüfen, ob in einem Namensfeld auch ein Name eingegeben wurde, ich habe das bisher nur so, das Ich überprüfe, ob überhaupt etwas eingegeben wurde, man kann aber immernoch Sonderzeichen und !!! Leerzeichen !!! eingeben.
Vielen Dank,
BaSchni

---------------------------------------------------------------------
Bastian Schnitzler
baschni@funjava.tk
http://www.bastianschnitzler.npx.de
http://www.funjava.tk

  1. Hallo Bastian,

    http://aktuell.de.selfhtml.org/tippstricks/programmiertechnik/email/index.html
    http://www.php-faq.de/q/q-mail-adresse-gueltig.html
    [link.http://www.php-faq.de/q/q-mail-adresse-testen.html]

    Such Dir was aus, je nachdem, wie tief Du in der Materie buddeln willst. ;)

    Gruss, Thoralf

    --
    Sic Luceat Lux!
    1. Danke, hatte ich ganz übersehen
      Baschni

  2. Moin!

    wisst ihr, wie man mithilfe von php eine Email-Adresse auf Ihre Gültigkeit überprüfen kann

    Also ich mache das mit einem regulären Ausdruck, den ich mir mal zusammengestellt habe. Binde die Funktion ein und übergib ihr die Adresse. Du bekommst true oder false zurück.

    <?php

    function check_adress( $email )
    {
     $expression = "[1](.{0,1}[_a-zA-Z0-9-])*@([a-zA-Z0-9-]{2,}.){0,}[a-zA-Z0-9-]{3,}(.[a-zA-Z]{2,4}){1,2}$";

    if ( ereg( $expression, $email ) )
      return TRUE;
     else
      return FALSE;
    }

    ?>

    Und wie kann man überprüfen, ob in einem Namensfeld auch ein Name eingegeben wurde, ich habe das bisher nur so, das Ich überprüfe, ob überhaupt etwas eingegeben wurde, man kann aber immernoch Sonderzeichen und !!! Leerzeichen !!! eingeben.

    Das würde ich auch mit einem regulären Ausdruck machen und alles ablehnen, wo andere Zeichen als a-z und A-Z vorkommen.
    Wirf am Besten einen Blick ins PHP-Handbuch oder in die FAQ der PHP-Newsgroup. Da wird das recht gut erklärt.

    Gruß, rob


    1. _a-zA-Z0-9- ↩︎

    1. Moin!

      Also ich mache das mit einem regulären Ausdruck, den ich mir mal zusammengestellt habe. Binde die Funktion ein und übergib ihr die Adresse. Du bekommst true oder false zurück.

      Böse Falle.

      Wenn man, wie (nicht nur) von mir seit ewigen Zeiten vorgeschlagen, den Regulären Ausdruck auf die Prüfung von "@ drin" und "nach @ ein . drin" beschränkt, kriegt man demnächst (bzw. schon jetzt) keine Probleme mit den Umlaut-Domains!

      Also als regex:
      ^.+@.+..+$

      Und fertig.

      Das würde ich auch mit einem regulären Ausdruck machen und alles ablehnen, wo andere Zeichen als a-z und A-Z vorkommen.

      Da schon jetzt in Domains auch andere Zeichen vorkommen dürfen, kriegst du damit künftig immer mehr Probleme.

      - Sven Rautenberg

      --
      "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
      1. Hi Sven,

        Da schon jetzt in Domains auch andere Zeichen vorkommen dürfen, kriegst du damit künftig immer mehr Probleme.

        http://grün.knipp.de -> http://cforum.teamone.de/phpbt/bug.php?op=show&bugid=156&pos=5

        Wie die passenden RegExe auszusehen haben, können wir bald in die </faq/> aufnehmen. Das wird vermutlich der Jahr-2004-Bug werden.

        Grüße,
         Roland

      2. Hallo Sven,

        Wenn man, wie (nicht nur) von mir seit ewigen Zeiten vorgeschlagen, den Regulären Ausdruck auf die Prüfung von "@ drin" und "nach @ ein . drin" beschränkt, kriegt man demnächst (bzw. schon jetzt) keine Probleme mit den Umlaut-Domains!

        Wo ist das Problem? Wenn jemand wirklich so dumm ist, eine »Umlautdomain« einzusetzen, kann er ja die Punycode-Form angeben. Der einzige mir vorstellbare vernünftige Grund, eine derartige Domain einzusetzen, ist als Fallback, falls jemand ausversehen den Umlaut eingeben hat.

        Schöne Grüße,

        Johannes

        --
        Der folgende Satz ist wahr.         | http://www.zeller-johannes.de/
        Der vorhergehende Satz ist gelogen. |
        ss:| zu:} ls:[ fo:} de:] va:} ch:) sh:( n4:| rl:( br:< js:| ie:{ fl:( mo:}
        1. Moin!

          Wo ist das Problem? Wenn jemand wirklich so dumm ist, eine »Umlautdomain« einzusetzen, kann er ja die Punycode-Form angeben. Der einzige mir vorstellbare vernünftige Grund, eine derartige Domain einzusetzen, ist als Fallback, falls jemand ausversehen den Umlaut eingeben hat.

          Das Problem ist, dass das Punycode-Äquivalent niemandem bekannt sein wird - und selbst wenn, es dann wegen absoluter Unmerkbarkeit ignoriert würde.

          Außerdem liefert der diskutierte RegEx ja nur eine ja/nein-Entscheidung. Er gibt keinen Hinweis "könnte vielleicht als Punycode-Äquivalent durchgehen".

          Und selbst das wäre herzlich irrelevant, weil: Die Menge gültiger Domains ist immer noch wesentlich größer als die Menge registrierter Domains, und die Menge registrierter Domains ist größer als die Menge für Mail genutzter Domains.

          Eine Prüfung auf eine regelgerechte Domainangabe (wobei diese Prüfung _allumfassend_ sein muß) macht also nur dann Sinn, wenn man diese Information nicht alleine stehen läßt. Also in einem zweiten Schritt beispielsweise einen DNS-Lookup macht, um danach dann direkt eine Mail zu versenden - dies alles nur als Schutz, dass man normgerechte Daten ins Netz sendet, sonst nichts weiter.

          Es ist leider eine nicht bestreitbare Tatsache: Man kann der Angabe einer Mailadresse nicht ansehen, ob sie gültig ist, existiert und wahrgenommen wird. Dazu muß man immer eine Mail an die Adresse senden und eine Reaktion fordern.

          Insofern halte ich meinen ausdrücklich oberflächlichen Test, ob in der Angabe genau ein "@" und danach mindestens ein Punkt vorkommt, für vollkommen ausreichend und absolut zukunftssicher, wenn man _ganz_ dumme Fehleingaben vermeiden will.

          Allerdings ist meine Praxiserfahrung, dass die Benutzer, statt sich irgendeinen Schwachsinn auszudenken, viel eher bei ihrer eigenen Mailadresse vertippen. Und was hilft es, wenn aus "user@sub1.example.com" aus versehen "user@sub2.example.com" wird? Kann man mit keinem Regex der Welt herausfinden.

          Oder noch schlimmer: aus "user@example.com" wird "uer@example.com".

          - Sven Rautenberg

          --
          "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
      3. Hallo,

        Also als regex:
        ^.+@.+..+$

        Und fertig.

        Sollte man nicht wenigstens abchecken, dass keine Steuerzeichen (<hex20) in der Adresse vorkommen? Denn abhängig davon, was man mit der Adresse macht, könnte das Vorkommen von Steuerzeichen doch eine Sicherheitslücke darstellen?

        Also:
        [1]+@[^\x00-\x1f]+.[^\x00-\x1f]+$

        Oder ist das auch eine Einschränkung? Bzw. absolute Paranoia?

        Grüße, Alex.


        1. ^\x00-\x1f ↩︎

        1. Moin!

          Also als regex:
          ^.+@.+..+$

          Und fertig.

          Sollte man nicht wenigstens abchecken, dass keine Steuerzeichen (<hex20) in der Adresse vorkommen? Denn abhängig davon, was man mit der Adresse macht, könnte das Vorkommen von Steuerzeichen doch eine Sicherheitslücke darstellen?

          Woher willst du wissen, dass der String als ASCII daherkommt? :)

          Abgesehen davon: Wenn man seine Daten ordentlich als Daten behandelt, sind jegliche Bytekombinationen kein Problem. Zum Speichern in eine Datenbank beispielsweise immer schon mysql_escape_string() verwenden, und gut ist.

          Oder ist das auch eine Einschränkung? Bzw. absolute Paranoia?

          Man muß betrachten, was man erreichen will. Will man wirklich die Prüfung auf absolute Einhaltung von Standards, hat man natürlich strengere Maßstäbe anzulegen, als wenn man nur dumme Eingabefehler abfangen will.

          Die Aufgabe, die ich hier sehe, sind aber eben nur diese dummen Eingabefehler. Und sowas wird in der Regel bei solchen Programmen geprüft, die man einmal schreibt und dann nie wieder anfäßt, weil: Funktioniert ja.

          Dass sich die Dinge aber ändern, beispielsweise der letzte Teil einer Domain nicht mehr nur 2 oder 3 Zeichen lang _ist_ (so war die real existierende Situation am Beginn des Internets), sondern laut Standard grundsätzlich beliebig lang sein _kann_, und dieses mit .info, .aero, .museum usw. auch eindrucksvoll demonstriert wurde, hat sich so ganz langsam herumgesprochen. Ebenso wie die Tatsache, dass "die Domain" (die Second-Level-Domain) nicht mindestens 3 Zeichen lang sein muß, sondern es auch zwei und ein Zeichen lange Domains gibt.

          Kern meiner Aussage: Je stärker man die erlaubten Eingabemöglichkeiten einschränkt, desto sicherer muß man sich sein, dass man keinerlei erlaubte Eingabemöglichkeiten als falsch ausschließt, und desto aktiver muß man Veränderungen im Standard verfolgen, welche möglicherweise nachträglich bisher ungültige Eingabemöglichkeiten gültig macht.

          Und da halte ich es einfach für am sinnvollsten, die geringstmöglichen noch sinnvollen Anforderungen zu stellen. Und die sind halt: Eine Mailadresse muß zwingend ein @ enthalten, und sie muß (sofern man lokale Hosts ausschließen will) nach dem @ mindestens einen Punkt enthalten für die Trennung von SLD und TLD.

          Ich bin mir mit diesen Regeln hundertprozentig sicher, dass alles, was damit als falsch erkannt wird, garantiert keine Mailadresse ist. Dass von dem, was als gültig durchgelassen wird, ein Teil auch keine gültige Mailadresse ist, ist mir dabei bewußt. Aber die Aufgabe "nimm nur gültige Mailadressen" kann von einem RegEx niemals erfüllt werden.

          - Sven Rautenberg

          --
          "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
          1. Äh, hallo Sven,

            Und die sind halt: Eine Mailadresse muß zwingend ein @ enthalten, und sie
            muß (sofern man lokale Hosts ausschließen will)

            Ich habe schon durchaus erfolgreich Mails an Personen wie »sven« abgeschickt.
            Zugegeben, das war auch nur innerhalb des lokalen Hosts, aber da war auch
            keinerlei Klammeraffe erforderlich. Oder vertue ich mich da irgendwie?

            Tim

            1. Hallo Tim,

              Und die sind halt: Eine Mailadresse muß zwingend ein @ enthalten,
              und sie muß (sofern man lokale Hosts ausschließen will)

              Ich habe schon durchaus erfolgreich Mails an Personen wie »sven«
              abgeschickt. Zugegeben, das war auch nur innerhalb des lokalen
              Hosts, aber da war auch keinerlei Klammeraffe erforderlich. Oder
              vertue ich mich da irgendwie?

              Nein, das ist durchaus korrekt.

              Grüße,
               CK

              --
              Zu wissen, was wir nicht wissen, ist die Quelle der Weisheit.