Effizienz-Hacks: Mailabruf erschweren

Ich weiß nicht, wie es Ihnen geht, aber ich gestehe: Mail, Facebook und Co. sind echte Zeitfresser in meinem Leben. Wenn ich gerade mal nicht vorwärts komme, lese ich abwechselnd E-Mails (manchmal im Minutentakt) oder schaue, was es bei Facebook oder anderen sozialen Netzwerken für Neuigkeiten gibt. Wie viel Zeit könnte man sparen, wenn man diese Ablenkungen nicht direkt vor der Nase hätte – direkt neben den zu bearbeitenden Dokumenten oder Anwendungen! Dieser Beitrag zeigt, wie Sie zumindest den Umgang mit E-Mails etwas achtsamer gestalten oder diesen gleich auf bestimmte Uhrzeiten einschränken können.

Outlook ist auf meinem Desktop immer geöffnet. Kein Wunder: Ich rufe E-Mails damit ab, verwalte Kontakte damit und tracke die für meine Projekte aufgebrachte Arbeitszeit. Leider tracke ich damit nicht die Zeit, die für das Lesen von E-Mails oder für das Surfen im Internet draufgeht. Würde ich das mal vor Augen gehalten bekommen, wäre ich vielleicht ein wenig achtsamer bei diesem Thema.

Letztlich gibt es nur einen ganz kleinen Prozentsatz von E-Mails, die so wichtig sind, dass sie ganz schnell erledigt werden müssen. Und wer wirklich dringend etwas von einem möchte, der wird wahrscheinlich ohnehin zum Hörer greifen.

Und wenn wir ehrlich sind: Da immer mehr E-Mails, die wirklich nicht wichtig sind, mit der höchsten Priorität versendet werden, ist das rote Aufrufezeichen neben einer E-Mail auch nicht unbedingt Anlass für übertriebene Hektik (man munkelt, einige Benutzer hätten die höchste Priorität als Standard eingestellt und wüssten nicht, wie man diese Einstellung ändert …). Nun gibt es grob drei Typen von E-Mail-Konsumenten:

  • Der Ich-will-nichts-verpassen-Konsument: Er hat Outlook so eingestellt, dass automatisch alle 60 Sekunden neue E-Mails abgerufen werden und hechelt direkt beim Eingang des Signals für eine eingehende E-Mail zu Outlook.
  • Der Prokrastinierer: Er erwartet nicht wirklich wichtige E-Mails und lässt nicht automatisch abrufen. Dafür ruft er selbst immer E-Mails ab, wenn die eigentliche Arbeit zu langweilig, zu stressig oder zu anstrengend ist.
  • Der Gelegenheitskonsument: Er ist völlig entspannt und weiß, dass die Welt nicht untergeht, wenn er mal einen Tag keine E-Mails abruft. Er ruft E-Mails maximal ein bis zwei Mal pro Tag ab.

Gerade beim Prokrastinierer ist Achtsamkeit ein wichtiges Schlüsselwort: Letztlich weiß er, dass es lediglich Zeit kostet und die Erledigung der eigentlichen Aufgabe hinauszögert, wenn er E-Mails abruft. Dennoch macht er es. Das ist genau wie der Griff zur Zigarette, zur Süßigkeit oder zum Kaffee. Wie aber können wir dem Dauer-Mail-Checker helfen, von seinem Verhalten loszukommen Dazu gibt es zwei Ansätze, die ich in den letzten Tagen testweise einsetze:

  • Jedes Mal, wenn ich E-Mails abrufe und mindestens eine E-Mail heruntergeladen wird, trägt Outlook dies in den Kalender ein.
  • Jedes Mal, wenn ich auf Alle Ordner senden/empfangen klicke, erscheint eine Meldung, gegebenenfalls mit Countdown, die mich fragt, ob ich gerade wirklich E-Mails abrufen möchte.

E-Mail-Lese-Tracker

Die erste Variante liefert im Kalender beispielsweise eine Ansicht wie in Bild 1. Jeder grüne Eintrag entspricht einem erfolgreichen Abruf einer E-Mail.

Jeder grüne Eintrag entspricht einem erfolgreichen Mail-Abruf.

Bild 1: Jeder grüne Eintrag entspricht einem erfolgreichen Mail-Abruf.

Was soll dies bewirken Es zeigt dem Benutzer, wie oft er an diesem Tag tatsächlich E-Mails abgerufen hat. Diese Tage sind schon recht diszipliziert, teilweise wurde weniger als jede halbe Stunde auf die Taste zum Abrufen geklickt. Das könnte auch anders aussehen …

Spätestens, wenn der Benutzer die übrigen Einträge im Kalender nicht mehr lesen kann, wird er über seinen E-Mail-Konsum nachdenken. Und falls nicht, haben wir ja später noch eine weitere Möglichkeit, die Achtsamkeit zu erhöhen.

Schauen wir uns zunächst die technische Umsetzung dieser Lösung an.

Outlook-Mailabrufe in den Kalender eintragen

Dazu fügen wir dem Modul ThisOutlookSession des VBA-Projekts von Outlook einige Zeilen Code hinzu. Den VBA-Editor von Outlook öffnen Sie übrigens am schnellsten mit der Tastenkombination Alt + F11. Dort finden Sie dann auch das genannte Modul, in dem wir zunächst die folgenden drei Variablen deklarieren:

Dim WithEvents objOutlook As Outlook.Application
Dim WithEvents objPosteingang As Outlook.Folder
Dim WithEvents objPosteingangItems As Outlook.Items

Außerdem benötigen wir noch eine Variable, in der wir das Datum der letzten E-Mail-Abfrage speichern:

Dim datLastMail As Date

Danach legen wir die Ereignisprozedur Application_Startup an, was Sie durch die Auswahl des Eintrags Application im linken Kombinationsfeld des Codefensters und Auswahl des Eintrags Startup im rechten Kombinationsfeld erledigen können. Diese Prozedur füllt lediglich die drei zuvor deklarierten Objektvariablen mit den entsprechenden Objekten (s. Listing 1).

Public Sub Application_Startup()
     Set objOutlook = Application
     Set objPosteingang = objOutlook.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
     Set objPosteingangItems = objPosteingang.Items
End Sub

Listing 1: Diese Methode wird beim Start von Outlook ausgeführt.

objOutlook erhält einen Verweis auf das Application-Objekt der aktuellen Outlook-Instanz. objPosteingang nimmt einen Verweis auf den Outlook-Ordner Posteingang auf, den wir über den MAPI-Namespace und die Methode GetDefaultFolder mit dem Wert olFolderInbox als Parameter ermitteln. Schließlich erhält die Items-Variable objPosteingangItems einen Verweis auf die Items-Auflistung des in objPosteingang gespeicherten Ordners.

Für das Objekt objPosteingangItems legen wir eine Ereignisprozedur an, die durch das Ereignis ItemAdd ausgelöst wird. Um die leere Ereignisprozedur zu erstellen, wählen wir wieder zwei Einträge in den beiden Kombinationsfeldern des VBA-Editors aus – links den Eintrag objPosteingangItems und rechts ItemAdd. Diese Ereignisprozedur füllen wir wie in Listing 2.

Private Sub objPosteingangItems_ItemAdd(ByVal Item As Object)
     Dim objCalendar As Outlook.Folder
     Dim datLastMailTemp As Date
     Dim objAppointment As Outlook.AppointmentItem
     datLastMailTemp = DateSerial(Year(Now), Month(Now), Day(Now)) + TimeSerial(Hour(Now), Minute(Now), 0)
     If Not datLastMailTemp = datLastMail Then
         Set objCalendar = objOutlook.GetNamespace("MAPI").GetDefaultFolder(olFolderCalendar)
         Set objAppointment = objOutlook.CreateItem(olAppointmentItem)
         With objAppointment
             .Subject = "Mailabruf " & Format(Now, "hh:nn")
             .Start = Now
             .Duration = 30
             .Categories = "Mail abrufen"
             .ReminderSet = False
             .Save
             Debug.Print "Geschrieben " & .Subject
         End With
     End If
     datLastMail = datLastMailTemp
End Sub

Listing 2: Dieses Ereignis wird ausgelöst, wenn eine neue E-Mail in der Items-Liste landet.

Die Prozedur nimmt mit dem Parameter Item das neue Element des Ordners entgegen, in diesem Fall eine E-Mail. Die Prozedur definiert eine Variable namens obj-Calendar, welche den Kalender referenzieren soll und eine AppointmentItem-Variable für den neu anzulegenden Termin. Außerdem ermitteln wir mit der DateSerial-Funktion eine Zeitangabe, welche das aktuelle Datum und die aktuelle Uhrzeit ermittelt. Dabei soll als Anzahl der Sekunden der Wert 0 übergeben werden, damit pro Minute nur ein Mail-Abruf aufgezeichnet werden kann.

Nun folgt eine Prüfung, ob der in der modulweit deklarierten Variablen datLastMail gespeicherte Wert mit dem Wert aus datLastMailTemp übereinstimmt. Ist dies der Fall, dann wurde in dieser Minute bereits einmal eine E-Mail abgerufen – und mehr als einen Eintrag pro Minute wollen wir dem Kalender nicht zumuten.

Anderenfalls wird die Variable objCalendar mit dem Kalender-Ordner gefüllt, welchen wir über die Methode GetDefaultFolder des MAPI-Ordners mit dem Wert olFolderCalendar als Parameter referenzieren. objAppointment füllen wir mit der Methode CreateItem, der wir den Wert olAppointmentItem übergeben. So wird ein AppointmentItem-Element erstellt.

Danach stellt die Prozedur einige Werte für das neue AppointmentItem-Element ein. Der Betreff (Subject) soll den Text Mailabruf sowie die aktuelle Uhrzeit im Format hh:nn als Inhalt anzeigen. Die Eigenschaft Duration legt mit dem Wert 30 die Dauer des Elements in Minuten fest. Als Kategorie stellen wir Mail abrufen ein. Diese Kategorie müssen Sie noch als Kategorie mit dem Dialog Farbkategorien einrichten (s. Bild 2). Außerdem deaktivieren wir mit ReminderSet = False die Anzeige von Erinnerungen zu diesem Termin. Schließlich speichert die Save-Methode den Termin und sorgt so für dessen Anzeige in Outlook. Damit der Vergleich des Zeitpunkts des aktuellen Mailabrufs mit dem des vorherigen gelingt, müssen wir nun noch den Wert von datLastMailTemp in datLastMail eintragen.

Einstellen der Farbe für die Kategorie Mail abrufen

Bild 2: Einstellen der Farbe für die Kategorie Mail abrufen

Wie funktioniert es

Wenn Sie nun direkt eine Testmail an sich selbst verschicken, Mails abrufen und sich wundern, warum kein entsprechender Termin im Kalender eingetragen wird – keine Sorge: Es fehlt nur noch ein kleiner Schritt. Sie müssen nämlich dafür sorgen, dass die Ereignisprozedur Application_Startup ausgelöst wird. Diese füllt erst die Variablen mit den gewünschten Objekten und sorgt dann dafür, dass die Ereignisprozedur für die Variable objPosteingang-Items beim nächsten Eingang einer E-Mail ausgelöst wird. Dies können Sie in diesem Fall manuell erledigen, indem Sie die Einfügemarke innerhalb der Prozedur platzieren und die Taste F5 betätigen. Oder Sie starten Outlook einfach neu, um die Prozedur automatisch auszulösen.

Achtsamkeit beim Mailabruf

Damit kommen wir nun zur zweiten Lösung, die direkt beim Klick auf die Schaltfläche Alle Ordner senden/empfangen ausgelöst wird und eine passende Meldungsbox anzeigen soll. Die schlechte Nachricht ist: Es gibt keine Möglichkeit, den Mausklick auf diese Schaltfläche des Ribbons mithilfe einer VBA-basierten Lösung abzufangen. Stattdessen benötigen wir ein COM-Add-In auf Basis von Visual Studio. Zum Glück gibt es Visual Studio 2015 in der Community-Edition kostenlos für einzelne Entwickler und kleinere Betriebe, sodass keine zusätzlichen Kosten für diese sehr interessante Programmierung einer Erweiterung von Outlook anfallen. Sie müssen sich lediglich Visual Studio 2015 Community herunterladen und dieses installieren. Außerdem benötigen Sie alle aktuellen Erweiterungen, die dann auch die für die Programmierung von COM-Add-Ins für die Office-Anwendungen benötigten Vorlagen mitliefern.

Projekt anlegen

Nach dem Starten von Visual Studio legen Sie ein neues Projekt des Typs Visual Basic|Office/SharePoint|VSTO-Add-Ins|Outlook 2013 und 2016 VSTO-Add-In an. Legen Sie als Name OutlookAddIn fest (s. Bild 3).

Anlegen eines neuen Projekts auf Basis der Outlook-Vorlage

Bild 3: Anlegen eines neuen Projekts auf Basis der Outlook-Vorlage

Visual Studio zeigt nun ein Modul mit den zwei Ereignismethoden ThisAddIn_Startup() und ThisAddIn_Shutdown() an. Diese beiden benötigen wir nicht. Wir wollen eine Ribbon-Definition hinzufügen, mit der wir die eigentliche Funktion der Schaltfläche Alle Ordner senden/empfangen unterbinden und eine eigene Funktion ausführen.

Dazu fügen wir dem Projekt zunächst ein Ribbon hinzu. Klicken Sie dazu im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen OutlookAddIn und wählen Sie den Eintrag Hinzufügen|Neues Element. Es erscheint der Dialog Neues Element hinzufügen. Hier wählen Sie den Eintrag Menüband (Visueller Designer) aus und geben den Namen Outlook_Ribbon ein (s. Bild 4).

Hinzufügen eines Ribbons

Bild 4: Hinzufügen eines Ribbons

Es erscheint der Designer für den Ribbon-Entwurf, der jeden Access-Entwickler, der sich bisher mit dem Ribbon herumschlagen durfte, neidisch werden lässt. Unser Ziel ist es nun, wie es auch unter Access möglich ist, ein Command-Element per Ribbon-Definition hinzuzufügen, das die Schaltfläche Alle Ordner senden/empfangen referenziert und für diese Schaltfläche eine neue Funktion hinterlegt. Dummerweise liefert die Toolbox aber überhaupt kein Element namens Command.

XML-Definition erstellen

Können wir also von einem VSTO-Add-In gar keine eingebauten Schaltflächen mit neuen Funktionen versehen Doch, wir sind nur etwas in die falsche Richtung gelaufen. Wir können nämlich durchaus auch mit einer klassischen XML-Definition für das Ribbon arbeiten. Dazu fügen wir einfach ein neues Objekt mit der Bezeichnung Menüband (XML) zum Projekt hinzu (wie weiter oben – rechter Mausklick auf das Projekt-Element im Projektmappen-Explorer, dann den Eintrag Hinzufügen|Neues Element… auswählen und im nun erscheinenden Dialog Menüband (XML) wählen).

Legen Sie den Namen Ribbon_Outlook.vb für das neue Element fest.

Dies legt zwei neue Objekte im Projekt an: die Datei Ribbon_Outlook.xml mit der Ribbon-Definition und die Datei Ribbon_Outlook.vb mit den Funktionen, um das Ribbon zur Laufzeit anzuzeigen. Die Datei Ribbon_Outlook.xml ist bereits mit einer einfachen Ribbon-Definition ausgestattet, die ein neues Tab mit einer Gruppe und einer Schaltfläche hinzufügt:

<xml version="1.0" encoding="UTF-8">
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
   <ribbon>
     <tabs>
       <tab idMso="TabAddIns">
         <group id="MyGroup"
                label="My Group">
         </group>
       </tab>
     </tabs>
   </ribbon>
</customUI>

Wenn Sie nun einfach das Add-In mit F5 zum Testen starten und sich wundern, dass das Ribbon keine änderung aufweist, sind Sie genauso voreilig wie ich.

Die Ribbon_Outlook.vb-Klasse enthält zwar fast alles, was zum Anzeigen des Ribbons benötigt wird, allerdings fehlt noch das Bindeglied.

Dabei handelt es sich um die folgende Methode, die Sie noch zur Klasse ThisAddIn.vb hinzufügen müssen (diese Methode ist in den Kommentarzeilen von Ribbon_Outlook.vb enthalten):

Protected Overrides Function CreateRibbonExtensibilityObject() As Microsoft.Office.Core.IRibbonExtensibility
     Return New Ribbon_Outlook()
End Function

Direkt danach können Sie noch einen Test ausführen. Auch dies führt nicht zum Erfolg, denn für das Tab ist das eingebaute Element mit der idMso namens TabAddIns festgelegt.

Das heißt, dass die darunter definierten Elemente unterhalb eines eingebauten Tab-Elements namens TabAddIns angelegt werden. Outlook besitzt aber kein solches Tab, also geschieht nichts. Also ändern wir für einen Test die XML-Definition des Tab-Elements in der Datei Ribbon_Outlook.xml wie folgt:

<tab id="test" label="Bla">
   <group id="MyGroup" label="My Group">
     <button id="btnx" label="bla"/>
   </group>
</tab>

Das Ribbon erscheint nun wie in Bild 5. Nun wollen wir allerdings nicht, dass eine zusätzliche Schaltfläche erscheint, sondern wir möchten die Schaltfläche Alle Ordner senden/empfangen mit einer neuen Funktion versehen.

Neues Tab mit Gruppe und Schaltfläche

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar