Das Speichern von Anhängen in E-Mails gelingt in Outlook recht einfach: Man öffnet die E-Mail, klickt mit der rechten Maustaste auf den Anhang und wählt aus dem Kontextmenü den Eintrag “Speichern unter” aus. Danach allerdings fragt Outlook den Speicherort für den Anhang ab und hier startet man immer im gleichen Verzeichnis – in der Regel das Dokumente-Verzeichnis des aktuellen Benutzers. Dieser Artikel zeigt, wie wir dieses Verzeichnis auf ein anderes Verzeichnis einstellen können, aber das reicht in vielen Fällen nicht aus: Rechnungen sollen in ein bestimmtes Verzeichnis gespeichert werden, Anfragen von Kunden in einem bestimmten Verzeichnis für den jeweiligen Kunden et cetera. Diese Aufgaben werden wir mit einem Tool vereinfachen, das gleich im Kontextmenü die Möglichkeit zum Speichern in verschiedenen Verzeichnissen bietet. Und noch mehr: Wir wollen das Tool so programmieren, dass der Benutzer selbst eintragen kann, welche Kontextmenü-Einträge zum Speichern in verschiedenen Verzeichnissen genutzt werden können.
Ausgangssituation: Viel Arbeit mit dem Dateidialog
Standardmäßig bietet Outlook zwei Aufrufmöglichkeiten zum Speichern von Anhängen an:
- beim Rechtsklick auf einen der Anhänge in der Mail (siehe Bild 1) oder
- beim Markieren des Anhangs im Ribbon (siehe Bild 2).
Bild 1: Kontextmenü-Einträge zum Speichern von Anhängen
Bild 2: Ribbon-Einträge zum Speichern von Anhängen
Beim Anklicken dieser Einträge erscheint ein Anlage speichern-Dialog zur Auswahl des Speicherortes, der standardmäßig das Dokumente-Verzeichnis des aktuellen Benutzers anzeigt. Für viele Anwendungen wäre es schon ein Gewinn, wenn sich dieser Dialog das zuletzt verwendete Verzeichnis merken würde, aber das ist nicht der Fall. Für eine einfache Lösung schauen wir uns daher im ersten Schritt an, wie man dieses Verzeichnis dauerhaft umstellen kann.
Zielverzeichnis per Registry einstellen
Dazu öffnen wir die Registry von Windows (in der Window-Suche RegEdit eingeben) und navigieren dort zu dem folgenden Eintrag:
Computer\HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Options
Hier legen wir einen neuen Eintrag mit dem Typ Zeichenfolge und dem Namen DefaultPath an und tragen für diesen das gewünschte Verzeichnis ein (siehe Bild 3).
Bild 3: Neues Standardverzeichnis zum Speichern von Attachments
Nach dem nächsten Neustart bietet Outlook beim Speichern von Attachments den dort hinterlegten Ordner an.
Attachments komfortabel speichern per COM-Add-In
In einem weiteren Artikel namens Kontextmenüs in Outlook anpassen (www.vbentwickler.de/369) haben wir bereits beschrieben, wie wir die Kontextmenüs von Outlook anpassen können.
Ein weiterer Artikel mit dem Titel Outlook: Ribbon per COM-Add-In anpassen (www.vbentwickler.de/376) zeigt, wie wir das Ribbon nach unseren Bedürfnissen gestalten können.
Die dort vorgestellten Techniken verwenden wir als Grundlage für die nachfolgend vorgestellte Lösung. Im ersten genannten Beitrag haben wir bereits herausgefunden, dass es in der Attachments-Auflistung für Outlook-E-Mails nicht nur die Attachments gibt, die offensichtlich als Datei an die E-Mail angehängt wurden, sondern auch solche Dateien berücksichtigt werden, die in die E-Mail eingebettet wurden – beispielsweise als Bilder. Die dort vorgestellten Funktionen HasAttachedFiles und IsFileAttached verwenden wir auch in diesem Artikel.
Wie wollen wir die Funktionen zum Speichern von Attachments genau gestalten? Das hängt von den Anforderungen ab. Für den einen reicht es, wenn wir einen eigenen Menüpunkt zum Speichern von Rechnungen in einem speziellen Verzeichnis hinzufügen, damit diese von der Buchhaltung weiterverarbeitet werden können.
Der andere hat fünf feste Kunden, für die er immer wieder neue Anwendungen oder Erweiterungen programmiert und hat für jeden dieser Kunden ein Verzeichnis, in dem die von den Kunden geschickten Dokumente mit Anforderungen oder anderen Informationen gespeichert werden können.
Beide Anforderungen könnte man fest in ein COM-Add-In programmieren. Früher oder später wird sich jedoch irgendein Parameter ändern – beispielsweise, weil man den Rechner neu aufsetzt und sich dadurch die Verzeichnisstruktur ändert oder weil ein fester Kunde wegfällt und ein anderer hinzukommt.
Wir sind also gut beraten, wenn wir die zu programmierende Funktion so weit wie möglich flexibel gestalten. Wie können wir das machen? Eine Idee wäre, eine Text- oder XML-Datei zu diesem Zweck zu hinterlegen, welche die benötigten Informationen enthält. Welche Informationen werden das genau sein?
- Kontextmenü-Einträge
- Verzeichnisse, in welche die Attachments beim Betätigen der Kontextmenü-Einträge gespeichert werden
Grundsätzlich wollen wir die Idee aufgreifen, wie im Artikel Kontextmenüs in Outlook anpassen (www.vbentwickler.de/369) ein dynamicMenu-Element zum Kontextmenü hinzuzufügen. Dieses können wir ebenfalls an der entsprechenden Stelle zum Ribbon hinzufügen.
Der Clou dabei wäre, dass wir dann direkt das menu-Element mit den Untermenüpunkten in eine Textdatei schreiben könnten, die beim Aufrufen des dynamischen Untermenüs eingelesen und verarbeitet wird. Und die Verzeichnisse schreiben wir einfach in das tab-Attribut der jeweiligen Elemente. Damit haben wir schon einmal diesen Teil abgedeckt.
Verschiedene Kontextmenüs
Die üblichen Befehle zum Speichern der Attachments einer E-Mail befinden sich im Kontextmenü des mit der rechten Maustaste angeklickten Attachments.
Hier finden wir zwei Einträge, die sich wie folgt verhalten
- Speichern unter: Zeigt den Anlage speichern-Dialog für diese Datei an.
- Alle Anlagen speichern: Öffnet den Dialog aus Bild 4, der alle enthaltenen Anlagen zum Auswählen anzeigt. Nach einem Klick auf OK kann man noch das Zielverzeichnis auswählen, in das dann alle Anlagen gespeichert werden.
Bild 4: Dialog zur Auswahl, welche Attachments gespeichert werden sollen
Die gleichen Befehle finden wir in dem Ribbon-Tab, der beim Aktivieren eines der Attachments aktiviert wird.
Genau in diesen Bereich würden wir unser Untermenü zum gezielten Speichern ebenfalls unterbringen.
Außerdem wollen wir diesen Eintrag auch direkt im Ribbon-Tab namens Start anbieten und in dem Kontextmenü, das beim Rechtsklick auf eine E-Mail in der Liste der E-Mails erscheint.
Strategie zum Speichern
Bevor wir diese Einträge anlegen, benötigen wir jedoch noch eine Strategie für die Schritte, die nach dem Anklicken eines der Zielverzeichnis im Menü auszuführen sind.
Die erste Frage ist: Wollen wir dem Benutzer die Möglichkeit geben, den Dateinamen anzupassen? Das würde bedeuten, dass wir einen Datei speichern-Dialog anzeigen, der das über den Kontextmenü-Eintrag gewählte Verzeichnis als Standardverzeichnis anzeigt und den Dateinamen des Attachments.
Dieser kann dann ebenso noch angepasst werden wie das Verzeichnis. Letztlich liefert diese Vorgehensweise maximale Flexibilität und erfordert nur einen zusätzlichen Mausklick auf die Speichern-Schaltfläche, wenn keine Änderungen an den Dateinamen durchgeführt werden sollen.
Diese Strategie funktioniert super, wenn der Benutzer nur ein Attachment speichern möchte, beziehungsweise wenn er alle speichern will, aber ohnehin nur ein Attachment vorhanden ist.
Was aber, wenn die E-Mail mehr als ein Attachment enthält und der Benutzer wählt den Befehl zum Speichern der Attachments für die aktuell markierte E-Mail aus? Dann lassen wir ihn nur das Zielverzeichnis für diesen Kontextmenü-Eintrag bestätigen.
Für den Fall, dass eine Datei gleichen Namens bereits vorhanden ist, können wir immer noch einmal den Datei speichern-Dialog mit dem konkreten Dateinamen anzeigen, damit der Benutzer wählen kann, ob die vorhandene Datei überschrieben werden soll.
Namen der Kontextmenüs ermitteln
Nun schreiten wir zur Tat und ermitteln erst einmal die Namen der Kontextmenüs, die wir mit den zusätzlichen Befehlen ausstatten wollen. Dazu verwenden wir die im Artikel Kontextmenüs in Outlook anpassen (www.vbentwickler.de/369) vorgeschlagene Strategie, einfach jedem Kontextmenü ein button-Element mit dem idMso-Namen des jeweiligen Kontextmenüs hinzuzufügen. Darüber finden wir hieraus, dass die idMso für das Kontexmenü einer E-Mail im Outlook Explorer ContextMenuMailItem lautet. Die idMso für das Attachment einer im Inspektor für E-Mails angezeigten E-Mail lautet ContextMenuAttachments.
Namen der Ribbon-Elemente ermitteln
Die Namen der Ribbon-Tabs und -Groups, denen wir die Befehle hinzufügen wollen, ermitteln wir über die Excel-Tabelle outlookexplorercontrols.xlsm. Hier finden wir schnell den Bereich mit dem Tab namens TabAttachments. Gleichen wir die dortigen Elemente mit dem Ribbon-Tab ab, finden wir allerdings schnell heraus, dass die Excel-Datei nicht mehr auf dem aktuellen Stand ist – zumindest nicht für Outlook 2016.
Also gehen wir einen alternativen Weg. Wir öffnen die Outlook-Optionen über den Befehl Datei|Optionen und wechseln dort zum Bereich Menüband anpassen. Hier stellen wir rechts oben den Eintrag Alle Registerkarten ein und suchen dann nach dem Eintrag Anlagen|Auf dem Computer speichern (siehe Bild 5). Diesen markieren wir, klicken auf die Schaltfläche Umbenennen und ändern den Namen, beispielsweise durch Anfügen der Zahl 1. Wichtig ist nur, dass wir diesen ändern.
Bild 5: Ermitteln von Elementnamen, Teil 1
Wo wir schon gerade hier sind, klappen wir auch gleich noch den Eintrag auf und fahren nacheinander mit der Maus über die Befehle Speichern unter und Alle Anlagen speichern. Outlook blendet per Tooltip-Text die Beschreibung des Befehls ein, die mit der in Klammern eingefassten idMso abgeschlossen wird (siehe Bild 6). Die Schaltfläche Speichern unter heißt SaveAttachAs und die Schaltfläche Alle Anlagen speichern heißt SaveAttachments.
Bild 6: Ermitteln von Elementnamen, Teil 2
Wozu müssen wir die Namen der button-Elemente kennen? Diese brauchen wir nicht unbedingt. Es hängt davon ab, ob wir eine eigene Gruppe für unser dynamicMenu-Element erstellen wollen. Ist das der Fall, können wir diese einfach neu erstellen.
Wenn wir unseren Befehl jedoch in der Gruppe Auf dem Computer speichern unterbringen wollen, können wir das nur über einen Umweg erledigen. Wir müssen die eingebaute Gruppe ausblenden und diese nachbauen.
Zunächt brauchen wir jedoch noch den Namen des nachzubauenden group-Elements. Dieses erhalten wir nun, wenn wir im Optionen-Dialog den Befehl Importieren/Exportieren|Alle Anpassungen exportieren auswählen. Dies speichert eine XML-Datei mit allen Änderungen an der Standardkonfiguration im angegebenen Ordner. Den entscheidenden Teil für unser Vorhaben haben wir in Bild 7 durch einen Rahmen markiert.
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Visual Basic Entwickler:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: