Aloha!
Aber so wie ich die Kommentare im Manual deute muß ein Mailserver nicht unbedingt einen MX-Eintrag besitzen!
Richtig. Fällt mir jetzt auch auf, dass diese Variante Müll ist.
Wobei mir der reguläre Ausdrucg _NICHT_ gefällt, aber er fragt zuerst nach MX-Einträgen des Hosts, danach aber noch nach _ANY_ anderen DNS Einträgen. Müssen das alle sein, oder reichen da nicht bestimmte?
Irgendwo muss das offizielle DNS-System ja einen IP-Eintrag haben für den Host-Teil der Mailadresse. Den gilt es zu finden, und dorthin sendet der Mailserver die Mail.
Ach ja: Was passiert, wenn als Host-Teil eine IP-Adresse angegeben ist? Wäre gültig - nur dürfte das DNS-System keine IP-Adresse für die IP-Adresse finden, weil es nur IP-Adressen für Namen findet. Die IP-Adresse muss man nicht mehr in IP-Adressen auflösen. :)
If this function is going to be used for e-mail validation purposes; Please
bear in mind that MX records are not mandatory and that RFC974 clearly
states: If no MX records exist for a given host, MTAs should interpret
this as if there is one MX RR matching the host itself. (I.e. you should
call gethostbyname() to see if the host has an A record.)
Wenn für user@domain.tld (also "domain.tld") kein MX-Eintrag existiert (der sonst sagen würde, dass Mails primär an "mail.domain.tld" gehen sollen, und sekundär an "backup.provider.tld"), dann ist der Host "domain.tld" für Mails zuständig, und dahin wird gesendet.
<?php
$host=$host.".";
if ( getmxrr( $host, $mxhosts ) == FALSE &&
gethostbyname( $host ) == $host ) {
echo "$host is not a valid e-mail host.";
} else {
echo "$host is a valid e-mail host.";
}
?>
Dieses verstehe ich nicht so ganz. Er testet ob ein MX-Eintrag existiert, und wenn nicht ob der aufgelöste Host = dem zu prüfenden Host ist. Aber bringt das dann überhaupt noch was? Kann man das nicht besser beschränken?
gethostbyname() liefert als Ergebnis die IP-Adresse des Namens. Kann der Name nicht aufgelöst werden, wird der Name zurückgeliefert.
if (gethostbyname($host) == $host) prüft, ob aufgelöster Name und Name identisch sind. Wenn ja, ist die Auflösung fehlgeschlagen. Wenn nein, hat gethostbyname() eine IP-Adresse zurückgeliefert (hoffentlich).
Noch eine Frage: Wer wird mit getmxrr() .. abgefragt? Ist man darauf angewiesen das der Server selbst online ist, oder fragt man nur irgendwelche Namenserver ab, die "immer" online sind?
Alle Funktionen fragen DNS-Server ab. Man sollte bedenken:
1. Die Befragung eines Nameservers dauert eine gewisse Zeit. Im schlimmsten Fall muss nämlich erst einer der Root-Server nach der Zuständigkeit für die TLD gefragt werden, und der NIC-DNS-Server dann nach der Domain, und der Nameserver der Domain dann nach dem MX-Eintrag bzw. dem Nameservereintrag (eine oder mehr Stufen weiter kann das Spielchen durchaus gehen, vor allem bei Mailadressen von Hochschulen und sehr großen Firmen, die ein weit verzweigtes Netzwerk und viele Subdomains mit separaten Nameservern haben). Möglicherweise sind einige Informationen gecachet, andere aber nicht unbedingt.
2. Was passiert, wenn gerade der Nameserver nicht erreichbar ist? Dann werden alle Mails als falsch zurückgewiesen, nur weil temporär ein Problem besteht, auf dass der Kunde keinen Einfluss haben kann? Das kanns nicht sein.
3. Was ist, wenn das DNS-System veraltete Informationen an den Server leitet bzw. die neuesten Informationen (neu angemeldete Domain) noch nicht kennt? Dann wird eine schon gültige und korrekt konfigurierte Mailadresse ebenfalls fälschlich zurückgewiesen, bzw. fälschlich doch erlaubt.
Zumindest reicht Steffis Version nicht aus, außerdem würde ich an Ihrere Stelle lieber positiv definieren was in einer Email Adresse stehen darf, denn umgekehrt erwischt man eh nicht alle Zeichen!
Ich würde ganz banal folgendes an einer Mailadresse prüfen:
Sind mehr als 3 Zeichen angegeben? Ist eines davon ein "@"?
Sind diese einfachen Bedingungen nicht erfüllt, ist keine Mailadresse angegeben worden. Ein "@" ist elementarer Bestandteil einer Mailadresse, und vorher und nachher muss für Username und Host mindestens ein Zeichen vorhanden sein.
Man könnte die Mindestzeichenzahl noch erhöhen: Der Username kann aus einem Zeichen bestehen, aber der Domainname muss im Internet mindestens eine Top-Level-Domain haben - also ein Zeichen Domainname, ein Punkt, und mindestens 2 Zeichen TLD. Zusammen 6 Zeichen. Kürzere Internet-Mailadressen gibts nicht. Eine real existierende Domain http://www.x.org könnte beispielsweise diese EMail-Adresse definiert haben: a@x.org. Da die DeNIC nur vier zweibuchstabige Domains vergeben hat und ansonsten mindestend drei Buchstaben verlangt, wird auch in Deutschland die kürzeste EMail-Adresse mindestens 7 Zeichen lang sein. Unter http://www.ix.de ist das Webangebot von Heise (Zeitschrift iX) erreichbar. Die Redakteure haben alle Zwei-Buchstaben-Mailkürzel. Es dürfte im Bereich des möglichen liegen, dass real existierende Mailadressen in der Form xx@ix.de existieren. Ein MX-Eintrag für die Domain ix.de existiert.
Da ich nicht weltumspannend weiß, ob irgendein Länder-NIC einbuchstabige Domains zugelassen hat (oder vielleicht irgendwann man viel Geld dafür bekommt, dass dies geschieht), ist man mit dieser Annahme auf der sicheren Seite.
Alle weitergehenden Prüfungen schließen möglicherweise gültige EMail-Adressen aus.
Außerdem prüft die Prüfung bisher ja nur, ob die Mailadresse theoretisch funktionieren könnte. Ob sie tatsächlich echt ist, kann nur dann geprüft werden, indem eine an die Adresse versandte Mail positiv beantwortet wird. Denn Mails können gefiltert werden, verloren gehen, statt beim Empfänger ohne Fehler-Rückmeldung beim Mailadmin/Postmaster oder beim Generalempfänger landen, und und und...
- Sven Rautenberg