Jeder kennt das Problem: Da loggt man sich in der Universität, Berufsakademie oder anderen Orten ins (W-)LAN ein und darf nur per Port 80 (HTTP) oder 443 (HTTPS/SSL) ins Internet. Doch wie kann man jetzt prüfen, ob man neue Mails bekommen hat? Dauernd den Webmailer offen zu haben, ist auch irgendwie nicht ganz das Gelbe vom Ei. Gerade wenn man mehrere Konten zu prüfen hat. Ich habe also eine Lösung für Microsoft-Betriebssysteme programmiert :) Mein Programm sollte unter Windows ME, Windows 2000, Windows XP und Windows Vista lauffähig sein. Serverseitig wird PHP mit IMAP-Erweiterung benötigt.

Das Programm besteht aus zwei Komponenten. Die eine Komponente ist ein serverseitiges PHP-Script, welches auf jedem PHP-Webspace mit IMAP-Untersützung lauffähig ist. Sollte IMAP in PHP nicht verfügbar sein, müsste man sich das Script auf die PEAR-Bibliothek “Mail_IMAPv2” umschreiben. Die meisten Hoster bieten aber IMAP-Unterstützung an. Derzeit kann das Skript zudem NUR IMAP-Konten abfragen. Da die Passwörter im KLARTEXT im Quelltext abgelegt werden, sollte das Skript in einem passwortgeschützten Bereich und auf einem vertrauenswürdigen Space abgelegt werden (Stichwort: AUTH BASIC). Das Script bietet verschiedene Rückgabewerte:

  • Ist der Wert 0, so gibt es keine neuen Nachrichten.
  • Ist der Wert >0, so gibt es $Wert neue Nachrichten
  • Ist der Wert sonstiges, so ist ein Fehler aufgetreten
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<!--?php
//SSL:
$server = "{localhost:143/imap/tls/novalidate-cert}Inbox";
//NO-SSL:
//$server = "{localhost:143/imap/}Inbox";
$user = "IMAPLOGIN";
$pass = "PASSWORT";
$mbox = imap_open($server, $user,$pass) or die('connection failed');
$status = imap_status($mbox,$server, SA_UNSEEN);
echo $status--->unseen;
imap_close($mbox);
?>

Der zweite Part ist der clientseitige Mailchecker: Dieser wurde in AutoIT mittels SciTE geschrieben. Das Programm-Icon ist von famfamfam und steht unter der CC2.5-Lizenz. Die restlichen icons sind derzeit aus der system32/shell.dll. Das fertig kompilierte Paket mit allen Developmentfiles ist ganz unten zu finden.

 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=note_go.ico
#AutoIt3Wrapper_outfile=notifier.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Description=Prüft Mails per PHP-Script
#AutoIt3Wrapper_Res_Fileversion=0.1.0.0
#AutoIt3Wrapper_Res_LegalCopyright=Copyright 2008 by Ulrich Wolf <m@il.wolf-u.li>
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs
Dieses Programm ist unter einer Creative Commons-Lizenz lizenziert;
Es darf unter Namensnennung der Autoren nicht-kommerziell weiter-
gegeben und auch bearbeitet werden, soweit das neue Werk gleichfalls
wieder dieser Creative-Commons-Lizenz unterliegt. Die Einzelheiten
ergeben sich aus dem Lizenzvertrag unter:
http://creativecommons.org/licenses/by-nc-sa/2.0/de/
#ce
#Include <constants.au3>
#include <inet.au3>
Opt("TrayMenuMode",1)
$exititem       = TrayCreateItem("Exit")
$recheckstart   = IniRead("notifier.ini", "config", "recheckstart", 270000)
$recheckdiff    = IniRead("notifier.ini", "config", "recheckdiff", 60000)
$ballontimeout  = IniRead("notifier.ini", "config", "ballontimeout", 1000)
$rechecktime    = $recheckstart + Random(0,$recheckdiff,1)
$checkadress    = IniRead("notifier.ini", "check", "adress", "ERROR")
$checkname      = IniRead("notifier.ini", "check", "name", "ERROR")
TraySetState()
TraySetClick(16)

$start = 0
$state = 0
While 1
    $msg = TrayGetMsg()
    If $msg = $exititem Then ExitLoop
    If $msg = $TRAY_EVENT_PRIMARYDOUBLE Then
        $start = $rechecktime + 1
    EndIf
    If TimerDiff($start) &gt; $rechecktime Then
        TraySetIcon("Shell32.dll",14) ;Checking Mails
        $source =_INetGetSource($checkadress)
        If String($source) = "0" Then ;No unread Mail
            TraySetIcon("Shell32.dll",22)
            TraySetToolTip($checkname &amp; " - Keine ungelesenen Nachrichten - Last Check: " &amp; @HOUR &amp; ":" &amp; @MIN &amp; ":" &amp; @SEC)
            $state = 0
        ElseIf Number($source) &gt; 0 Then ;New Mail
            TraySetIcon("Shell32.dll",25)
            If $state &lt;&gt; 1 Then
                TraySetToolTip($checkname &amp; " - " &amp; $source &amp; " ungelesene Nachrichten - Last Check: " &amp; @HOUR &amp; ":" &amp; @MIN &amp; ":" &amp; @SEC)
                TrayTip("Neue Nachrichten in " &amp; $checkname,"Anzahl: " &amp; $source, 1, 1)
                Sleep($ballontimeout)
                TrayTip("","",0)
            EndIf
            $state = 1
        Else ;Error
            TraySetIcon("Shell32.dll",54)
            If $state &lt;&gt; -1 Then
                TraySetToolTip("Error - Last Check: " &amp; @HOUR &amp; ":" &amp; @MIN &amp; ":" &amp; @SEC)
                TrayTip("Fehler","Bitte prüfen Sie das Ergebnis des Checkers von Konto " &amp; $checkname, 1, 1)
                Sleep($ballontimeout)
                TrayTip("","",0)
            EndIf
            $state = -1
        EndIf
        $start = TimerInit()
        $rechecktime = $recheckstart + Random(0,$recheckdiff,1)
    EndIF
WEnd

Exit

Alle Einstellungen werden vom Programm aus einer INI-Datei geholt:

1
2
3
4
5
6
7
8
[config]
recheckstart=270000
recheckdiff=60000
ballontimeout=1500

[check]
adress=http://ihre.check-adresse.tld/dateiname.php
name=Aussagekraeftiger Name

Zu den Einstellungen:

  • recheckstart: Abstand zwischen den Checks in Millisekunden
  • recheckdiff: Varianz der Checks in Millisekunden
  • ballontimeout: Millisekunden, die der Ballon im Tray angezeigt wird
  • adress: Aufzurufende Adresse, wo das PHP-Skript liegt. Kann auch als http://user:password@ihre.check-adresse.tld/dateiname.php verwendet werden
  • name: Aussagekräftiger Name für das Konto

Warum benötigt man die Varianz der Checks? Ein IDS (Intrusion Detection System) prüft unter anderem auch auf eventuelle Regelmäßigkeiten im Traffic. Da der Mailchecker nicht im Sinne des Erfinders der Portsperre ist, soll er auch keine Regelmäßigkeiten aufweisen. Ich habe bei mir alle so eingestellt, dass etwa alle 5 Minuten ±30Sekunden geprüft wird. Hierzu habe ich recheckstart auf 4,5 Minuten gestellt und die Varianz auf 60 Sekunden.

Warum muss man einen aussagekräftigen Namen vergeben? Ich habe das Programm so geschrieben, dass man es auch mehrmals aufrufen kann. Daher kann man das Programm (und natürlich das Serverseitige Script) mehrmals kopieren und aufrufen. Bei Eingang einer Mail poppt dann im Tray der Ballon mit dem Namen auf.

Warum ist das Passwort & der Benutzername nicht clientseitig gespeichert und dem Server-Script erst bei Aufruf übergeben? Relativ einfach: Eine Kommunikation ist nicht sicher, solange diese nicht über SSL läuft (auch dann kann Sie unsicher sein, aber das ist nicht Thema meines Beitrages). Daher können, im Klartext übertragene Passwörter gefährliche Auswirkungen wie Identitätsklau oder Spionage zur Folge haben.

Beenden kann man das Programm mittels eines Rechtsklicks auf das Icon. Ein Doppelklick löst einen manuellen Mailcheck aus. Das Programm hat den unauffälligen Namen “notifier”, kann aber jederzeit durch eine manuelle Kompilierung auf einen anderen Namen kompiliert werden.

Download von Mailchecker V0.4

TODO:

  • Prüfung mehrerer Konten in einer Programminstanz (geplant for 0.5)
  • Icons vereinheitlichen (geplant for 0.5)

KNOWN BUGS:

  • None