{"id":55000308,"date":"2022-08-01T00:00:00","date_gmt":"2023-03-02T17:06:24","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=308"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Outlook_EMails_nach_Eingang_verarbeiten","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Outlook_EMails_nach_Eingang_verarbeiten\/","title":{"rendered":"Outlook: E-Mails nach Eingang verarbeiten"},"content":{"rendered":"<p><b>Die verschiedenen Klassen von Outlook bieten eine ganze Reihe von Ereignissen an. Diese werden durch unterschiedliche Aktionen ausgel&ouml;st. Eine dieser Aktionen ist das Eintreffen einer oder mehrerer neuer E-Mails. Dieses Ereignis mit einer geeigneten Ereignisprozedur abzufangen ist ein sinnvolles Beispiel f&uuml;r die Beschreibung der Programmierung von Ereignissen unter Outlook. Mit E-Mails kann man nach dem Eingang eine Menge anstellen &#8211; diese l&ouml;schen, in einen anderen Ordner verschieben, die Message-Datei im Dateisystem sichern oder auch die Inhalte auslesen, um diese etwa in eine Datenbank zu schreiben. In diesem Artikel erl&auml;utern wir erst einmal allgemein, wie wir &uuml;berhaupt mit VBA-Code auf den Eingang einer E-Mail reagieren k&ouml;nnen.<\/b><\/p>\n<p>Outlook bietet alles, was man braucht &#8211; E-Mails werden abgerufen und landen im Posteingangs-Ordner. Man kann verschiedene Regeln aufstellen, nach denen die eingehenden E-Mails automatisch nach den gew&uuml;nschten Kriterien in verschiedene Ordner verschoben werden, und wenn es auch der Ordner <b>Gel&ouml;schte Objekte <\/b>oder der Spam-Ordner ist. Und nat&uuml;rlich k&ouml;nnen wir die E-Mails auch manuell in andere Ordner verschieben oder auch Aufgaben auf Basis einer E-Mail erstellen. Noch sch&ouml;ner w&auml;re es allerdings, wenn wir die gew&uuml;nschten Schritte individuell programmieren k&ouml;nnten.<\/p>\n<h2>Welches Objekt und welches Ereignis?<\/h2>\n<p>Dazu m&uuml;ssen wir erst einmal wissen, wie wir eine Ereignisprozedur programmieren, mit der wir auf den Eingang einer E-Mail reagieren k&ouml;nnen. Der erste Schritt ist dabei, herauszufinden, welches Ereignis welcher Klasse wir &uuml;berhaupt nutzen k&ouml;nnen. In weiteren Artikeln zur Programmierung von Outlook per VBA haben wir bereits gesehen, dass es unterschiedliche Klassen gibt, mit denen wir die verschiedenen Elemente der Benutzeroberfl&auml;che referenzieren k&ouml;nnen. Mit dem <b>Application<\/b>-Objekt greifen wir auf die Anwendung selbst zu, mit dem <b>Explorer<\/b>-Objekt auf die verschiedenen Ansichten von Outlook und mit dem <b>Inspector<\/b>-Objekt auf von Outlook aus ge&ouml;ffnete Fenster beispielsweise zur Anzeige einer E-Mail. Au&szlig;erdem gibt es noch Klassen, mit denen wir die einzelnen Ordner oder die darin enthaltenen Elemente wie E-Mails, Kontakte, Termine oder Aufgaben referenzieren k&ouml;nnen.<\/p>\n<p>Wenn wir neu im Thema sind und nicht genau wissen, welche Klasse welche Ereignisse bietet, hilft uns ein Blick in den Objektkatalog. In unserem Beispiel, wo wir auf den Eingang einer E-Mail reagieren wollen, gibt es unterschiedliche Ideen, welche Klasse ein passendes Ereignis bietet. Vielleicht gibt es ein Ereignis, das ausgel&ouml;st wird, wenn einem Ordner ein neues Element hinzuf&uuml;gt wird? Oder wird ein solches Ereignis von einer anderen Klasse zur Verf&uuml;gung gestellt?<\/p>\n<p>Haben wir Outlook ge&ouml;ffnet, starten wir mit <b>Alt + F11 <\/b>den VBA-Editor. Hier zeigen wir mit <b>F2 <\/b>den Objektkatalog an. Oben im Fenster w&auml;hlen wir statt dem Eintrag <b>Alle Bibliotheken <\/b>die Bibliothek <b>Outlook <\/b>aus, direkt darunter geben wir als Suchbegriff <b>Mail <\/b>ein.<\/p>\n<p>In der Liste der Suchergebnisse suchen wir nun nach Elementen, die durch ein Blitz-Icon markiert werden und sto&szlig;en schnell auf die beiden Ereignisse <b>NewMail <\/b>und <b>NewMailEx <\/b>(siehe Bild 1). Klicken wir <b>NewMail<\/b> an, sehen wir die Beschreibung dieses Ereignisses im unteren Bereich. Au&szlig;erdem sehen wir, dass es sich hierbei um ein Ereignis der Klasse <b>Outlook.Application <\/b>handelt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_308_001.png\" alt=\"Ermitteln von Ereignissen f&uuml;r E-Mails\" width=\"424,6267\" height=\"379,5409\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ermitteln von Ereignissen f&uuml;r E-Mails<\/span><\/b><\/p>\n<p>Das Gleiche gilt f&uuml;r das Ereignis <b>NewMailEx<\/b>. Klicken wir dieses im Objektkatalog an, finden wir schnell heraus, dass es im Gegensatz zum Ereignis <b>NewMail <\/b>noch einen Parameter namens <b>EntryIDCollection <\/b>mit dem Datentyp <b>String <\/b>liefert (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_308_002.png\" alt=\"Das Ereignis NewMailEx im Objektkatalog\" width=\"424,6267\" height=\"274,6138\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Das Ereignis NewMailEx im Objektkatalog<\/span><\/b><\/p>\n<p>Neben diesen beiden offensichtlichen M&ouml;glichkeiten gibt es noch ein weiteres Ereignis, das durch das Empfangen einer E-Mail ausgel&ouml;st wird. Dabei handelt es sich um das Ereignis <b>ItemAdd <\/b>der <b>Items<\/b>-Auflistung eines <b>Folder<\/b>-Objekts, das ausgel&ouml;st wird, wenn einem Ordner ein Element hinzugef&uuml;gt wird. Um dieses zu nutzen, um auf den Eingang neuer E-Mails zu reagieren, m&uuml;ssen wir den richtigen Ordner damit ausstatten, in der Regel den Ordner <b>Posteingang<\/b>. Wie das gelingt, zeigen wir gegen Ende des Artikels.<\/p>\n<h2>Ereignisse implementieren<\/h2>\n<p>Um ein Ereignis in Form einer Ereignisprozedur zu implementieren, ben&ouml;tigen wir zun&auml;chst ein Klassenmodul. Nur in einem solchen k&ouml;nnen wir die Klasse, welche das Ereignis bereitstellt, mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklarieren, und ohne dieses Schl&uuml;sselwort k&ouml;nnen wir die Ereignisprozedur nicht implementieren.<\/p>\n<p>Zum Gl&uuml;ck haben wir mit dem Klassenmodul <b>ThisOutlookSession <\/b>immer ein Klassenmodul zur Hand, welches wir noch nicht einmal initialisieren m&uuml;ssen, dass es standardm&auml;&szlig;ig bereits initialisiert ist. Noch besser: Die Klasse <b>Application <\/b>steht hier immer bereit, sodass wir diese noch nicht einmal deklarieren m&uuml;ssen. Um ein Ereignis f&uuml;r <b>Outlook.Application <\/b>zu implementieren, m&uuml;ssen wir nur zwei Schritte erledigen:<\/p>\n<ul>\n<li>Wir w&auml;hlen im linken Kombinationsfeld des Codefensters des Moduls <b>ThisOutlookSession <\/b>den Eintrag <b>Application <\/b>aus. Dies legt automatisch das Standardereignis f&uuml;r diese Klasse an, in diesem Fall <b>Application_ItemSend<\/b>.<\/li>\n<li>Dann w&auml;hlen wir im rechten Kombinationsfeld das Ereignis aus, das wir eigentlich implementieren wollen, n&auml;mlich zun&auml;chst einmal <b>NewMail<\/b> (siehe Bild 3)<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_308_003.png\" alt=\"Das Ereignis NewMail implementieren\" width=\"599,6265\" height=\"249,9222\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Das Ereignis NewMail implementieren<\/span><\/b><\/p>\n<\/ul>\n<p>Anschlie&szlig;end entfernen wir zun&auml;chst die Prozedur <b>Application_ItemSend <\/b>wieder. Au&szlig;erdem w&auml;hlen wir im rechten Kombinationsfeld noch den Eintrag <b>NewMailEx <\/b>aus, um auch die zweite f&uuml;r uns interessante Ereignisprozedur hinzuzuf&uuml;gen.<\/p>\n<h2>Pr&uuml;fen, ob die Ereignisse ausgel&ouml;st werden<\/h2>\n<p>Jetzt wollen wir herausfinden, ob die Ereignisprozeduren automatisch aufgerufen werden, wenn wir E-Mails mit Outlook abrufen. Dazu f&uuml;gen wir den Prozeduren einfach jeweils eine Anweisung hinzu, sodass diese anschlie&szlig;end wie folgt aussehen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Application_NewMail()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"NewMail\"\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>Application_NewMailEx(_\r\n         ByVal EntryIDCollection<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"NewMailEx\", EntryIDCollection\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Rufen wir nun E-Mails ab, erhalten wir im Direktbereich beispielsweise beim Abrufen von zwei E-Mails eine Ausgabe wie in Bild 4.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_308_004.png\" alt=\"Ausgabe im Direktbereich bei Maileingang\" width=\"499,6267\" height=\"122,131\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ausgabe im Direktbereich bei Maileingang<\/span><\/b><\/p>\n<p>Das Ereignis <b>NewMail <\/b>liefert keinen Parameter, somit k&ouml;nnen wir damit nur herausfinden, ob eine E-Mail abgerufen wurde und nicht, welche.<\/p>\n<p>Das Ereignis <b>NewMailEx<\/b> liefert immerhin einen Parameter namens <b>EntryIDCollection<\/b>. Dieser enthielt f&uuml;r fr&uuml;here Versionen der Bibliothek <b>Microsoft Outlook x.0 Object Library<\/b> eine Komma-separierte Liste der <b>EntryIDs <\/b>aller eingegangenen E-Mails. In der aktuellen Version wird das Ereignis f&uuml;r jede E-Mail einmal ausgelesen und liefert dementsprechend immer nur eine <b>EntryID<\/b>. Eine <b>EntryID <\/b>ist ein eindeutiger Bezeichner f&uuml;r die Outlook-Elemente, mit dem wir auf das jeweilige Element zugreifen k&ouml;nnen.<\/p>\n<h2>Zugriff auf die eingegangenen E-Mails<\/h2>\n<p>Nun schauen wir uns an, wie wir die mit der <b>NewMailEx<\/b>-Ereignisprozedur eingelesenen <b>EntryID<\/b>-Werte nutzen k&ouml;nnen, um auf die eingegangenen E-Mails zuzugreifen. Wir programmieren die L&ouml;sung so, dass sie auch mit fr&uuml;heren Versionen der Outlook-VBA-Bibliothek kompatibel ist. Wir gehen also davon aus, dass der Parameter <b>EntryIDCollection <\/b>auch mehrere, durch Kommata getrennte Eintr&auml;ge enthalten kann.<\/p>\n<p>Dazu erweitern wir die Prozedur wie in Listing 1. Wir deklarieren ein <b>String<\/b>-Array, um die mit <b>EntryIDCollection <\/b>gelieferten EntryIDs aufzunehmen. Au&szlig;erdem nutzen wir zum Referenzieren der Objekte zun&auml;chst die Variable <b>objItem<\/b>, die wir als <b>Object <\/b>deklarieren, und nur wenn es sich bei dem eingegangenen Element um eine E-Mail handelt, weisen wir es der Variablen <b>objMailItem <\/b>des Typs <b>MailItem <\/b>zu.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Application_NewMailEx(ByVal EntryIDCollection<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strEntryIDs()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objItem<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objMailItem<span style=\"color:blue;\"> As <\/span>MailItem\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>\r\n     strEntryIDs = <span style=\"color:blue;\">Split<\/span>(EntryIDCollection, \",\")\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(strEntryIDs) To <span style=\"color:blue;\">UBound<\/span>(strEntryIDs)\r\n         <span style=\"color:blue;\">Set<\/span> objItem = Application.Session.GetItemFromID(strEntryIDs(i))\r\n         Select Case objItem.Class\r\n             <span style=\"color:blue;\">Case <\/span>olMail\r\n                 <span style=\"color:blue;\">Set<\/span> objMailItem = objItem\r\n                 <span style=\"color:blue;\">With<\/span> objMailItem\r\n                     <span style=\"color:blue;\">Debug.Print<\/span> .Subject, .ReceivedTime\r\n                 End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000308\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000308?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000308\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"2987d086e8\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die verschiedenen Klassen von Outlook bieten eine ganze Reihe von Ereignissen an. Diese werden durch unterschiedliche Aktionen ausgel&ouml;st. Eine dieser Aktion ist das Eintreffen einer oder mehrerer neuer E-Mails. Dieses Ereignis mit einer geeigneten Ereignisprozedur abzufangen ist ein sinnvolles Beispiel f&uuml;r die Beschreibung der Programmierung von Ereignissen unter Outlook. Mit E-Mails kann man nach dem Eingang eine Menge anstellen &#8211; diese l&ouml;schen, in einen anderen Ordner verschieben, die Message-Datei im Dateisystem sichern oder auch die Inhalte auslesen, um diese etwa in eine Datenbank zu schreiben. In diesem Artikel beschreiben wir erst einmal allgemein, wie wir &uuml;berhaupt mit VBA-Code auf den Eingang einer E-Mail reagieren k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662022,66042022,44000021,44000026],"tags":[],"yst_prominent_words":[],"class_list":["post-55000308","post","type-post","status-publish","format-standard","hentry","category-662022","category-66042022","category-Entity_Framework","category-Outlook_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000308","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000308"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000308\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000308"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}