Standard E-Mail-Validierung
source link: https://php-de.github.io/jumpto/standard-mail-validation/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Standard E-Mail-Validierung
Dieses Tutorial zeigt grundsätzliche (übliche) Möglichkeiten, eine E-Mail-Adresse (wie sie für den Transport per SMTP im Internet verwendet wird, bestehend aus zwei Teilen, die durch ein @-Zeichen voneinander getrennt sind) zu validieren.
Des Weiteren erhebt dieses Tutorial nicht den Anspruch, sämtlichen RFCs zu diesem Thema zu genügen. Auch viele der großen Provider und E-Mail-Anbieter befolgen nicht alle RFCs.
filter_var
PHP stellt ab Version 5.2 die Funktion filter_var zur Verfügung. Mit dem Parameter FILTER_VALIDATE_EMAIL
kann diese grundsätzlich zur E-Mail-Validierung verwendet werden. Jedoch ist es damit nicht möglich, internationalisierte E-Mail-Adressen zu prüfen – solche werden immer als falsch ausgewertet. Lösungsansätze folgen weiter unten.
function isValidEmail($mail) {
return (bool) filter_var($mail, FILTER_VALIDATE_EMAIL);
}
var_dump(isValidEmail("[email protected]")); // true
var_dump(isValidEmail("pelé@example.com")); // false
var_dump(isValidEmail("mail@übung.de")); // false
Sollte filter_var
nicht eingesetzt werden können, gibt es auf dieser Seite unten (vorletzter Absatz) einen zu RFC 2822 empfohlenen regulären Ausdruck.
We get a more practical implementation of RFC 2822 if we omit the syntax using double quotes and square brackets. It will still match 99.99% of all email addresses in actual use today.
function isValidEmail($mail) {
$pattern = '#[a-z0-9!\\#$%&\'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!\#$%&\'*+/=?^_`{|}~-]+)*'
. '@'
. '(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?#i';
return (bool) preg_match($pattern, $mail);
}
var_dump(isValidEmail("[email protected]")); // true
var_dump(isValidEmail("pelé@example.com")); // false
var_dump(isValidEmail("mail@übung.de")); // false
Dieser kann alternativ zu filter_var
verwendet werden. Ebenso wie bei filter_var
schlägt die Prüfung von internationalisierten Domains fehl. (Das ist hier bereits am Pattern erkennbar.)
Internationalisierte Domainnamen (IDN)
Um auch internationalisierte Domains/E-Mail-Adressen auf grundsätzliche formelle Korrektheit zu prüfen, ist die Konvertierung in Punycode vor der eigentlichen Prüfung nötig. Weitere Informationen und Möglichkeiten zur Konvertierung gibt es hier.
Ohne Punycode: Lose Rahmenprüfung mittels regulären Ausdrücken (Regex)
Diese Variante kommt ohne Punycode-Konvertierung aus. Hierbei spielen die verwendeten Zeichen kaum eine Rolle, denn es wird nur der grobe Rahmen geprüft und ob keine Whitespaces (Leerzeichen, Tabstopps, etc.) vorhanden sind.
function isValidEmail($mail) {
// Gesamtlänge check
// http://de.wikipedia.org/wiki/E-Mail-Adresse#L.C3.A4nge_der_E-Mail-Adresse
if (strlen($mail) > 256) {
return false;
}
$pattern = '#^'
. '\S+'
. '@'
. '(?:[^\s.](?:[^\s.]*[^\s.])?\\.)+[^\s.](?:[^\s.]*[^\s.])?'
. '$#i';
return (bool) preg_match($pattern, $mail);
}
var_dump(isValidEmail("[email protected]")); // false
var_dump(isValidEmail("[email protected]")); // true
var_dump(isValidEmail("test@übärdrübär.com")); // true
var_dump(isValidEmail("[email protected].übärdrübär.com")); // true
Zusatz-Option: DNS-Domain-Prüfung
Generell kann in jeder der oben angeführten Varianten, wenn gewüscht, die Antwort des DNS zur Domain (auf vorhandenen “MX” oder “A”-Record) berücksichtigt werden.
Hinweis: Die an das DNS übergebene Domain der E-Mail-Adresse muss für die Verwendung von internationalisierten Domains (wie bei filter_var
) ebenfalls in Punycode konvertiert sein.
function checkEMailDomainDNS($mail) {
$parts = explode('@', $mail);
return (checkdnsrr($parts[1], "MX") or checkdnsrr($parts[1], "A"));
}
var_dump(checkEMailDomainDNS('[email protected]')); // true
Weiterführende Quellen
Links
- Forumsbeitrag zur Frage, wie
filter_var
validiert.
RFCs zum Thema E-Mail
- RFC 2142 - Mailbox Names for Common Services, Roles and Functions
- RFC 2368 - The mailto URL scheme
- RFC 2822 - Internet Message Format
- RFC 3696 - Application Techniques for Checking and Transformation of Names
- RFC 4021 - Registration of Mail and MIME Header Fields
- RFC 5321 - Simple Mail Transfer Protocol
- RFC 5322 - Internet Message Format
- RFC 5335 - Internationalized Email Headers
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK