In letzter Zeit ging es mir sehr auf die Nerven, ständig das s9y-Forum als auch meine E-Mails ab und zu zu überprüfen um herauszufinden ob es neue Beiträge/Mails gab.
Da musste also eine Alternative her. Wenn ich am PC sitze, läuft üblicherweise immer auch Trillian mit. Dadurch bin ich mit ICQ, MSN und Jabber verbunden. Da Jabber ein offenes Protokoll ist, bietet sich das für solche Spielereien natürlich an.
Meine E-Mails werden von meinem kleinen Heimserver ständig auf einem Linux-Rechner gepollt. Da ist also die .procmail prädestiniert für einen E-Mail-Notification Push-Dienst. Am Ende meiner .procmailrc habe ich also lediglich:
CODE:
:0c
|php /home/www/jabber.php
eingetragen. Das weist den MTA dazu an, eine Kopie der aktuellen Mail an den Notifier zu schicken. Wohlgemerkt ganz am Ende, wenn der ganze Spam schon größenteils rausgefiltert wurde
Als weiteres braucht man natürlich ein neue Jabber-ID, die der Bot nutzen kann um meinem richtigen Jabber-Account eine Message zu schicken. Das ist aber kein Problem, da man mittels Jabber-Protokoll und einem Jabber-Client einfach einen neuen Account wie "garvbot@jabber.org" erstellen kann.
Nun bedarf es noch besagter
jabber.php. Diese setzt die Klasse
class.jabber.php ein. Ursprünglich habe ich die aktuelle Version ausprobiert, die aber mit den Jabber-Servern Authentifikations-Probleme machte ("501 not supported"). Da ich gerade kein XMPP lernen wollte, habe ich einfach die ältere Version 0.4.2 eingesetzt, die soweit für meine Zwecke problemlos funktioniert. Diese Datei wird also mit in mein /home/www Verzeichnis gepackt, und die jabber.php sieht wie folgt aus (Code-Kommentare beachten!):
CODE:
<?php
// Da diese Datei auch evtl. per HTTP angesprochen wird, soll das Script nicht abbrechbar sein
ignore_user_abort(true);
// class.jabber.php einbinden
require_once "class.jabber.php";
// Ein neues JABBER Objekt erstellen, mit den gewünschten Zugangsdaten.
$jabber = new Jabber();
// Servername für den Account
$jabber->server = 'jabber.org';
// Username für den Account
$jabber->username = 'garvbot';
// Klartext-Passwort für den Account
$jabber->password = 'passwort';
// Die Ressource klassifiziert lediglich einen Account, ist also nur ein Hilfsmerkmal
$jabber->resource = 's9yNotificationBot';
// Logging für Probleläufe
$jabber->enable_logging = true;
// Der Empfänger für meine Nachrichten
$jabber->to = 'garv@schokokeks.org';
// Der Jabber-Verbindungsaufbau dauert gut 15-20 Sekunden. Um ein Amoklaufen der Scripte zu verhindern,
// wird ein "Lockfile" erstellt. Nur wenn dieses nicht existiert oder älter als 2 Minuten ist, darf
// der Bot seine Nachricht schicken. Dies bedeutet auch, dass das PHP-Script in der Lage sein muss,
// auf den Ordner in dem es sich befindet eine Datei erstellen zu können! (chmod 777 o.ä.)
if (!file_exists('active') || filemtime('active') < time()-120) {
// Altes Lockfile löschen
@unlink('active');
// Neues lockfile erstellen und Zugriffsrechte setzen
$fp = fopen('active', 'w');
fwrite($fp, time());
fclose($fp);
chmod('active', 0777);
// Jabber-Verbindung herstellen
$jabber->Connect();
$jabber->SendAuth();
// Die Eingabe bezieht das Script entweder von einem Konsolen-Aufruf, von einer REQUEST-Variable
// oder aus stdin. Beim Mailnotify kommt die Eingabe immer von stdin.
if ($argv[1]) {
$msg = $argv[1];
} elseif ($_REQUEST['msg']) {
$msg = urldecode($_REQUEST['msg']);
} else {
// stdin öffnen. Nur die ersten 4096 Zeichen lesen, wir wollen ja eh nicht so viel schicken
$stdin = fopen('php://stdin', 'r');
$msg = fread($stdin, 4096);
if (empty($msg)) {
$msg = "empty";
} else {
// FROM und SUBJECT der E-Mail auslesen.
preg_match('@From:(.*)@i', $msg, $m1);
preg_match('@Subject:(.*)@i', $msg, $m2);
$msg = "E-Mail: " . $m1[1] . "\n" . $m2[1];
}
}
// Jabber muss escaptes HTML senden. Sicherheitshalber schicken wir nur 512 Zeichen.
$msg = htmlspecialchars(substr($msg, 0, 512));
// Nachricht senden
$jabber->SendMessage($jabber->to, "normal", NULL, array("body" => $msg));
// Lockfile löschen
@unlink('active');
} else {
// Dieser Fall tritt ein, wenn ein anderer Prozess noch läuft
echo 'Discarded';
}
Selbiges Script habe ich ins s9y Forum in die "posting.php" Datei eingehackt. Dort wird ein iframe erzeugt, der die jabber.php Datei auslöst. So wird der Client nicht mit dem 15-20 Sekunden "Timeout" belästigt.
Was an dieser Art der Notification cool ist: Es ist ein "Push" statt einem "Pull". Ich werde quasi ohne Aktivität benachrichtigt, im Gegensatz zu existierenden Plugins die POP3/IMAP-Postfächer abrufen. Ausserdem ist es besser als SMS-Notification, weil ich mittels Jabber-Client auf dem Handy auch kontrollieren kann, wann ich notified werden will. Schließlich nervt es, nachts SMSe zu empfangen.
Ein kleines Problem hat das Script noch: Es kann keinen "Presence"-Check der Gegenstelle machen. Optimalerweise würde ich gerne nur dann Notifications erhalten, wenn ich auch online bin. Denn eine Riesen-Queue von Offline-Nachrichten zu empfangen, finde ich suboptimal. Alle Tests gestern einen Online-Status eines Nutzers rauszufinden sind bei mir gescheitert. Vielleicht findet sich jemand, der das Script aufbohren mag?
Das kleine Script dürft ihr benutzen, wie ihr lustig seit, es hat keine Lizenz. Viel Spaß!