Language: Deutsch English















Last Update: 2017 - 06 - 10





Wie du Outlook Emails mit Follow-Up und Erinnerung mit VBA versendest

by Philipp Stiefel, ursprünglich veröffentlicht 10.Juni 2017


Abgehakte Email-Briefumschläge, article header image

Diese Woche erhielt ich eine interessante Anfrage von einem Leser des Access & Email Bereichs meiner Webseite. Er fragte, ob es möglich ist mit VBA aus Access eine Email kombiniert mit einer Erinnerung für den Empfänger zu versenden.

Dies ist eine sehr interessante Idee. Ich verwende Outlook sehr intensiv, um meine Aufgaben zu organisieren und ich markiere häufig Emails als Todo indem ich die Email mit einem Flag markiere, damit ich sie rechtzeitig bearbeite, wenn das erforderlich ist.

Eine vordefinierte Erinnerung, die bereits vom Absender der Email gesetzt wurde, wäre in der Tat hilfreich, um keine wichtige Email-Aufgabe zu übersehen. - Andererseits wäre ich aber ernsthaft verstimmt, wenn mir eine Person, die ich kaum kenne eine Email mit kombinierter Erinnerung zusenden würde.

Offensichtlich ist dies ein interessantes Thema für mich und daher habe ich etwas Zeit investiert, um eine mögliche Lösung für die Problemstellung zu finden.

Die allgemeine Funktionalität von Flags und Erinnerungen für Emails

Es ist einfach manuell eine Erinnerung für eine zu sendende Email in Outlook zu definieren. Sowohl für dich selbst als Absender, als auch für den Empfänger der Email.  Dazu einfach den Add Reminder-Eintrag aus dem Follow-Up-Dropdown des Ribbon im Email-Detail-Fenster anklicken.

Follow-Up manuell für Outlook Email einstellen

Wenn du diesen Screenshot genau betrachtest, sollte klar werden, dass es möglich ist, das Follow-Up-Kennzeichen mit oder ohne Erinnerung zu setzen. Die Erinnerung ist also etwas anderes als der reine Follow-Up-Flag.

Anmerkung: Ich bezeichne dieses Kennzeichen als Follow-Up-Flag, was genau genommen nicht korrekt ist. Grundsätzlich ist es nur ein allgemeines Kennzeichen und kann auch verschiedene andere Werte als „Follow up“ haben. Zum Beispiel “Review”, “Do not forward”, “Reply” “For your information” und einige weitere. Ich habe aber bisher kaum ein anderes Kennzeichen als “Follow Up” tatsächlich in einer Email gesehen, daher werde ich weiterhin den Begriff „Follow-Up-Flag“ verwenden.

Wie leider viel zu häufig, mangelt es in der Outlook Dokumentation an konkreten Informationen darüber, wann und wie genau diese Optionen funktionieren.

Der Follow-Up-Flag wird zu einem X-Message-Flag Email-Header übersetzt. Der Wert dieses Header ist die Art des Kennzeichens, wie eben „Follow up“ oder „Review“. Email-Header, die mit einem X- beginnen, sind Anwendungsspezifische Header und es ist dem jeweiligen Email-Client überlassen, ob und wie er auf einen solchen Header reagiert. Das optionale, zusätzliche Erinnerungsdatum wird in einem Reply-By Email-Header übermittelt, der in Absatz 2.1.51 des RFS 4021 erwähnt wird. Microsoft Email Anwendungen interpretieren das Reply-By als eine Zusatzinformation zu dem  X-Message-Flag-Header.

Mit diesen Information im Email-Header kann man zuversichtlich annehmen, dass diese Daten auch beim Empfänger der Email ankommen. Allerdings wird der Empfänger selbst rein gar nichts davon sehen, wenn sein Email-Client diese Informationen nicht darstellt. Dies ist eine Schwäche dieses ganzen Konzepts.

Meine eigenen Tests weisen darauf hin, dass die Follow-Up-Flags von allen Microsoft-Email-Clients, wie Microsoft Outlook, Mail auf Windows 8 und 10, und sogar von der Outlook Webanwendung unterstützt werden. Allerdings zeigen nicht alle auch das Erinnerungsdatum zu dem Follow-Up an. Bei Email-Clients von Drittanbietern kannst du dich nicht darauf verlassen, dass diese Email-Kennzeichnen unterstützt werden und dass der Empfänger dein Follow-Up-Flag überhaupt zu Gesicht bekommt.

Nur Microsoft Outlook ist in der Lage ein Erinnerungs-PopUp-Fenster zu dem definierten Erinnerungszeitpunkt aus der Email anzuzeigen. Aber Outlook tut das nur dann automatisch, wenn dein Email-Konto auf einen Exchange Server liegt und die Email auf diesem Exchange Server sowohl gesendet als auch empfangen wurde. Wenn eine Email über das externe Netzwerk übermittelt wurde, wird zwar das Follow-Up-Datum in der Detailansicht der Email angezeigt, aber es wird keine automatische Erinnerung für diese Email erstellt.

Flagged Emails im Outlook Posteingang

Unsere Erkenntnisse bisher sind also: Follow-Up-Flags können in relativ vielen Szenarien und Empfänger verwendet werden, aber Erinnerungen werden nur übermittelt bzw. erstellt, wenn du die Email über einen Exchange Server an einem Empfänger auf dem gleichen Server sendest.

Die Follow-Up-Aufgabe und Erinnerung für dich selbst sind natürlich völlig unabhängig vom Empfänger und funktionieren immer so, wie du das von Outlook gewohnt bist.

Eine Email mit Follow-Up-Flag und Erinnerung mit VBA senden

Bisher haben wir festgestellt, wie und wann diese Einstellungen funktionieren, wenn wir Emails manuell senden. Aber die Essenz meiner Artikel über Access/VBA und Email ist ja Emails automatisiert aus einer VBA-Fähigen Anwendung zu senden, ohne dass weitere manuelle Schritte in der Email-Anwendung erforderlich sind. Folglich müssen wir einen Weg finden, um diese Erinnerungen per VBA-Code zu erstellen.

Einige Eigenschaften des Outlook.MailItem-Objektes springen mir direkt ins Auge wenn ich mir die MailItem-Klasse im VBA-Object-Browser anschaue. Die vielversprechendsten sind eine Reihe von Eigenschaften, die mit dem Begriff Flag… beginnen.

Outlook.MailItem Flag-Eigenschaften im VBA Object Browser

Beachte, dass alle Flag-Eigenschaften, außer FlagRequest leicht ausgegraut sind. Dies sind versteckte Eigenschaften und du wirst sie im Object Browser nicht sehen, wenn du nicht die Option Show Hidden Members aus dem Kontextmenü aktivierst.

Diese ausgegrauten Eigenschaften werden in der aktuellen Outlook-VBA-Dokumentation nicht mehr erwähnt und die Dokumentation der korrespondierenden Microsoft.Office.Interop.Outlook Bibliothek für das .Net-Framework merkt dazu an: „Dieses Objekt, Eigenschaft oder Aufzählung ist veraltet (deprecated) und nicht dafür gedacht in deinem Code verwendet zu werden.“

Trotz gründlicher Recherche konnte ich aber keine anderen Eigenschaften oder Methoden finden, die als Ersatz fungieren könnten. Glücklicherweise funktioniert die die FlagDueBy-Eigenschaft im Moment weiterhin.

Obwohl es nicht empfohlen ist, bleibt uns hier keine andere Wahl, als dennoch diese veraltete Eigenschaft zu verwenden. Aber sei dir bewusst, dass diese Eigenschaft in einer zukünftigen Version von Microsoft Outlook nicht mehr vorhanden sein könnte.

Hier ist ein kleines Beispiel, wie man eine Email, mit Follow-Up-Flag und Erinnerung (2 Tage in der Zukunft) für den Empfänger der Email, in VBA erstellen kann.

Public Sub sendMailWithFollowUpReminder() Dim myMail As Outlook.MailItem Dim myOutlApp As Outlook.Application Set myOutlApp = New Outlook.Application Set myMail = myOutlApp.CreateItem(olMailItem) With myMail .To = "'someone@somewhere.invalid'" .Subject = "Here is an email with Flag and Reminder sent by Outlook-Automation" .Body = "Pay attention to the Follow-Up flag and the due date in the info bar." ' We set the Follow up Flag .FlagRequest = "Follow up" ' We set the due date for the reminder two days from today .FlagDueBy = DateAdd("d", 2, Date) .Send End With Set myMail = Nothing Set myOutlApp = Nothing End Sub

Bevor du fragst: Die FlagStatus Eigenschaft hat keine Auswirkung auf die ausgehende Email und die FlagIcon Eigenschaft hat überhaupt keine Auswirkungen mehr. Sie wurde durch Outlook’s Kategorie-System ersetzt, das verwendet werden kann, um Email farblich zu markieren.

Aufgaben und Erinnerungen für gesendete Email mit VBA erstellen

Wir wissen nun, wie wir eine Erinnerung für den Empfänger der Email mit VBA erstellen können. Den Empfänger an seine Aufgabe zu erinnern ist gut, aber was ist mit der Gegenseite der Kommunikation? Wenn der Absender letztendlich dafür verantwortlich ist, dass eine Aufgabe pünktlich erfüllt wird, würde es ja Sinn machen, auch für ihn eine Erinnerung zu erstellen.

Es fällt mir immer noch schwer das zu glauben, aber es scheint tatsächlich so, als gäbe es keinen einfachen Weg, um mit VBA eine Aufgabe und Erinnerung zu erstellen. Alle Eigenschaften des MailItem-Objektes, die für Aufgaben und Erinnerung relevant sind, können entweder in einer ausgehenden Email gar nicht gesetzt werden, oder sie haben keine Auswirkung auf die Kopie der Email, die in den Gesendeten Objekten des Absenders gespeichert werden.

Der Workaround, den ich hier gleich zeigen werde, funktioniert zwar gut, aber er erscheint mir eigentlich zu kompliziert für eine vergleichsweise einfache Anforderung.

Ich habe ein Klassenmodul mit nur einen öffentlichen Methode erstellt um ein beliebiges Outlook.MailItem dafür vorzumerken, dass es nach dem Senden eine Erinnerung zugewiesen bekommt. Diese Methode ermittelt den Gesendete-Objekte-Ordner aus dem MailItem und behandelt dessen ItemAdd-Event. Dieses Ereignis wird ausgelöst, wenn ein neues Item (eine Email) in dem Outlook Ordner gespeichert wird.

Der Code für die Ereignisbehandlung erfordert es, dass du einen Verweis auf die Outlook Objektbibliothek in deinem VBA-Projekt setzt. Ereignisbehandlung funktioniert nicht mit Late Binding.  (Wenn du noch nicht mit Konzept der Ereignisse und Ereignisbehandlung vertraut bist, magst du vielleicht meine Einführung in die Ereignisbehandlung in Access lesen.)

Dieser Workaround mit der Ereignisprozedur ist erforderlich, weil wir die Aufgaben und die Erinnerung erst hinzufügen können, nachdem die Email endgültig gesendet wurde. Um das zu erreichen, verwenden wir die MarkAsTask-Methode des MailItems und dessen ReminderSet- /ReminderTime-Eigenschaften. - Anders als die Flag-Eigenschaften sind diese nicht als veraltet markiert und sollten daher für die lokalen Emails bevorzugt verwendet werden.

Wir fügen den zu sendenden Emails, für die Aufgaben/Erinnerungen erstellt werden sollen, eine UserProperty hinzu, damit wir sie in der Ereignisprozedur von anderen Emails, die evtl. im gleichen Zeitraum gesendet werden, unterscheiden können.

Ich habe diese Klasse FollowupHandler genannt. Hier ist sie:

Option Compare Database Option Explicit Private Const USERPROP_FOLLOWUP_DATE As String = "AddFollowUpDate" Private WithEvents m_SentItems As Outlook.Items Public Sub RegisterMailForFollowup(ByRef mail As Outlook.MailItem, ByVal FollowUpDate As Date) If m_SentItems Is Nothing Then Set m_SentItems = mail.SaveSentMessageFolder.Items End If mail.UserProperties.Add USERPROP_FOLLOWUP_DATE, olDateTime, False mail.UserProperties(USERPROP_FOLLOWUP_DATE).Value = FollowUpDate End Sub Private Sub m_SentItems_ItemAdd(ByVal Item As Object) Dim up As UserProperty With Item Set up = .UserProperties.Find(USERPROP_FOLLOWUP_DATE) If Not up Is Nothing Then .MarkAsTask olMarkNoDate .TaskDueDate = up.Value .ReminderSet = True .ReminderTime = up.Value .Save End If End With End Sub Private Sub Class_Terminate() Set m_SentItems = Nothing End Sub

Wir brauchen noch eine kleine Hilfsmethode, um einfach auf eine globale Instanz der Klasse zugreifen zu können. Die Property-Prozedur EmailFollowupHandler solltest du in ein allgemeines Modul kopieren, damit die lokale Variable m_EmailFollowupHandler unabhängig von einen evtl. verwendeten Access Formular ist.

Option Compare Database Option Explicit Private m_EmailFollowupHandler As FollowupHandler Public Property Get EmailFollowupHandler() As FollowupHandler If m_EmailFollowupHandler Is Nothing Then Set m_EmailFollowupHandler = New FollowupHandler End If Set EmailFollowupHandler = m_EmailFollowupHandler End Property

Die ganze Zauberei funktioniert nur, wenn die Instanz des FollowUpHandler in der privaten Variable m_EmailFollowupHandler gesetzt ist. Wenn dein VBA-Project durch einen Laufzeitfehler oder durch manuelles Anhalten zurückgesetzt wird, werden die ausgehenden Emails beim Versenden nicht mehr als Aufgaben markiert.

Nun, nachdem wir den obigen Code in unserem VBA-Projekt haben, brauchen wir nur eine einzige Zeile Code in der Prozedur ergänzen, die die Emails erstellt und versendet.

Public Sub sendMailWithFollowUpReminder()
Dim myMail As Outlook.MailItem Dim myOutlApp As Outlook.Application Set myOutlApp = New Outlook.Application Set myMail = myOutlApp.CreateItem(olMailItem) With myMail .To = "'someone@somewhere.invalid'" .Subject = "Here is an email with Flag and Reminder sent by Outlook-Automation" .Body = "Pay attention to the Follow-Up flag and the due date in the info bar." ' We set the Follow up Flag .FlagRequest = "Follow up" ' We set the due date for the reminder two days from today .FlagDueBy = DateAdd("d", 2, Date)
EmailFollowupHandler.RegisterMailForFollowup myMail, DateAdd("d", 2, Date)
.Send End With Set myMail = Nothing Set myOutlApp = Nothing
End Sub

Also, wenn du bereits Outlook Automation verwendest, um Emails aus deiner Anwendung zu senden, kannst du die bestehende Funktionalität einfach um die Funktionalität der Aufgaben und Erinnerungen erweitern, wenn du das Klassenmodul und die Hilfsprozedur in dein Projekt kopierst, und dann nur eine einzige Zeile Code in die bestehende Prozedur zur Emailerstellung ergänzt.

Fazit

Follow-Ups und Erinnerungen für den Absender und den Empfänger einer Email können eine sinnvolle Verbesserung des Workflows mit automatisch erstellten Emails sein. Der Code in diesem Artikel zeigt, wie du dies in deiner Anwendung mit VBA-Code umsetzen kannst.

Bedenke aber immer, dass der Empfänger einer Email das definierte Follow-Up-Flag evtl. nicht sehen kann, wenn sein Email-Client dies nicht unterstützt. Außerdem könnte der Empfänger irritiert sein, wenn er dies nicht erwartet hat.

Download Beispielcode

Um es dir noch einfach zu machen, diese Funktionalität selbst auszuprobieren, habe ich eine Beispieldatenbank mit dem Email-Follow-Up-Code aus diesem Artikel zum Download bereitgestellt.

Share this article: Share on Facebook Tweet Share on LinkedIn Share on XING

Abonniere meinen Newsletter

*

Ich werde Deine Email-Addresse niemals weitergeben. Du kannst den Newsletter jederzeit abbestellen.



© 1999 - 2017 by Philipp Stiefel