# Email Adresse

`Zend_Validate_EmailAddress` erlaubt die Prüfung von Email Adressen. Der Prüfer teilt zuerst die Email Adresse in lokalen Teil @ hostname und versucht diese mit bekannten Spezifikationen für Email Adressen und Hostnamen zu prüfen.

## Normale Verwendung

Ein Beispiel einer normalen Benutzung ist anbei:

    $validator = new Zend_Validate_EmailAddress();
    if ($validator->isValid($email)) {
        // Email Adresse scheint gültig zu sein
    } else {
        // Email Adresse ist ungültig, drucke die Gründe hierfür
        foreach ($validator->getMessages() as $message) {
            echo "$message\n";
        }
    }

Das prüft die Email Adresse `$email` und gibt bei einem Fehler über `$validator->getMessages()` eine nützliche Fehlermeldung aus.

## Optionen für die Prüfung von Email Adressen

`Zend_Validate_EmailAddress` unterstützt verschiedene Optionen welche entweder bei der Initiierung, durch Übergeben eines Arrays mit den betreffenden Optionen, gesetzt werden können, oder im Nachhinein, durch Verwendung von `setOptions()`. Die folgenden Optionen werden unterstützt:

- allow: Definiert welche Typen von Domain Namen akzeptiert werden. Diese Option wird in Verbindung mit der hostname Option verwendet um die Hostname Prüfung zu setzen. Für weitere Informationen über mögliche Werte dieser Option sehen Sie bitte unter und mögliche `ALLOW`* Konstanten. Der Standardwert dieser Option ist `ALLOW_DNS`.

- hostname: Setzt die Hostname Prüfung mit welcher der Domain Teil der Email Adresse geprüft wird.

- mx: Definiert ob der MX Record vom Server erkannt werden soll. Wenn diese Option auf `TRUE` definiert wird, dann wird der MX Record verwendet um zu prüfen ob der Server Emails akzeptiert. Der Standardwert dieser Option ist `FALSE`.

- deep: Definiert ob die MX Records des Server durch eine tiefe Prüfung verifiziert werden sollen. Wenn diese Option auf `TRUE` gesetzt wird, dann werden zusätzlich zum MX Record auch die A, A6 und `AAAA` Records verwendet um zu prüfen ob der Server Emails akzeptiert. Der Standardwert dieser Option ist `FALSE`.

- domain: Definiert ob der Domain Teil geprüft werden soll. Wenn diese Option auf `FALSE` gesetzt wird, dann wird nur der lokale Teil der Email Adresse geprüft. In diesem Fall wird die Hostname Prüfung nicht aufgerufen. Der Standardwert dieser Option ist `TRUE`.

    $validator = new Zend_Validate_EmailAddress();
    $validator->setOptions(array('domain' => false));

## Komplexe lokale Abschnitte

`Zend_Validate_EmailAdress` prüft jede gültige Email Adresse mit RFC2822. Gültige Email Adressen sind zum Beispiel `bob@domain.com`, `bob+jones@domain.us`, `"bob@jones"@domain.com` und `"bob jones"@domain.com`

Einige Email Formate werden aktuell nicht geprüft (z.B. Zeilenumbruch Zeichen oder ein "\" Zeichen in einer Email Adresse).

## Nur den lokalen Teil prüfen

Wenn man will das `Zend_Validate_EmailAddress` nur den lokalen Teil der Email Adresse prüfen soll, und die Prüfung des Hostnamens ausschalten will, kann man die domain Option auf `FALSE` setzen. Das zwingt `Zend_Validate_EmailAddress` den Hostname Teil der Email Adresse nicht zu prüfen.

    $validator = new Zend_Validate_EmailAddress();
    $validator->setOptions(array('domain' => FALSE));

## Prüfen von unterschiedlichen Typen von Hostnamen

Der Teil des Hostnamens einer Email Adresse wird mit `Zend_Validate_Host` geprüft. Standardmäßig werden nur DNS Hostnamen in der Form `domain.com` akzeptiert, aber wenn es gewünscht ist, können auch IP Adressen und lokale Hostnamen auch akzeptiert werden.

Um das zu tun, muß eine `Zend_Validate_EmailAddress` Instanz erstellt werden der ein Parameter übergeben wird, um den Typ des Hostnamens anzugeben der akzeptiert werden soll. Mehr Details sind in `Zend_Validate_Hostname` inkludiert, zusammen mit einem Beispiel, wie DNS und lokale Hostnamen, akzeptiert werden wie im Beispiel das anbei steht:

    $validator = new Zend_Validate_EmailAddress(
                        Zend_Validate_Hostname::ALLOW_DNS |
                        Zend_Validate_Hostname::ALLOW_LOCAL);
    if ($validator->isValid($email)) {
        // Email Adresse scheint gültig zu sein
    } else {
        // Email ist ungültig; Gründe ausdrucken
        foreach ($validator->getMessages() as $message) {
            echo "$message\n";
        }
    }

## Prüfen ob der Hostname aktuell Emails akzeptiert

Nur weil eine Email Adresse im richtigen Format ist, heißt das notwendigerweise nicht das die Email Adresse aktuell auch existiert. Um dieses Problem zu lösen, kann MX Prüfung verwendet werden um zu prüfen ob ein MX (Email) Eintrag im DNS Eintrag für den Hostnamen der Email existiert. Das zeigt ob der Hostname Emails akzeptiert, sagt aber nicht aus, ob die genaue Email Adresse selbst gültig ist.

Die MX Prüfung ist standardmäßig nicht eingeschaltet. Um die MX Prüfung einzuschalten kann ein zweiter Parameter an den `Zend_Validate_EmailAddress` Konstruktor übergeben werden.

    $validator = new Zend_Validate_EmailAddress(
        array(
            'allow' => Zend_Validate_Hostname::ALLOW_DNS,
            'mx'    => true
        )
    );

### Die MX Prüfung unter Windows

In Windows Umgebungen ist die MX Prüfung nicht vorhanden wenn PHP 5.3 oder höher verwendet wird. Unter PHP 5.3 wird die MX Prüfung nicht verwendet, selbst wenn diese in den Optionen aktiviert wurde.

Alternativ kann entweder `TRUE` oder `FALSE` an `$validator->setValidateMx()` übergeben werden um die MX Prüfung ein- oder auszuschalten.

Durch das einschalten dieser Option werden Netzwerk Funktionen verwendet um zu Prüfen ob ein MX Eintrag am Hostnamen der Email Adresse existiert, welche geprüft werden soll. Vorsicht davor, das hierbei das eigene Skript langsamer wird.

Manchmal gibt die Prüfung auf MX Records false zurück, selbst wenn Emails akzeptiert werden. Der Hintergrund dieses Verhaltens ist, das der Server Emails akzeptieren kann, selbst wenn er keinen MX Record anbietet. In diesem Fall kann er A, A6 oder `AAAA` Records anbieten. Um es `Zend_Validate_EmailAddress` zu erlauben auch auf diese anderen Records zu prüfen, muss man die tiefe MX Prüfung einschalten. Das kann man durch Setzen der deep Option bei der Initialisierung, oder durch Verwendung von `setOptions()` tun.

    $validator = new Zend_Validate_EmailAddress(
        array(
            'allow' => Zend_Validate_Hostname::ALLOW_DNS,
            'mx'    => true,
            'deep'  => true
        )
    );

### Performance Warnung

Man sollte darauf achten das die Aktivierung der MX Prüfung das Skript langsamer machen wird, weil es Netzwerk Funktionen verwendet. Die Aktivierung der tiefen Prüfung macht das Skript sogar noch langsamer da es im angegebenen Server nach 3 zusätzlichen Typen sucht.

### Disallowed IP addresses

Man sollte beachten das die MX Prüfung nur für externe Server akzeptiert wird. Wenn die tiefe MX Prüfung aktiviert wird, dann werden IP Adressen wie `192.168.*` oder `169.254.*` nicht akzeptiert.

## Internationale Domain Namen prüfen

`Zend_Validate_EmailAddress` prüft auch internationale Zeichen prüfen, die in einigen Domains existieren. Dies ist als Unterstützung für Internationale Domain Namen (IDN) bekannt. Standardmäßig ist das eingeschaltet. Das kann aber ausgeschaltet werden indem eine Einstellung geändert wird über das interne `Zend_Validate_Hostname` Objekt das innerhalb von `Zend_Validate_EmailAddress` existiert.

    $validator->getHostnameValidator->setValidateIdn(false);

Weitere Informationen über die Verwendung von `setValidateIdn()` gibt es in der `Zend_Validate_Hostname` Dokumentation.

Es sollte darauf geachtet werden das IDNs nur geprüft werden wenn erlaubt ist DNS Hostnamen zu prüfen.

## Top Level Domains prüfen

Standardmäßig wird ein Hostname mit einer List von bekannten TLDs geprüft. Das ist standardmäßig aktiviert, kann aber ausgeschaltet werden indem die Einstellung über das interne `Zend_Validate_Hostname` geändert wird, das innerhalb von `Zend_Validate_EmailAddress` existiert.

    $validator->getHostnameValidator->setValidateTld(false);

Mehr Informationen über die Verwendung von `setValidateTld()` gibt es in der `Zend_Validate_Hostname` Dokumentation.

Es sollte darauf geachtet werden das TLDs nur geprüft werden wenn es auch erlaubt ist DNS Hostnamen zu prüfen.

## Setzen von Meldungen

`Zend_Validate_EmailAddress` verwendet auch `Zend_Validate_Hostname` um den Teil des Hostnamens einer angegebenen Email Adresse zu prüfen. Ab Zend Framework 1.10 kann man Meldungen für `Zend_Validate_Hostname` auch von innerhalb `Zend_Validate_EmailAddress` setzen.

    $validator = new Zend_Validate_EmailAddress();
    $validator->setMessages(array(
        Zend_Validate_Hostname::UNKNOWN_TLD => 'Ich kenne die TLD nicht')
    );

Vor Zend Framework 1.10 musste man die Meldungen einem eigenen `Zend_Validate_Hostname` hinzufügen, und dann diese Prüfung in `Zend_Validate_EmailAddress` setzen um die eigenen Meldungen zurückzubekommen.