Last Update: 2024 - 05 - 21 |
Wie du Outlook Emails mit Follow-Up und Erinnerung mit VBA versendestby Philipp Stiefel, ursprünglich veröffentlicht 10.Juni 2017 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 EmailsEs 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. 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. 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 sendenBisher 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. 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 erstellenWir 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. FazitFollow-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 BeispielcodeUm 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.
Ich werde Deine Email-Addresse niemals weitergeben. Du kannst den Newsletter jederzeit abbestellen. © 1999 - 2024 by Philipp Stiefel - Datenschutzerklärung |