PHP / MySQL

Fake-Mails in den Müll – PHP ist die Lösung (Email-Validation)

WordPress Entwickler und Webdesigner

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.

Anzeige:




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ß

Schlagworte zu diesem Artikel: , , , ,

Veröffentlicht von Pascal Bajorat

Pascal Bajorat ist Mediengestalter und arbeitet als Webdesigner / Webentwickler, Autor und Trainer in Berlin. In den vergangenen Jahren hat er sich vor allem auf das CMS WordPress und die Entwicklung von hochwertigen Webseiten und Sonderlösungen spezialisiert. Er hat den Webdesign-Podcast.de 2010 gegründet.

Webseite:

3 Antworten zu “Fake-Mails in den Müll – PHP ist die Lösung (Email-Validation)”

  1. Danke für diesen Artiekl. Ich kennm ich noch nicht so gut mit html aus, aber ich hoffe, dass ich es hinbekomme mit deiner Anleitung.
    Diese Spam Mails isnd einfach schrecklich. Mittlerweile habe ich, wie viele von uns, mehrere Emailadressen wo mind. eine für die ganzen Spam is…

    • Falls du willst, dass ich irgendwas mache sag bescheid.
      Ich mach gerne Artikel fertig. Gebt mir Vorschläge und ich schaue was ich mache.

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden .

Der Benachrichtigungs-Dienst wird von WordPress.com (Automattic Inc., USA ) bereitgestellt. Mit der Anmeldung akzeptierst du die Datenschutzerklärung. Die Abmeldung / Abo-Verwaltung ist jederzeit über diesen Link möglich.