Jabber Mail Notification


I always struggled to find the right mail notification applet for my desktop. Furthermore I always stumble over the question: Why do I have to ask the mail server in a defined time interval “Do I have a new e-mail?”. Wouldn’t it be better if the mail server notifies me if a new e-mail arrives?
This is probably somehow a new form of the good old question “mailing list vs bulletin board” or in general: Do i have to fetch the information or does the information come to me? Personally i always preferred to get the information and not to hunt around for them.

Thinking about this question i realized that notification through Jabber would be perfect and the open XMPP protocol virtually invites one to do such things.

The idea was born. Now the first step was to find a easy to use XMPP implementation for a scripting language like Python, Ruby or PHP. At the end I found a quite nice and easy to use PHP library. While searching such a library I also found this guidance (German only), borrowed some code from it and my solution was born:

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
32
33
34
35
36
37
38
<?php
// The script gets the input either as an argument, from a REQUEST-variable or from stdin
// If you use it within procmail you will get the input through stdin 
if ($argv[1]) {
    $msg = $argv[1];
} elseif ($_REQUEST['msg']) {
    $msg = urldecode($_REQUEST['msg']);
} else {
    // open stdin. Only read the first 4096 character, this should be enough to match
    // the FROM- and  SUBJECT-header
    $stdin = fopen('php://stdin', 'r');
    $msg   = fread($stdin, 4096);
 
    if (empty($msg)) {
        $msg = "empty";
    } else {
        // Get FROM und SUBJECT
        preg_match('@From:(.*)@i', $msg, $from);
	preg_match('@Subject:(.*)@i', $msg, $subject);
        $msg = "\n" . $from[0] . "\n" . $subject[0] . "\n";
    }
}
 
// now init xmpp and get the notification out
include 'XMPPHP/XMPP.php';
 
$conn = new XMPPHP_XMPP('schiessle.org', 5222, 'user', 'password', 'xmpphp', 'schiessle.org', $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO);
 
try {
    $conn->connect();
    $conn->processUntil('session_start');
    $conn->presence();
    $conn->message('me@jabber.server.org', $msg);
    $conn->disconnect();
} catch(XMPPHP_Exception $e) {
    die($e->getMessage());
}
?>

Now I just had to tell procmail to pipe the mails through the PHP script. If you want to get notified about all mails you can simply put this line at the top of your procmail rules (Or maybe at least behind the spam filter rules ;-) ):

1
2
:0c
|php /home/schiessle/bin/mailnotification.php

I want to get notified only about some specific mails so I extended my procmail rules in this way:

1
2
3
4
5
6
7
8
9
:0
* ^(To:|Cc:).*foo@bar-mailinglist.org
{
 	:0c
        |php /home/schiessle/bin/mailnotification.php
 
        :0
        .bar-list/
}

That’s it! All in all it was quite easy to get e-mail notification through Jabber. Now I don’t have to search for the right applet, configure it etc.. All I have to do is to start my Jabber client and I will get notified about new mails whatever desktop or computer i’m using.

flattr this!