Wie oft passiert euch das?
Ihr geht auf eure Seite und seht User mit irgendwelchen komischen Fake-Mail Adressen?
Tja, Fake-Mails haben sich durchgesetzt.
In diesem Artikel möchte ich euch einmal zeigen wie man anhand einer bekannten Liste und PHP sogenannte „Spammails“ erkennt.
Doch zu aller erst…
Was sind Fake-Mails?
Fake-Mails sind E-Mail Adressen die dazu gedacht sind, für Seiten genutzt zu werden, die einem oft Mails schicken.
Bei einer solchen Fake-Mail hat man meinst eine zufällige E-Mail Adresse, die man ohne Passwort aufrufen kann und deren Postfach nach einer bestimmten
Zeit gelöscht wird.
Wozu nutzen User diese?
Nutzer möchten nicht immer Spam per Mail bekommen.
Das ist der Grundgedanke. Aber heutzutage benutzen viele diese Adressen um Seiten zu zuspammen,
sich nach einer Sperrung neu zu registrieren oder einfach nur um zu nerven.
Gibt es gegen Fake-Mail einen Schutz?
Jaein, wie ich im nächsten Abschnitt zeige kann man sich einen Schutz bauen, aber es wird immer neue Anbieter für Fake-Mails mit immer neueren Domains geben.
Ein 100%iger Schutz ist somit unmöglich.
Fake-Mails in PHP erkennen
Jetzt zum eigentlichen PHP Code.
Die Quelle unserer Fake-Mail Domains ist Mogelmail.
Diese Seite bietet euch eine Liste mit bekannten Fake-Mail Domains, welche ständig geupdated wird.
Hier findet ihr die Liste der auf Mogelmail.de gesammelten Domains als XML.
Diesen Code wollen wir nun auslesen und mit Hilfe einer Funktion zum überprüfen nutzen.
Als erstes definieren wir die Funktion:
function checkMail($host) {
}
Nun laden wir uns das XML herunter:
$xml = file_get_contents('http://www.mogelmail.de/mogelmails.xml');
Als nächstes instanziieren wir SimpleXML um das XML lesen zu können:
$simpleXML = simplexml_load_string($xml);
Nun suchen wir die Domain.
Aber wie? Dazu nutzen wir XPath.
XPath ist, man könnte sagen eine „Suche“.
Über XPath können wir nach Elementen mit bestimmten Namen, Werten und Attributen suchen.
Infos zu XPath und eine Anleitung findet ihr hier
Nun zu unserem Code:
$elements = $xml->xpath('/domainlist/domainitem[domain="' . $host . '"]/domain');
Ich erkläre euch den Code erst einmal:
- Mit $xml->xpath() suchen wir nach Elementen, im angegebenen Pfad.
- / am Anfang bedeutet wir beginnen beim Root Element. // würde bedeuten wir beginnen dort wir was Passendes finden
- domainlist ist das erste Element im DOM
- mit /domainitem suchen wir im Element domainlist nach Elementen mit dem Tag „domainitem“
- in den eckigen Klammern steht ein einfacher Filter. In unserem Fall steht dort: domain=“‚ . $host . ‚“
- domain ist der Name eines Kindelementes von domainitem und repräsentiert den Wert des jeweiligen <domain>-Tags
- = bedeutet, dass geprüft werden soll ob die Werte übereinstimmen
- zwischen den „“ steht der Wert zum vergleichen. Bei uns schließen wir den String, setzen den Wert von $host ein und öffnen den String wieder.
- am Ende bekommen wir alle gefunden <domainitem>-Tags in einem Array zurückgegeben und speichern die in der Variable $elements
Nun wird geprüft ob die Domain vorhanden ist und das Ergebnis zurückgegeben:
return (bool) count($elements);
Eine kurze Erklärung:
- Über return geben wir den Wert zurück.
- count() gibt uns die Anzahl der Elemente im Array zurück.
- (bool) konvertiert die Anzahl der Elemente ( Zahl, also Integer ) in einen Boolean Wert, also true oder false. Beachtet: Zahlen über 0 sind boolean true, Zahlen unter 1 sind false!
Unser endgültiger Code für die Funktion sieht nun so aus:
function checkMail($host) {
$xml = file_get_contents('http://www.mogelmail.de/mogelmails.xml');
$simpleXML = simplexml_load_string($xml);
$elements = $xml->xpath('/domainlist/domainitem[domain="' . $host . '"]/domain');
return (bool) count($elements);
}
Nun müsst ihr eure E-Mail Adressen nur noch vor dem Eintragen in eure Datenbank prüfen:
if (checkMail($eMail)) {
// Hier euer Code
}
Ein kleiner Tipp am Rande
Um einen Host aus einer E-Mail Adresse zu gewinnen kann man die Funktion parse_url() nutzen.
Dies sähe etwa so aus:
$array = parse_url($eMail);
Nun erhaltet ihr einen Array.
Der Schlüssel „host“ dieses Arrays ist der Host der E-Mail Adresse.
Weitere Informationen zu dieser Funktion findet ihr hier.
Schlusswort
Ihr könnt nun mit PHP bekannte Fake-Mails enttarnen und so dafür sorgen, dass eure User sich nicht hinter falschen Adressen verstecken.
Achtet aber darauf, dass dies manchen Usern nicht gefallen wird, da diese wirklich keine E-Mails von euch wollen. Bietet diesen eine Funktion um
Newsletter, etc. abzustellen, damit es auf beiden Seiten fair bleibt.
Ich freue mich natürlich über Kritik und Kommentare aller Art.
Bis dahin,
mit freundlichen Grüßen,
Justin Nuß