Die perfekte Email Validierung

Kann man irgendwie Emails wirklich zuverlässig validieren?

Die perfekte Email Validierung

Die perfekte Email Validierung

Ein Immer wieder auftretendes Problem bei Formulardaten ist die Validierung der Emailadressen, Im Rahmen meiner Mitarbeit im Websitebaker Projekt  habe ich mir dann einmal die Mühe gemacht zu versuchen die Perfekte Email Validierung zu konstruieren.  Der erste Schritt war mir sehr viele bereits vorhandene Lösungen anzuschauen und festzustellen, das die doch noch sehr ungenau waren, es fehlten etliche der in der RFC erlaubten Zeichen bestimmte kombinationen gingen auch nicht , alles in allem war das Ergebniss recht unbefriedigend. Also habe ich einfach mal die Besten der vorhandenen Lösungen genommen und alles kombiniert. Das Ergebniss sieht schon ziemlich unheimlich aus, funktioniert aber sehr zuverlässig.

/^((([!#$%&'*+\\-\/\=?^_`{|}~\w])|([!#$%&'*+\\-\/\=?^_`{|}~\w][!#$%&'*+\\-\/\=?^_`{|}~\.\w]{0,}[!#$%&'*+\\-\/\=?^_`{|}~\w]))[@]\w+(([-.]|\-\-)\w+)*\.\w+(([-.]|\-\-)\w+)*)$/

Bezaubernd, nicht wahr? Die einzige Schwachstelle die diese kleine Monster hat, ist das es nicht mit IDNA Domains klarkommt, bzw nicht bestimmen kann ob diese auch wirklich korrekte IDNA Domains sind. Sprich es ist vielleicht ein korrekter Domainname nach RFC, aber kein Sinnvoller(z.B. nicht existierende Umlaute). Um das Problem zu lösen, habe wir uns damals nach IDNA Konvertern umgesehen und sind auch fündig geworden:

Einmal gibt es die  "idn_to_ascii" Funktion vom  "idn package" in PEAR und zum anderen gibt es von phlyLabs den  pure PHP IDNA Converter, welcher unter LGPL steht. Für den Fall der Fälle haben wir dann einfach beides Implementiert. Das Ganze sah dann so aus:

    // Validate supplied email address
    function validate_email($email) {
        if(function_exists('idn_to_ascii')){ /* use pear if available */
            $email = idn_to_ascii($email);
        }else {
            require_once(WB_PATH.'/include/idna_convert/idna_convert.class.php');
            $IDN = new idna_convert();
            $email = $IDN->encode($email);
            unset($IDN);
        }
        // regex from NorHei 2011-01-11
        $retval = preg_match("/^((([!#$%&'*+\\-\/\=?^_`{|}~\w])|([!#$%&'*+\\-\/\=?^_`{|}~\w][!#$%&'*+\\-\/\=?^_`{|}~\.\w]{0,}[!#$%&'*+\\-\/\=?^_`{|}~\w]))[@]\w+(([-.]|\-\-)\w+)*\.\w+(([-.]|\-\-)\w+)*)$/", $email);
        return ($retval != false);
    }

Also werden die Emails erst einmal IDNA dekodiert und dann erst validiert wobei dann je nach Zeichensatz eventuell noch der /u parameter für UTF8 benötigt wird. Zumindest soweit ich weiß ist dies die umfangreichste Email Validierung die ich kenne, ob sie auch perfekt ist kann ich nicht sagen??

Den IDNA Konverter von phlyLabs  gibt es hier zum Download:
IDNA Konverter Download

Die neueste Version hat sogar noch einige nützliche Tools dabei.

Nichts gibt Frauen eine königlichere Haltung als das Bewußtsein, daß
sie ihr Alter besiegt haben.
-- Arthur Schnitzler (Aphorismen und Betrachtungen aus dem Nachlaß)