Jeder kennt sie. Jeder hat mindestens eine. Und die Validierung ist doch auch ganz einfach - oder?

Das dachte ich auch.

Vor einiger Zeit kam bei mir in der Arbeit die Frage auf, “Wie validiert man eine E-Mail-Adresse eigentlich richtig?”. Wenn man die Suchmaschine seines geringsten Mißtrauens benutzt, stößt man auf die wildesten Antworten. Von “ist doch ganz einfach” bis “nein, tu das nicht” findet man eine Vielzahl von Antworten, Codebeispielen und mehr oder weniger komplexen Regular Expressions - jedoch sind die meisten falsch oder zumindest unvollständig. Dies beginnt schon mit der Frage, in welchem Standard der Aufbau einer E-Mail-Adresse definiert ist.

Aktuell enthalten mehrere RFCs 1 Informationen über den korrekten Aufbau einer E-Mail-Adresse. Die beiden wichtigsten sind die RFC 5322 (Internet Message Format) und die RFC 5321 (SMTP). Diese ersetzen ihre Vorgänger wie die RFCs 822, 2822 bzw. 2821 oder 821. Bevor wir genauer ins Detail gehen, sollten wir erst den Aufbau einer E-Mail-Adresse betrachten. Beispielsweise könnte eine E-Mail-Adresse wie folgt aussehen:

foo@example.com

Der Teil vor dem @ wird als local-part bezeichnet. Dieser Teil der Adresse wird nur vom zuständigen Mailserver ausgewertet und verweist auf ein Postfach auf diesem Mailserver. Der Teil nach dem @ wird als domain-part bezeichnet und verweist auf den zuständigen Mailserver, was über die MX-Records im DNS geschieht.

Groß- und Kleinschreibung.

Wer bisher dachte, die Schreibweise von E-Mail-Addressen ist völlig egal, täuscht sich - hat aber gleichzeitig auch wieder Recht. In der RFC wird darauf hingewiesen, dass im local-part zwischen Groß- und Kleinschreibung unterschieden wird. Aber bereits im übernächsten Satz wird darauf hingewiesen, dass dies eigentlich nicht empfohlen wird.

The local-part of a mailbox MUST BE treated as case sensitive. Therefore, SMTP implementations MUST take care to preserve the case of mailbox local-parts. In particular, for some hosts, the user “smith” is different from the user “Smith”. However, exploiting the case sensitivity of mailbox local-parts impedes interoperability and is discouraged. Mailbox domains follow normal DNS rules and are hence not case sensitive.“

RFC 5321 2.4. General Syntax Principles and Transaction Model

Erlaubte Zeichen

Neben den bekannten US-ASCII (a-z, A-Z, 0-9) sind auch weitere Zeichen erlaubt. Dazu zählen diverse Sonderzeichen wie !#$%&*+-=?^_`{|}~' aber auch noch () <> [] : ; @ \ , . " , die im local-part vorkommen dürfen. Die Zeichen der zweiten Gruppe haben teilweise eine spezielle Bedeutung und deren Verwendung im local-part unterliegt gewisser Regeln. Zum Beispiel darf ein @ auch im local-part vorkommen, allerdings nur wenn es innerhalb eines Pärchens von Anführungszeichen oder Backlashs steht.

Beispiele für ungewöhnliche, aber gültige, E-Mail-Adressen

deanna.troi(counselor)@example.com

Was zwischen ( und ) steht, wird als Kommentar gewertet.

"very.unusual.@.unusual.com"@example.com
"Geordi La Forge"@example.com
" "@example.org

Alles was zwischen zwei Anführungszeichen oder zwei Backslash steht, gilt als Quoted String und darf z.B. auch @ oder Leerzeichen enthalten. Auch Punkte sind erlaubt, wenn sie nicht direkt hintereinander geschrieben werden. Bedingung ist allerdings, dass die Anführungszeichen oder Backslashs am Beginn und Ende des local-parts stehen. Eine Adresse wie foo"bar"@example.com wäre zum Beispiel ungültig.

!$%&'*+-/=?^_`{}|~@example.org

Auch Adressen, die keine Zeichen aus dem US-ASCII Zeichensatz verwenden, sind nach den RFC erlaubt.

Durch die RFC 6531 werden nicht nur US-ASCII sondern alle anderen UTF-8 Zeichen erlaubt. Google hat im August 2014 in einem Blogpost 2 angekündigt, dass Gmail ab sofort Mails von und zu Adressen senden und empfangen kann, die aus nichtlateinischen Zeichen bestehen. Allerdings ist die Unterstützung für UTF-8 in E-Mail-Adressen noch sehr jung. Zum Beispiel kann Postfix erst seit Version 3 (Februar 2015) 3 damit umgehen. Auch sonst sieht die Unterstützung laut Wikipedia 4 noch mau aus.

Weiter geht es im zweiten Teil.