supergarv

Garvin Hicking :: blog

"Pardon my rubber" - Fox Mulder

  •  
  •  
  • Über mich
  •  
  • Galerie
  •  
  • Freunde
  •  
  • Tops und Flops
  •  
  • Links
  •  
Zufallsbild
  • Über mich:
  • Vorstellung
  • Lebenslauf
  • Lebensziele
  • Gästebuch
  • Kontakt
  • News
  • Blog
  • Galerie:
  • Artwork
  • Logos
  • Web
  • DTP
  • 3D
  • Fotos
  • Videos
  • Anderes
  • Freunde:
  • Freunde
  • Familie
  • Ich
  • Webcam
  • Schule
  • Caritas
  • Arbeit
  • Anderes
  • Tops und Flops:
  • Filmkritiken
  • Texte
  • IMDB
  • Hitlisten

Kategorien

  • Blafasel
  • Media
  • Bilder
  • Bücher
  • Kino / Video
  • Sneak Preview
  • Musik
  • Spiele
  • PHP / Software
  • Planung

Fotografie von Garvin und Emba

» bei Model-Kartei
» bei Flickr

Flickr: Bilder

Medaillen

superBlog Banner
:inlove:

Macht mich glücklich:

Wunschliste Amazon / Wishlist Amazon

Blog abonnieren

  • XML
  • XML Kommentare

Powered by

Serendipity PHP Weblog

Startseite

Mittwoch, 9. August 2006

Jabber E-Mail Notify

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ß!
Geschrieben von garvin in PHP / Software um 09:34 | Kommentare (3) | Trackbacks (0)


Trackbacks
Trackback-URL für diesen Eintrag

Keine Trackbacks

Kommentare
Ansicht der Kommentare: (Linear | Verschachtelt)

Yeeeha. Funktioniert. Geil. Danke! :D
#1 Andy (Link) am 09.08.2006 10:25
1. Big THX für den Tipp mit der älteren Class Vesrion ! Ich bin an dem Auth Prob der aktuellen fast verzweifelt :(

2. teste doch mal auf der Seite des Autors seine Bsp. besonders das wo er das $JABBER->CruiseControl(60) benutzt ;)
Da bekomme ich im Browser als Feedback :
eddy@jabber.i-pobox.net is Online.EVENT: Keep-Alive returned, connection alive. EVENT: jabber:iq:time (type result) from jabber.org SEND:
wenn ich gerade mit meinem Client online bin. da hast doch dann deinen Status :)
#2 Eddy am 10.09.2006 12:33
Wenn es so einfach wäre! Erwähntes Script von mir ist ja kein Dämon der CruiseControl nutzt - da er ja eventgesteuert aufgerufen wird, muss sich die Verbindung somit jedesmal erneut aufbauen. Und so kann man die Online-Events nicht mitbekommen...
#2.1 Garvin (Link) am 10.09.2006 18:51

Kommentar schreiben

BBCode-Formatierung erlaubt
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss, um dieses Verfahren anzuwenden.
CAPTCHA

 
 
Startseite

Suche

Kalender

Zurück Juli '22
Mo Di Mi Do Fr Sa So
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Kommentare

-thh zu Shutdown
Di, 27.03.2018 18:34
Ich prangere das an!
David zu Ich bin Dein Spoiler, Luke!
So, 20.12.2015 12:21
Sehr ähnliche Meinung zu meiner. Ich hatte erwartet, enttäuscht zu werden, so wie ich es bei JJs Star Trek wurde. Das w [...]
serotonic zu Serien 2014
Sa, 03.01.2015 16:53
+++ Voll gern gelesen +++ (Teufelskreis. Hahaha!
Andi zu Serien 2014
Sa, 13.12.2014 14:39
Achja: The Knick fehlt!
Andi zu Serien 2014
Sa, 13.12.2014 12:22
Ich stimme nicht mit allem überein. Aber grundsätzlich schon. The Mentalist gefällt mir auch nach Red John noch. The [...]

Über mich

Ich heiße Garvin Hicking, wohne in Köln und bin alt genug um ein Blog führen zu dürfen. Derzeit arbeite ich als Webentwickler bei Faktor E, bin gelegentlich selbständig tätig und arbeite mit PHP, (My)SQL und XHTML/ XML/ CSS/ JavaScript.

Meine Freizeit nutze ich zur Entwicklung von Serendipity und phpMyAdmin - und (nicht nur) wenn ich genug von Computer habe, genieße ich das Leben mit meiner Freundin Emba im Kino, hinter der Fotokamera, daheim oder bei unseren Freunden. Und ein Gesicht habe ich auch:
Garvin Hicking
Facebook / Xing

Zend Certified PHP Engineer



(c)1999-2004 by garvin hicking   |   
American English Wunschliste Amazon / Wishlist Amazon

Die Einbindung fremder Bilder erfolgt im Rahmen der journalistischen bzw. persönlichen Berichtserstattung. Urheberrechte dieser Materialien liegen beim Eigentümer.
Weiteres siehe Impressum / Datenschutzerklärung