Jeder kennt spam. Jeder hasst spam. Und jeder, der seine E-Mail-Adresse im Internet veröffentlicht (z.B. weil er eine eigene Domain besitzt) bekommt eine Menge Spam.

Ich gehöre zu den Leuten, die eine Menge Spam erhalten. Natürlich gibt es Anti-Spam-Lösungen, aber die beste Lösung wäre es, wenn der Spam gar nicht erst ankommt. Und Spamfilter kosten eine Menge Arbeit und/oder filtern zu wenig oder zu viel. Darum habe ich mich entschlossen, einen „Torwächter“ in PHP zu schreiben, der möglichst viel Spam abblockt, aber alle gültigen E-Mails durchlässt.

Dazu wird automatisch eine Antwort erstellt. In dieser Antwort ist meine gültige, „geheime“ E-Mail-Adresse als Bild hinterlegt. Bots werden dieses Bild nicht lesen können, ein Mensch jedoch schon. Natürlich gibt es auch noch Bots, die tatsächlich durch kommen sollen. Beispielsweise soll der periodische Check meiner Denic-Daten nicht geblockt werden. Hierzu existiert eine simple White-List.

Ich habe mich bewusst dazu entschieden, das Ganze so simpel wie Möglich zu halten. Ein paar Sachen konfigurieren, PHP – Dateien hochladen und fertig. Auf MySQL-Verbindungen o.ä. habe ich also bewusst verzichtet.

Ganz ohne zusätzliche Tools kommt das Script leider nicht aus. Ein Ersatz für die „mail“-Funktion von php war mittels swiftmailer notwendig. Das ist aber kein größeres Problem: Dateien herunterladen und die Inhalte des „lib“-Verzeichnisses auf den Webserver hochladen. Das war es im Wesentlichen schon.

Der Swiftmailer wird durch eine schlichte Zeile eingebunden:

Für den Zugriff auf das Postfach sind ein paar IMAP-Einstellungen notwendig. Theoretisch ginge auch ein POP-Zugriff, der IMAP-Zugriff hat aber klare Vorteile, da dort der E-Mail-Inhalt nicht heruntergeladen werden muss. Und der interessiert uns für den Autoresponder nicht.

Nun noch schnell die E-Mail-Adressen konfigurieren. $targetMail ist die echte, private E-Mail-Adresse. $thisMail ist die öffentliche E-Mail-Adresse, die den Spam abfangen soll.

Als nächstes muss ein Bild erstellt werden, dass ausschließlich die private E-Mail-Adresse enthält. Sucht eine schöne Schriftart aus. Wer will kann auch eine Captcha-Schrift wählen. Aber Oma ist damit dann vermutlich auch raus…

Lade das Bild nun auf den Webserver und trage die URL in das Script ein:

Jetzt sind noch ein paar Texte zu hinterlegen. Und zwar die E-Mail-Inhalte, die der Sender sehen soll. $templateHtml ist für den HTML-Inhalt der mail, $templatePlain ist für diejenigen, die keine HTML-Email anzeigen können (oder wollen). Nur Besitzer von E-Mail-Clients mit HTML-Funktionen sind in der Lage, das Bild anzuzeigen. Die anderen müssen stattdessen auf einen Link klicken.

$templateForward ist zu guter Letzt der Text, den Du selbst siehst, wenn eine E-Mail aufgrund der Whitelist weitergeleitet wird.

Also, sei kreativ 🙂

Zwei spezielle Platzhalter sind erlaubt. „__EMBED__“ wird automatisch durch das Bild ersetzt. (nur im HTML-Template möglich)“__URL__“ enthält stattdessen einen direkten Link zu der Datei.

Als allerletzte Option kann optional die Whitelist hinterlegt werden. Trenn die gültigen Absender durch Komma.

Das war es auch schon mit der Konfiguration. Nun noch etwas Info, was das Script überhaupt macht:

Zunächst prüft das Script, ob auf dem IMAP-Server neue, ungelesene E-Mails liegen. Es werden dann die Header (Betreff, Absender, etc.) der E-Mails abgerufen. Der Absender wird mit der White-List verglichen. Ist der Absender in der Whitelist enthalten, wird der E-Mail-Inhalt heruntergeladen und die E-Mail direkt als Anhang weitergeleitet an Deine private Adresse.

Befindet sich der Absender nicht in der Whitelist, wird stattdessen eine automatische Antwort zurückgeschickt, welche das Bild mit der privaten E-Mail enthält.

Als letzter Schritt wird die E-Mail als gelesen markiert.

In einer perfekten Welt…

… wäre es das jetzt. Aber leider kann (und wird) es Probleme mit Absendern geben, die nicht dem RFC 2822-Standard entsprechen. Die meisten Spammer sind übrigens Standardkonform. Deine Mutti ist es nicht… 🙂

Das liegt daran, dass es einen E-Mail-Client von einer kleinen Firma in Redmond gibt, die sich mit Standards nicht so auskennt… Das ist zwar unschön, aber in unserem Fall kein wirklich großes Problem. Öffne einfach die Datei lib\classes\swift\Mime\Headers\MailboxHeader.php von swiftmailer kommentiere den „throw“-Part der letzten Funktion aus:

 

Das wars dann auch schon. Hier nun das komplette Script:

Speichere es einfach als „reply.php“ (oder einen beliebigen anderen Dateinamen) und schick ein paar Test-Emails. Öffne dann das Script in Deinem Browser. Wenn alles soweit in Ordnung ist, kannst Du einen Cronjob eintragen um das Script automatisch auszuführen. Das folgende Beispiel macht dies etwa alle 5 Minuten:

 

Wenn Du Hilfe brauchst: Einfach kommentieren. Viel Spaß 🙂