{"id":55000342,"date":"2022-12-01T00:00:00","date_gmt":"2023-03-02T16:58:08","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=342"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Outlook_EMailAnlagen_verarbeiten","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Outlook_EMailAnlagen_verarbeiten\/","title":{"rendered":"Outlook: E-Mail-Anlagen verarbeiten"},"content":{"rendered":"<p><b>E-Mails k&ouml;nnen unterschiedlichste Dateien als Anlagen enthalten. Von der Rechnung &uuml;ber Beispieldatenbanken, Word-Dokumente, PDFs oder Excel-Datenbanken. In manchen F&auml;llen m&ouml;chte man diese automatisiert weiterverarbeiten &#8211; beispielsweise, um Rechnungsdokumente einzulesen oder auch um die Dateien einfach nur an einer Stelle im Dateisystem zu speichern, die gesichert wird. In diesem Artikel zeigen wir, wie wir auf die Anlagen von Outlook-E-Mails zugreifen k&ouml;nnen. Dazu nutzen wir die Outlook-Bibliothek und greifen per VBA auf die Attachments-Auflistung des <b>MailItem<\/b>-Objekts zu.<\/b><\/p>\n<h2>E-Mails und Anlagen<\/h2>\n<p>Wie wir E-Mails erstellen und ihnen Anlagen hinzuf&uuml;gen, haben wir bereits in einem fr&uuml;heren Artikel beschrieben. Dieser hei&szlig;t <b>E-Mails per VBA erstellen mit CreateItem  <\/b>(<b>www.vbentwickler.de\/309<\/b>). Im vorliegenden Artikel schauen wir uns nun an, wie wir den umgekehrten Weg gehen &#8211; also Anlagen aus E-Mails auslesen und weiterverarbeiten.<\/p>\n<h2>Um welche E-Mails geht es?<\/h2>\n<p>Die erste Frage, die man sich stellen muss, ist die der betroffenen E-Mails. Es gibt verschiedene M&ouml;glichkeiten, zum Beispiel:<\/p>\n<ul>\n<li>nur eine bestimmte E-Mail<\/li>\n<li>alle E-Mails eines Ordners<\/li>\n<li>alle E-Mails eines bestimmten Empf&auml;ngers<\/li>\n<li>alle E-Mails aus allen Ordnern<\/li>\n<\/ul>\n<h2>Was soll mit den Anlagen geschehen?<\/h2>\n<p>Wenn wir Anlagen von E-Mails weiterverarbeiten wollen, geschieht das meist im Kontext einer bestimmten Anwendung. Also beispielsweise in einer Access-Anwendung wie etwa einer Kundenverwaltung.<\/p>\n<p>In dieser will man vielleicht alle E-Mails, die in Zusammenhang mit der E-Mail-Adresse des Kunden stehen, in einer Tabelle der Datenbank speichern und im Detailformular zur Ansicht des Kunden anzeigen. Ein sch&ouml;nes Feature w&auml;re, wenn man per Doppelklick auf eine solche E-Mail direkt die entsprechende E-Mail im Mailfenster &ouml;ffnen k&ouml;nnte.<\/p>\n<p>Vielleicht hat man auch einen Ordner, in den man alle E-Mails verschiebt, die eine Rechnung enthalten, die man f&uuml;r die Buchhaltung ben&ouml;tigt. Man k&ouml;nnte dann alle E-Mails dieses Ordners durchlaufen und die Rechnungen in Ordner verschieben, die nach dem Empfangsdatum der E-Mail benannt sind &#8211; zum Beispiel <b>2022\/12 <\/b>oder <b>2023\/01<\/b>.<\/p>\n<p>Man k&ouml;nnte die Anlagen auch in Ordnern speichern, die als Name die E-Mail-Adresse des Absenders enthalten. So kann man schnell die Anlagen durchsuchen, die von einem bestimmten Absender geschickt wurden.<\/p>\n<h2>Wann sollen die Anlagen verarbeitet werden?<\/h2>\n<p>Auch hier gibt es verschiedene M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Manueller Abruf. Hier w&uuml;rde man eine Prozedur aufrufen, welche die gew&uuml;nschten E-Mails oder auch vollst&auml;ndige Ordner durchl&auml;uft und alle enthaltenen Anlagen auf die gew&uuml;nschte Art speichert. Dieser Aufruf w&uuml;rde vermutlich im VBA-Projekt der Anwendung untergebracht werden, mit der die Anlagen weiterverarbeitet werden.<\/li>\n<li>Automatischer Abruf: Man k&ouml;nnte auch Ereignisprozeduren im Outlook-VBA-Projekt definieren, mit denen man auf das Eintreffen neuer E-Mails reagiert &#8211; oder auch auf das Verschieben von E-Mails in einen bestimmten, f&uuml;r das Verarbeiten von Anlagen vorgesehenen Ordner.<\/li>\n<\/ul>\n<p>In diesem Artikel wollen wir jedoch erst einmal die grundlegenden Techniken f&uuml;r das Speichern von Anlagen betrachten. Dazu m&uuml;ssen wir wissen, wie wir die entsprechenden E-Mails referenzieren und dann die passenden Methoden der <b>Attachments<\/b>-Auflistung nutzen.<\/p>\n<h2>Alle Anlagen aus dem Posteingang speichern<\/h2>\n<p>Der Einfachheit halber beginnen wir mit den E-Mails, die sich aktuell im Posteingang befinden. Den Ordner f&uuml;r den Posteingang k&ouml;nnen wir, wie wir auch im Artikel <b>Outlook: Ordner per VBA im Griff <\/b>(<b>www.vbentwickler.de\/340<\/b>) beschrieben haben, relativ einfach referenzieren. Wir verwenden nachfolgend die folgende Funktion, um den Ordner <b>Posteingang <\/b>zu referenzieren. Da diese das <b>Application<\/b>-Objekt von Outlook explizit deklariert und referenziert, k&ouml;nnen wir diesen Code auch au&szlig;erhalb von Outlook nutzen &#8211; also beispielsweise in Access, Excel oder Word:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetInbox()<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n     <span style=\"color:blue;\">Dim <\/span>objMAPI<span style=\"color:blue;\"> As <\/span>Outlook.NameSpace\r\n     <span style=\"color:blue;\">Set<\/span> objOutlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n     <span style=\"color:blue;\">Set<\/span> objMAPI = objOutlook.GetNamespace(\"MAPI\")\r\n     <span style=\"color:blue;\">Set<\/span> GetInbox = objMAPI.GetDefaultFolder(olFolderInbox)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Damit k&ouml;nnen wir leicht auf den Posteingangsordner zugreifen und beispielsweise seinen Namen ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> GetInbox.Name\r\nPosteingang<\/pre>\n<h2>E-Mails mit Anlagen im Posteingang durchlaufen<\/h2>\n<p>Die n&auml;chste Prozedur erlaubt uns, alle E-Mails im Posteingang zu durchlaufen und nur die Betreffzeile derjenigen E-Mails auszugeben, die mindestens eine Anlage enthalten. Dazu durchlaufen wir erst einmal alle Elemente der <b>Items<\/b>-Auflistung in einer <b>For Each<\/b>-Schleife und weisen das aktuelle Objekt der Variablen <b>objItem <\/b>zu. Diese hat den Datentyp <b>Object<\/b>. Warum das und nicht direkt MailItem? Wir wollen doch E-Mails untersuchen? Der Grund ist, dass der Posteingang durchaus auch einmal Termine oder andere Objekte enthalten kann. Wenn wir diese dann mit einer <b>MailItem<\/b>-Objektvariablen referenzieren, l&ouml;sen wir einen Fehler aus. Also pr&uuml;fen wir erst einmal anhand der <b>Class<\/b>-Eigenschaft von <b>objItem<\/b>, ob es sich um ein <b>MailItem<\/b>-Objekt handelt. Diese Eigenschaft liefert dann den Wert <b>olMail<\/b>. Ist das der Fall, weisen wir das Objekt aus <b>objItem <\/b>der Objektvariablen <b>objMailItem <\/b>zu. Warum &uuml;berhaupt wechseln? Weil wir mit einem <b>MailItem<\/b>-Objekt besser IntelliSense nutzen k&ouml;nnen.<\/p>\n<p>Schlie&szlig;lich pr&uuml;ft die Prozedur mit der <b>Count<\/b>-Eigenschaft der <b>Attachments<\/b>-Auflistung, ob die E-Mail mindestens eine Anlage enth&auml;lt und gibt f&uuml;r diese E-Mails den Betreff im Direktbereich des VBA-Editors aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AlleMailsImPosteingang()\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     For Each objItem In GetInbox.Items\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;\">If <\/span><span style=\"color:blue;\">Not<\/span> objMailItem.Attachments.Count = 0<span style=\"color:blue;\"> Then<\/span>\r\n                     <span style=\"color:blue;\">Debug.Print<\/span> objMailItem.Subject\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> objItem\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>E-Mails mit Anlagen per Restrict ermitteln<\/h2>\n<p>Bevor wir uns an die Verarbeitung der Anlagen begeben, schauen wir uns noch eine weitere M&ouml;glichkeit an, die E-Mails mit Anlagen aus einem Ordner zu ermitteln.<\/p>\n<p>Im folgenden Beispiel nutzen wir dazu die <b>Restrict<\/b>-Methode der <b>Items<\/b>-Auflistung.<\/p>\n<p>Als Erstes referenzieren wir mit der Variablen <b>objItems <\/b>mit dem Typ <b>Items <\/b>alle Elemente des Posteingangs und geben ihre Anzahl aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>MailsMitAttachmentFiltern()\r\n     <span style=\"color:blue;\">Dim <\/span>objItems<span style=\"color:blue;\"> As <\/span>Items\r\n     <span style=\"color:blue;\">Dim <\/span>objItemsWithAttachment<span style=\"color:blue;\"> As <\/span>Items\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objItems = GetInbox.Items\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Alle Mails: \" & objItems.count<\/pre>\n<p>Dann stellen wir in <b>strSQL <\/b>einen Abfrageausdruck zusammen, er alle E-Mails mit Anlage ermittelt:<\/p>\n<pre>     strSQL = \"@SQL=\"\"urn:schemas:httpmail:hasattachment\"\"=1\"<\/pre>\n<p>Diesen wenden wir mit der <b>Restrict<\/b>-Methode auf die Liste <b>objItems <\/b>an, weisen das Ergebnis der Variablen <b>objItemsWithAttachments <\/b>zu und geben die mit Count ermittelte Anzahl der Elemente im Direktbereich des VBA-Editors aus:<\/p>\n<pre>     <span style=\"color:blue;\">Set<\/span> objItemsWithAttachment = _\r\n         objItems.Restrict(strSQL)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Alle Mails mit Anlage: \" _\r\n         & objItemsWithAttachment.count\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>An dieser Stelle reicht die Information, wie der <b>Restrict<\/b>-Ausdruck aussieht:<\/p>\n<pre>@SQL=\"urn:schemas:httpmail:hasattachment\"=1<\/pre>\n<p>Diesen Ausdr&uuml;cken werden wir einen eigenen Artikel in einer sp&auml;teren Ausgabe widmen.<\/p>\n<h2>Funktion zum Lesen der E-Mails mit Anlage aus einem Ordner<\/h2>\n<p>Aus diesen Anweisungen bauen wir uns eine Funktion, der wir als Parameter einen Ordner &uuml;bergeben und die als Ergebnis eine Liste der Elemente mit Anlagen liefert:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetMailsWithAttachment( _\r\n         objFolder<span style=\"color:blue;\"> As <\/span>Outlook.Folder)<span style=\"color:blue;\"> As <\/span>Items\r\n     <span style=\"color:blue;\">Dim <\/span>objItems<span style=\"color:blue;\"> As <\/span>Items\r\n     <span style=\"color:blue;\">Dim <\/span>objItemsWithAttachment<span style=\"color:blue;\"> As <\/span>Items\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objItems = objFolder.Items\r\n     strSQL = \"@SQL=\"\"urn:schemas:httpmail:hasattachment\"\"=1\"\r\n     <span style=\"color:blue;\">Set<\/span> objItemsWithAttachment = objItems.Restrict(strSQL)\r\n     <span style=\"color:blue;\">Set<\/span> GetMailsWithAttachment = objItemsWithAttachment\r\n<span style=\"color:blue;\">End Function<\/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\/55000342\/\">\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\/55000342?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\/55000342\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"cbd3f36316\"\/>\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>E-Mails k&ouml;nnen unterschiedlichste Dateien als Anlagen enthalten. Von der Rechnung &uuml;ber Beispieldatenbanken, Word-Dokumente, PDFs oder Excel-Datenbanken. In manchem F&auml;llen m&ouml;chte man diese automatisiert weiterverarbeiten &#8211; beispielsweise, um Rechnungsdokumente einzulesen oder auch um die Dateien einfach nur an einer Stelle im Dateisystem zu speichern, die gesichert wird. In diesem Artikel zeigen wir, wie wir auf die Anlagen von Outlook-E-Mails zugreifen k&ouml;nnen. Dazu nutzen wir die Outlook-Bibliothek und greifen per VBA auf die Attachments-Auflistung des Mail-Item-Objekts zu.<\/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,66062022,44000026],"tags":[],"yst_prominent_words":[],"class_list":["post-55000342","post","type-post","status-publish","format-standard","hentry","category-662022","category-66062022","category-Outlook_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000342","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=55000342"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000342\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000342"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000342"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000342"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}