{"id":55000878,"date":"2013-04-01T00:00:00","date_gmt":"2020-05-22T21:35:03","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=878"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Kundenkommunikation_per_EMail_verwalten_Teil_2","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/","title":{"rendered":"Kundenkommunikation per E-Mail verwalten, Teil 2"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/56d6eb499ad74fc2a76827ccb5464a7f\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im ersten Teil dieser Beitragsreihe haben wir die Grundlagen geschaffen, um die E-Mails aus den verschiedenen Ordnern von Outlook zu importieren. Im zweiten Teil schauen wir uns das notwendige Datenmodell an und schreiten zur Tat: Die E-Mails aus den ausgew&auml;hlten Outlook-Ordnern sollen importiert und den einzelnen Kunden zugeordnet werden.<\/b><\/p>\n<p>Wenn Sie die E-Mails von Kunden importieren m&ouml;chten, gibt es gleich mehrere Gr&uuml;nde, sich genauer um das Thema E-Mail-Adressen zu k&uuml;mmern. Im einfachsten Fall haben Sie als Betreiber der Datenbank eine einzige E-Mail-Adresse, mit der Sie E-Mails an die Kunden verschicken. &Uuml;ber diese Adresse sollten optimalerweise auch die E-Mails der Kunden bei Ihnen eintreffen.<\/p>\n<p>Andersherum wird jeder Kunde mit einer einzigen E-Mail-Adresse in Ihrer Datenbank gespeichert &#8211; zum Beispiel mit der E-Mail-Adresse, die dieser beim Absenden der Bestellung &uuml;ber einen Internetshop angegeben hat.<\/p>\n<p>Dummerweise ist aber weder die eine noch die andere Annahme realit&auml;tsnah. Wenn Sie selbst tats&auml;chlich nur eine einzige E-Mail-Adresse verwenden, sind Sie fein raus &#8211; dann kann der Kunde sich ja nur unter dieser Adresse bei Ihnen melden. Aber wenn Sie auch nur eine Adresse etwa namens <b>info@minhorst.com <\/b>und eine namens <b>support@minhorst.com <\/b>betreiben, k&ouml;nnen Sie davon ausgehen, dass es dem Kunden erstmal egal ist, wohin die Mail geht &#8211; Hauptsache, die Domain stimmt. Dementsprechend gibt es ja unter Outlook sogar schon die M&ouml;glichkeit, f&uuml;r jede einzelne Adresse eine eigene <b>.pst<\/b>-Datei zu betreiten.<\/p>\n<p>Andersherum hat vielleicht nicht die Mehrzahl der Kunden mehrere E-Mail-Adressen, aber selbst wenn es nur ganz wenige sind, m&uuml;ssen Sie diesen Fall ber&uuml;cksichtigen (zum Beispiel eine private und eine berufliche E-Mail-Adresse &#8211; und die wirft man erfahrungsgem&auml;&szlig; schnell mal durcheinander &#8230;).<\/p>\n<p>Also m&uuml;ssen Sie wohl oder &uuml;bel nicht nur f&uuml;r sich selbst, sondern auch f&uuml;r die Kunden mehrere E-Mail-Adressen pr&uuml;fen, wenn es um die Zuordnung der E-Mails zum entsprechenden Kunden geht.<\/p>\n<p>Wie aber l&auml;uft der Abgleich der vielen E-Mails in Outlook mit den vorhandenen Kunden &uuml;berhaupt ab Hier gibt es zun&auml;chst zwei M&ouml;glichkeiten: Die erste geht vom Optimalfall aus und nimmt an, dass alle E-Mails, die Ihnen von Kunden zugesendet wurden, sich im oder unterhalb des Ordners <b>Posteingang <\/b>befinden. Dementsprechend sollten alle E-Mails, die Sie verschickt haben, im Ordner <b>Gesendete Objekte <\/b>enthalten sein.<\/p>\n<p>Dies ist aber in vielen F&auml;llen nicht gegeben, weil Sie vielleicht bereits selbst ein wenig Struktur in in Ihre Mailordner gebracht haben und etwa alle E-Mails zum Thema Support oder zum Thema Buchhaltung in einem Ordner gespeichert haben &#8211; unabh&auml;ngig davon, ob es sich um Ihre eigenen E-Mails handelt oder um die E-Mails Ihrer Kunden.<\/p>\n<p>Schauen wir uns zun&auml;chst an, wie die Beispiell&ouml;sung die E-Mail-Adressen des Benutzers selbst verwaltet. Dazu gibt es zwei Tabellen &#8211; eine Optionentabelle namens <b>tblOptionen <\/b>und eine Tabelle namens <b>tblEMailAdressen<\/b>, die alle E-Mail-Adressen der kompletten L&ouml;sung speichert.<\/p>\n<p>Die Tabelle <b>tblOptionen <\/b>enth&auml;lt derzeit nur ein einziges Feld namens <b>StandardEMailAdresseID<\/b>. Dieses ist ein Fremdschl&uuml;sselfeld und mit dem Feld <b>EMailAdresseID <\/b>der Tabelle <b>tblEMailAdressen <\/b>verkn&uuml;pft. Diese Tabelle wiederum enth&auml;lt das entsprechende Prim&auml;rschl&uuml;sselfeld, das Feld <b>EMailAdresse <\/b>zum Speichern der E-Mail-Adresse und ein Feld namens <b>KundeID<\/b>, mit dem eine E-Mail-Adresse einem Kunden zugewiesen werden kann. Die beiden Tabellen und deren Beziehung sehen in der &Uuml;bersicht wie in Bild 1 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Das Formular frmOptionen in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Der Benutzer der Anwendung soll nun mehrere E-Mail-Adressen eingeben und eine davon als seine Standard-E-Mail-Adresse festlegen k&ouml;nnen. Diese soll standardm&auml;&szlig;ig beim Versenden von E-Mails eingesetzt werden. Dazu stellt die L&ouml;sung das Formular <b>frmOptionen <\/b>mit dem Unterformular <b>sfmEMailAdressen <\/b>zur Verf&uuml;gung. Im Unterformular kann der Benutzer alle verf&uuml;gbaren E-Mail-Adressen eintragen, mit dem Kombinationsfeld im oberen Bereich w&auml;hlt er die aktuelle Standardadresse aus (s. Bild 2).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Beziehungsfenster mit den beiden Tabellen tblOptionen und tblEMailAdressen<\/span><\/b><\/p>\n<p>Das Hauptformular <b>frmOptionen <\/b>hat keine eigene Datenherkunft. Es enth&auml;lt im oberen Bereich ein Kombinationsfeld namens <b>cboEMailAdresseID<\/b> und darunter ein Unterformular (s. Bild 3).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Verwalten der eigenen E-Mail-Adressen<\/span><\/b><\/p>\n<p>Das Kombinationsfeld verwendet eine Abfrage auf Basis der Tabelle <b>tblEMailAdressen <\/b>als Datenherkunft, die alle Datens&auml;tze liefert, deren Fremdschl&uuml;sselfeld <b>KundeID <\/b>den Wert <b>NULL <\/b>enth&auml;lt &#8211; also alle E-Mail-Adressen, die nicht anderweitig mit einem Kunden verkn&uuml;pft sind (s. Bild 4).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Datensatzherkunft des Kombinationsfeldes zur Auswahl der Standard-E-Mail-Adresse<\/span><\/b><\/p>\n<p>Das im Hauptformular befindliche Unterformular hei&szlig;t <b>sfmEMailAdressen <\/b>und verwendet die gleiche Datenherkunft wie das Kombinationsfeld <b>cboEMailAdresseID<\/b>. Der Benutzer kann hier E-Mail-Adressen einf&uuml;gen und die vorhandenen Eintr&auml;ge bearbeiten und l&ouml;schen. Bei jeder Aktion sollen die &Atilde;&#8220;nderungen jedoch in die Datenherkunft des Kombinationsfeldes <b>cboEMailAdressen <\/b>&uuml;bertragen werden. Dazu legen Sie f&uuml;r das Ereignis <b>Nach Aktualisieren <\/b>des Unterformulars die folgende Ereignisprozedur an:<\/p>\n<pre>Private Sub Form_AfterUpdate()\r\n    Me.Parent!cboStandardEMailID.Requery\r\nEnd Sub<\/pre>\n<p>Die <b>Requery<\/b>-Methode sorgt jeweils f&uuml;r die Aktualisierung der Datensatzherkunft des Kombinationsfeldes.<\/p>\n<p><b>Kunden verwalten<\/b><\/p>\n<p>Die Verwaltung der Kunden soll hier im Hintergrund stehen, es geht schlie&szlig;lich um die Kommunikation. Deshalb haben wir das Datenmodell f&uuml;r die Kundentabelle etwas knapper gehalten (s. Bild 5). Hier sind die Eigenschaften des Fremdschl&uuml;sselfeldes <b>StandardEMailAdresseID<\/b> sichtbar. Ach, das Feld kennen Sie schon Stimmt: Neben dem Benutzer soll auch jeder Kunde eine Standard-E-Mail-Adresse erhalten, und die wird mit diesem Feld ausgew&auml;hlt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Entwurfsansicht der Kundentabelle<\/span><\/b><\/p>\n<p>Die Datensatzherkunft und die &uuml;brigen Nachschlageeigenschaften haben wir nun schon eingestellt, damit das Feld beim Anlegen im Formular gleich als Kombinationsfeld ausgef&uuml;hrt wird. Sp&auml;ter wird die Abfrage mit den E-Mail-Adressen nat&uuml;rlich nach dem Wert des Feldes <b>KundeID <\/b>gefiltert.<\/p>\n<p>Die Tabelle enth&auml;lt noch ein Feld namens <b>AnredeID<\/b>, mit dem die Anrede des jeweiligen Kunden eingestellt werden kann. Die m&ouml;glichen Werte speichert die Tabelle <b>tblAnreden<\/b>, die Auswahl erfolgt wiederum per Kombinationsfeld.<\/p>\n<p><b>Formular zur Kundenverwaltung<\/b><\/p>\n<p>Das Formular zur Verwaltung der Kunden verwendet die Tabelle <b>tblKunden <\/b>als Datenherkunft und zeigt alle Felder dieser Tabelle an.<\/p>\n<p>Daneben enth&auml;lt das Formular genau wie das Formular <b>frmOptionen<\/b> ein Unterformular, mit dem Sie die E-Mail-Adressen f&uuml;r den Kunden eintragen k&ouml;nnen. Genau genommen verwenden Sie dort fast genau das gleiche Formular als Unterformular. Das hier verwendete hei&szlig;t <b>sfmEMailAdressenKunden<\/b>. Ziehen Sie das Unterformular in das Hauptformular und pr&uuml;fen Sie, ob die Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>automatisch von Access wie in Bild 6 eingerichtet wurden.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic010.png\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Pr&uuml;fen der Verkn&uuml;pfung von Haupt- und Unterformular<\/span><\/b><\/p>\n<p>Der wesentliche Unterschied vom Unterformular <b>sfmEMailAdressenKunden <\/b>zum Formular <b>sfmEMailAdressen <\/b>ist die Datenherkunft. Das Unterformular zur Anzeige der E-Mail-Adressen des Kunden verwendet die Abfrage aus Bild 7 als Datenherkunft. Der entscheidende Unterschied ist hier, dass diese Abfrage nicht die Datens&auml;tze der Tabelle <b>tblEMailAdressen <\/b>liefert, deren Feld <b>KundeID <\/b>leer ist, sondern genau die &uuml;brigen Datens&auml;tze &#8211; n&auml;mlich jene, die im Feld <b>KundeID <\/b>mit einem Wert ausgestattet sind.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic011.png\" alt=\"pic011.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Datenherkunft des Unterformulars sfmEMailAdressenKunden<\/span><\/b><\/p>\n<p>Auch f&uuml;r das Unterformular <b>sfmEMailAdressenKunden <\/b>legen Sie zwei Ereignisprozeduren an, und zwar f&uuml;r die Ereignisse <b>Nach Aktualisierung <\/b>und <b>Beim L&ouml;schen<\/b>. Die folgende Prozedur wird nach dem Aktualisieren eines Datensatzes ausgel&ouml;st, also beim Neuanlegen oder beim &Atilde;&#8220;ndern eines bestehenden Datensatzes:<\/p>\n<pre>Private Sub Form_AfterUpdate()\r\n    Me.Parent!cboStandardEMailID.Requery\r\n    If Me.Recordset.RecordCount = 1 Then\r\n        Me.Parent!cboStandardEMailID = Me.Parent!cboStandardEMailID.ItemData(0)\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die Prozedur aktualisiert zun&auml;chst die Datenherkunft des Kombinationsfeldes <b>cboStandardEMailID <\/b>im Hauptformular. Dann pr&uuml;ft sie, ob der ge&auml;nderte Datensatz der einzige Datensatz im Unterformular ist, und stellt gegebenenfalls das Kombinationsfeld im Hauptformular auf diesen Datensatz ein. Dies ist hilfreich, wenn der Benutzer beispielsweise gerade den ersten Datensatz im Unterformular angelegt hat. Dieser wird dann direkt als Standard-E-Mail-Adresse angelegt.<\/p>\n<p>Wenn der Benutzer einen oder mehrere Eintr&auml;ge im Unterformular l&ouml;scht, l&ouml;st dies die folgende Prozedur aus:<\/p>\n<pre>Private Sub Form_Delete(Cancel As Integer)\r\n    Me.Parent!cboStandardEMailID.Requery\r\n    If Me.Parent!cboStandardEMailID = Me!EMailAdresseID Then\r\n        If Me.Recordset.RecordCount = 0 Then\r\n            Me.Parent!cboStandardEMailID = Null\r\n        Else\r\n            Me.Parent!cboStandardEMailID = Me.Parent!cboStandardEMailID.ItemData(0)\r\n        End If\r\n    End If\r\n    Me.Parent.Requery\r\nEnd Sub<\/pre>\n<p>Auch diese Prozedur aktualisiert zun&auml;chst die Datenherkunft des Kombinationsfeldes <b>cboStandardEMailID <\/b>im Hauptformular. Dann pr&uuml;ft sie, ob das Kombinationsfeld im Hauptformular die soeben gel&ouml;schte E-Mail-Adresse angezeigt hat, und aktualisiert gegebenenfalls das Kombinationsfeld im Hauptformular. Wurde der letzte Datensatz im Unterformular gel&ouml;scht, leert die Prozedur das Kombinationsfeld <b>cboStandardEMailID <\/b>im Hauptformular, anderenfalls stellt sie dieses auf den ersten verf&uuml;gbaren Wert ein.<\/p>\n<p>Auch das Hauptformular statten wir noch mit zwei Ereignisprozeduren aus. Die erste wird durch das Ereignis <b>Beim Anzeigen <\/b>ausgel&ouml;st. Sie sorgt schlicht und einfach daf&uuml;r, dass das Kombinationsfeld <b>cboStandardEMail <\/b>beim Anzeigen eines Datensatzes nur die E-Mails zur Auswahl anbietet, die auch mit dem aktuellen Kunden verkn&uuml;pft sind:<\/p>\n<pre>Private Sub Form_Current()\r\n    Me!cboStandardEMailID.RowSource = &quot;SELECT EMailAdresseID, EMailAdresse &quot; _\r\n        &quot;FROM tblEMailAdressen WHERE KundeID = &quot; &amp; Me!KundeID\r\nEnd Sub<\/pre>\n<p>Die zweite Ereignisprozedur wird ausgel&ouml;st, wenn der Benutzer einen noch nicht vorhandenen Eintrag in das Kombinationsfeld <b>cboStandardEMailID <\/b>eingibt:<\/p>\n<pre>Private Sub cboStandardEMailID_NotInList(NewData As String, Response As Integer)\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    db.Execute &quot;INSERT INTO tblEMailAdressen(EMailAdresse, KundeID) VALUES(''&quot; _\r\n        &amp; NewData &amp; &quot;'', &quot; &amp; Me!KundeID &amp; &quot;)&quot;\r\n    Me!sfmEMailAdressen.Form.Requery\r\n    Set db = Nothing\r\n    Response = acDataErrAdded\r\nEnd Sub<\/pre>\n<p>Die Prozedur f&uuml;llt ein <b>Database<\/b>-Objekt mit einem Verweis auf die aktuelle Datenbank und f&uuml;hrt mit dessen <b>Execute<\/b>-Anweisung eine <b>INSERT INTO<\/b>-Aktionsabfrage aus, die einen neuen Datensatz zur Tabelle <b>tblEMailAdressen <\/b>hinzuf&uuml;gt. Diese wird mit der frisch eingegebenen E-Mail-Adresse und dem Wert des Feldes <b>KundeID <\/b>des aktuellen Kundendatensatzes im Hauptformular gef&uuml;llt.<\/p>\n<p><b>Behandlung eingelesener E-Mails<\/b><\/p>\n<p>Kommen wir zum Einlesen der E-Mails, die aufgrund der Absender- oder Empf&auml;ngeradresse mit einem der Kunden in Zusammenhang gebracht werden k&ouml;nnen. Diesen Vorgang haben wir durch die Bereitstellung eines Formulars zum Ausw&auml;hlen der zu durchsuchenden Outlook-Ordner bereits gut vorbereitet.<\/p>\n<p>Wir m&uuml;ssen nun noch eine Prozedur bereitstellen, welche in mehr oder weniger regelm&auml;&szlig;igen Abst&auml;nden die kundenrelevanten E-Mails aus Outlook importiert und in der Datenbank dem Kunden zuordnet. Dabei stellt sich zun&auml;chst die folgende Frage: Was geschieht mit einer einmal in die Datenbank eingelesenen E-Mail in Outlook Es gibt verschiedene Szenarien:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die E-Mail wird nach dem Einlesen schlicht und einfach gel&ouml;scht. Warum sollte man diese auch doppelt vorhalten<\/li>\n<li class=\"aufz-hlung\">Die E-Mail wird in einen speziellen Ordner verschoben, der alle E-Mails enth&auml;lt, die in die Datenbank eingelesen wurden.<\/li>\n<li class=\"aufz-hlung\">Die E-Mail verbleibt an Ort und Stelle. Man sollte diese jedoch zumindest in geeigneter Art und Weise markieren &#8211; erstens, damit man beim Lesen der &uuml;brigen E-Mails, die nicht einer Kundenbeziehung zugeordnet werden k&ouml;nnen, nicht immer wieder auf bereits in die Datenbank importierte E-Mails st&ouml;&szlig;t. Und zweitens muss man auch irgendwie daf&uuml;r sorgen, dass E-Mails nur ein einziges Mal in die Datenbank eingelesen werden.<\/li>\n<\/ul>\n<p>Welche M&ouml;glichkeiten gibt es, die Mails zu markieren und somit zu verhindern, dass diese erneut eingelesen werden beziehungsweise sowohl in der Datenbank als auch in Outlook vom Empf&auml;nger bearbeitet werden Die erste ist eine optische: Dabei erstellen Sie in Outlook eine eigene Kategorie f&uuml;r eingelesene E-Mails und weisen diese den entsprechenden E-Mails zu. In Outlook werden diese mit einer entsprechenden Farbe markiert (s. Bild 8).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic012.png\" alt=\"pic012.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Die gelb markierten E-Mails wurden bereits in die Datenbank eingelesen<\/span><\/b><\/p>\n<p>Wenn man sich vorstellt, dass die bereits eingelesenen E-Mails zwar markiert werden, jedoch im Ordner <b>Posteingang<\/b> verbleiben, ist bez&uuml;glich der &Uuml;bersichtlichkeit in Outlook nur wenig gewonnen. Besser w&auml;re es tats&auml;chlich, die eingelesenen E-Mails auch gleich zu l&ouml;schen oder in einen anderen Ordner zu verschieben. Das L&ouml;schen scheint etwas rabiat, also verschieben wir diese in einen speziell f&uuml;r bereits eingelesene E-Mails angelegten Ordner.<\/p>\n<p><b>Flexibles Einlesen<\/b><\/p>\n<p>Damit Sie die vorhergehenden Varianten beim Einlesen alle einsetzen k&ouml;nnen, haben wir die entsprechende Prozedur <b>EMailsEinlesen<\/b> (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-49-anchor\">Listing 1<\/a><\/span>) mit zwei entsprechenden Parametern ausgestattet:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>strZielordner<\/b>: Erwartet den Ordner, in den die eingelesenen E-Mails verschoben werden sollen, zum Beispiel <b>\\\\Outlook\\Posteingang\\Test<\/b><\/li>\n<li class=\"aufz-hlung\"><b>strKategorie<\/b>: Erwartet den Namen der Kategorie, mit dem die eingelesenen E-Mails versehen werden sollen.<\/li>\n<\/ul>\n<p class=\"listingueberschrift\">Listing 1: Einlesen von E-Mails in die Tabelle tblKommunikation<\/p>\n<pre>Public Sub EMailsEinlesen(Optional strZielordner As String, Optional strKategorie As String)\r\n    Dim db As DAO.Database\r\n    Dim rstMailordner As DAO.Recordset, rstMails As DAO.Recordset\r\n    Dim objFolder As Outlook.MAPIFolder, objZielordner As Outlook.Folder\r\n    Dim obj As Object, objMail As Outlook.MailItem\r\n    Dim objOutlook As Outlook.Application\r\n    Dim strMailordner As String, strEmail_From As String, strEMail_To As String\r\n    Dim lngKundeID As Long, i As Integer\r\n    Set objOutlook = New Outlook.Application\r\n    Set db = CurrentDb\r\n    Set rstMailordner = db.OpenRecordset(&quot;SELECT * FROM tblMailordner&quot;, dbOpenDynaset)\r\n    If Len(strZielordner) &gt; 0 Then\r\n         Set objZielordner = GetFolder(objOutlook, strZielordner, True)\r\n    End If\r\n    Set rstMails = db.OpenRecordset(&quot;tblKommunikation&quot;, dbOpenDynaset)\r\n    If Len(strKategorie) &gt; 0 Then\r\n         If KategoriePruefen(objOutlook, strKategorie) = False Then\r\n            MsgBox &quot;Richten Sie zun&auml;chst die Kategorie ''&quot; &amp; strKategorie &amp; &quot;'' unter Outlook ein.&quot;\r\n            Exit Sub\r\n        End If\r\n    End If\r\n    Do While Not rstMailordner.EOF\r\n         strMailordner = rstMailordner!Mailordner\r\n        Set objFolder = GetFolder(objOutlook, strMailordner, False)\r\n        For i = objFolder.Items.Count To 1 Step -1\r\n            Set obj = objFolder.Items(i)\r\n            If TypeName(obj) = &quot;MailItem&quot; Then\r\n                Set objMail = obj\r\n                strEmail_From = objMail.SenderEmailAddress\r\n                strEMail_To = Replace(objMail.To, &quot;''&quot;, &quot;&quot;)\r\n                lngKundeID = Nz(DLookup(&quot;KundeID&quot;, &quot;tblEmailadressen&quot;, &quot;(EMailadresse = ''&quot; _\r\n                    &amp; strEmail_From &amp; &quot;'' OR EMailadresse = ''&quot; &amp; strEMail_To &amp; &quot;'') AND KundeID IS NOT NULL&quot;), 0)\r\n                If lngKundeID &gt; 0 And Einlesen(objMail, strZielordner, strKategorie) Then\r\n                    With rstMails\r\n                    .AddNew\r\n                    !EMail_From = strEmail_From\r\n                    !EMail_To = strEMail_To\r\n                    !Betreff = Replace(objMail.Subject, &quot;''&quot;, &quot;''''&quot;)\r\n                    !Inhalt = Replace(objMail.Body, &quot;''&quot;, &quot;''''&quot;)\r\n                    !DatumZeit = objMail.SentOn\r\n                    !KundeID = lngKundeID\r\n                    !EntryID = objMail.EntryID\r\n                    If Len(strKategorie) &gt; 0 Then\r\n                        objMail.Categories = objMail.Categories &amp; &quot;;&quot; &amp; strKategorie\r\n                    End If\r\n                    objMail.Save\r\n                    If Not objZielordner Is Nothing Then\r\n                        objMail.Move objZielordner\r\n                    End If\r\n                    .Update\r\n                    End With\r\n                End If\r\n            End If\r\n        Next i\r\n        rstMailordner.MoveNext\r\n    Loop\r\n    Set objOutlook = Nothing\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p><!--30percent--><\/p>\n<p>Wenn Sie beispielsweise die aktuell mit dem Formular <b>frmMailordnerTree <\/b>festgelegten und in der Tabelle <b>tblMailordner <\/b>gespeicherten Verzeichnisse nach E-Mails durchforsten wollen, deren Empf&auml;nger oder Absender in der Tabelle <b>tblEMailAdressen <\/b>enthalten ist, verwenden Sie beispielsweise den folgenden Aufruf. Dabei geben Sie als ersten Parameter das Zielverzeichnis an, in das die eingelesenen E-Mails verschoben werden sollen, und als zweiten Parameter die Kategorie, mit der diese versehen werden sollen:<\/p>\n<pre>Public Sub EMailsEinlesen_Test()\r\n    EMailsEinlesen &quot;\\\\Outlook\\Posteingang\\Test&quot;, &quot;Eingelesen&quot;\r\nEnd Sub<\/pre>\n<p>Die Prozedur <b>EMailsEinlesen <\/b>legt zun&auml;chst ein Objekt zum Speichern einer Referenz auf eine Outlook-Instanz und eines mit einem Verweis auf die aktuelle Datenbank an. Dann &ouml;ffnet sie eine Datensatzgruppe, die alle Datens&auml;tze der Tabelle <b>tblMailOrdner <\/b>einliest &#8211; diese enth&auml;lt alle Verzeichnisse, deren E-Mails gepr&uuml;ft und gegebenenfalls eingelesen werden sollen.<\/p>\n<p>Sie k&ouml;nnen sowohl den Parameter <b>strZielordner <\/b>als auch <b>strKategorie <\/b>weglassen. Falls Sie keinen Zielordner angeben, werden die eingelesenen E-Mails schlicht nicht verschoben. Sollten Sie keine Kategorie angeben, tr&auml;gt die Prozedur keine Kategorie zum Kennzeichnen der bereits eingelesenen E-Mails ein.<\/p>\n<p>Beides wegzulassen ist ung&uuml;nstig &#8211; die Prozedur kann einmal eingelesene E-Mails so nicht erkennen und liest diese einfach nochmals ein. Geben Sie also zumindest f&uuml;r einen der beiden Parameter einen Wert an.<\/p>\n<p>Wenn <b>strZielordner <\/b>angegeben wurde, ruft die Prozedur die Funktion <b>GetFolder <\/b>auf. Diese pr&uuml;ft das Vorhandensein des Ordners und legt diesen gegebenenfalls an &#8211; mehr dazu weiter unten.<\/p>\n<p>Als Ergebnis landet ein Verweis auf den Zielordner in der Variablen <b>objZielordner<\/b>.<\/p>\n<p>Anschlie&szlig;end &ouml;ffnet die Prozedur ein Recordset auf Basis der Tabelle <b>tblKommunikation<\/b>, in der schlie&szlig;lich die Daten der jeweiligen E-Mails landen sollen. Bevor es richtig losgeht, pr&uuml;ft die Prozedur noch, ob im Falle der Verwendung einer Kategorie zum Markieren der eingelesenen Mails die ben&ouml;tigte Kategorie bereits angelegt ist. Dies erledigt die Prozedur <b>KategoriePruefen <\/b>(siehe weiter unten). Ist die Kategorie noch nicht vorhanden, muss der Benutzer diese zun&auml;chst manuell anlegen.<\/p>\n<p>Wird keine Kategorie ben&ouml;tigt oder ist diese vorhanden, steigt die Prozedur in die Abarbeitung der ausgew&auml;hlten Quellordner von Outlook ein. Dazu durchl&auml;uft sie alle Datens&auml;tze des Recordsets <b>rstMailordner <\/b>in einer <b>Do While<\/b>-Schleife.<\/p>\n<p>Die Variable <b>strMailordner <\/b>nimmt den Namen des Ordners auf und k&uuml;rzt die vorn zu findenden Backslash-Zeichen weg (<b>\\\\<\/b>). Die Funktion <b>GetFolder <\/b>liefert schlie&szlig;lich einen Verweis auf das entsprechende <b>Folder<\/b>-Objekt zu diesem Ordner.<\/p>\n<p>Hier beginnt das Abarbeiten aller im Verzeichnis enthaltenen Elemente, und zwar innerhalb einer <b>For&#8230;Next<\/b>-Schleife &uuml;ber die Anzahl der enthaltenen Elemente bis zum Wert <b>1 <\/b>mit einer Schrittweite von <b>-1<\/b>. Die &uuml;blicherweise zum Durchlaufen von Auflistungen verwendete <b>For Each<\/b>-Schleife k&ouml;nnte in diesem Fall Probleme machen, da die eingelesenen Mail-Elemente ja gegebenenfalls in einen anderen Ordner verschoben werden und somit die Indizes verschieben.<\/p>\n<p>Das jeweilige Element mit dem Index <b>i <\/b>wird mit der Objektvariablen <b>obj <\/b>referenziert. Die Funktion <b>TypeName <\/b>pr&uuml;ft, ob das Objekt den Typ <b>MailItem <\/b>aufweist. In diesem Fall setzt die Prozedur das Einlesen fort, indem sie das Mail-Objekt mit der Objektvariablen <b>objMail <\/b>referenziert. Dieses bietet gegen&uuml;ber der Variablen <b>obj <\/b>vom Typ <b>Object <\/b>den Vorteil, dass die Eigenschaften des Mail-Objekts per IntelliSense angesprochen werden k&ouml;nnen.<\/p>\n<p>Die Prozedur speichert nun den Absender und den Empf&auml;nger der E-Mail in den Variablen <b>strEMail_From <\/b>und <b>strEMail_To<\/b>. Der Absender wird mit der Eigenschaft <b>SenderEMailAdress <\/b>ermittelt, der Empf&auml;nger mit der <b>To<\/b>-Eigenschaft.<\/p>\n<p>Ob die E-Mail &uuml;berhaupt eingelesen werden soll, h&auml;ngt nun davon ab, ob entweder die Absender- oder die Empf&auml;nger-Adresse in der Tabelle <b>tblEMailAdressen <\/b>gefunden wird. Dies pr&uuml;ft ein entsprechender Aufruf der <b>DLookup<\/b>-Funktion, die im Erfolgsfall den Wert des Feldes <b>KundeID <\/b>des gefundenen Datensatzes zur&uuml;ckgibt. Dieser landet schlie&szlig;lich in der Variablen <b>lngKundeID<\/b>. Die <b>DLookup<\/b>-Funktion pr&uuml;ft &uuml;brigens nur diejenigen Adressen der Tabelle <b>tblEMailAdressen<\/b>, die einem Kunden zugeordnet sind (die Eintr&auml;ge ohne Wert im Feld <b>KundeID <\/b>geh&ouml;ren ja dem Benutzer). Ist <b>lngKundeID <\/b>nicht <b>0 <\/b>und liefert die Funktion <b>Einlesen <\/b>den Wert <b>True<\/b>, wird die Mail eingelesen. Die Funktion <b>Einlesen <\/b>(s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-63-anchor\">Listing 2<\/a><\/span>) pr&uuml;ft zun&auml;chst, ob ein Zielverzeichnis f&uuml;r eingelesene E-Mails angegeben wurde oder ob die aktuell bearbeitete E-Mail anderenfalls bereits mit der angegebenen Kategorie versehen wurde. Dazu erwartet die Funktion einen Verweis auf die E-Mail, den Zielordner und die Kategorie als Parameter.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Pr&uuml;fen, ob eine E-Mail eingelesen werden soll<\/p>\n<pre>Public Function Einlesen(objMail As Outlook.MailItem, strZielordner As String, strKategorie As String) As Boolean\r\n    Dim i As Integer\r\n    If Len(strZielordner) &gt; 0 Then\r\n        Einlesen = True\r\n        Exit Function\r\n    Else\r\n        Einlesen = True\r\n        If Len(strKategorie) &gt; 0 Then\r\n            For i = LBound(Split(objMail.Categories, &quot;;&quot;)) To UBound(Split(objMail.Categories, &quot;;&quot;))\r\n                If Split(objMail.Categories, &quot;;&quot;)(i) = strKategorie Then\r\n                    Einlesen = False\r\n                    Exit Function\r\n                End If\r\n            Next i\r\n        End If\r\n    End If\r\nEnd Function<\/pre>\n<p>Ist in <b>strZielordner <\/b>ein Zielordner angegeben, werden eingelesene Elemente verschoben &#8211; es kann also davon ausgegangen werden, dass sich keine eingelesenen Elemente im betroffenen Ordner befinden. Ist kein Ordner angegeben, soll die Funktion f&uuml;r die mit <b>objMail<\/b> &uuml;bergebene E-Mail pr&uuml;fen, ob diese bereits mit der als Markierung f&uuml;r eingelesene E-Mails vorgesehenen Kategorie versehen wurde. Dazu durchl&auml;uft die Funktion alle Kategorien der E-Mail (meist sind keine vorhanden). Wird die entsprechende Kategorie nicht gefunden, wurde die E-Mail offensichtlich noch nicht eingelesen und die Funktion <b>Einlesen<\/b> gibt den Wert <b>True <\/b>zur&uuml;ck.<\/p>\n<p>Die Prozedur legt nun im Recordset <b>rstMails <\/b>einen neuen Datensatz an und tr&auml;gt die Werte f&uuml;r die Felder <b>EMail_From<\/b>, <b>EMail_To<\/b>, <b>Betreff, Inhalt<\/b>, <b>DatumZeit <\/b>und <b>KundeID <\/b>ein. Warum erledigen wir das per <b>AddNew <\/b>und nicht mit einer einfachen <b>INSERT INTO<\/b>-Aktionsabfrage Weil es vorkommen kann, dass der Inhalt der Mail l&auml;nger als 65.536 Zeichen ist. L&auml;ngere Zeichenketten k&ouml;nnen nur mit <b>AddNew<\/b>\/<b>Update <\/b>eingetragen werden, <b>INSERT INTO <\/b>w&uuml;rde hier einen Fehler ausl&ouml;sen.<\/p>\n<p>Wenn ein Wert f&uuml;r <b>strKategorie <\/b>angegeben wurde, tr&auml;gt die Prozedur die neue Kategorie f&uuml;r die Eigenschaft <b>Categories <\/b>an &#8211; zus&auml;tzlich zum bereits vorhandenen Eintrag und von diesem durch ein Semikolon getrennt. Damit sich Outlook diese &Atilde;&#8220;nderung merkt, m&uuml;ssen Sie anschlie&szlig;end die <b>Save<\/b>-Methode des E-Mail-Objekts aufrufen.<\/p>\n<p>Und sollte ein g&uuml;ltiger Zielordner angegeben und mit <b>objZielordner <\/b>referenziert worden sein, verschiebt die <b>Move<\/b>-Methode die E-Mail zum neuen Zielordner. Die <b>Update<\/b>-Methode speichert die Daten des neuen Datensatzes und die <b>MoveNext<\/b>-Methode springt zum folgenden Datensatz.<\/p>\n<p>Dies wird so lange wiederholt, bis die Abbruchbedingung <b>.EOF <\/b>der <b>Do While<\/b>-Schleife den Wert <b>True <\/b>liefert.<\/p>\n<p>Nun schauen wir uns noch die beiden weiteren von dieser Prozedur aufgerufenen Funktionen an.<\/p>\n<p><b>Folder-Objekte holen oder erstellen<\/b><\/p>\n<p>Die Funktion <b>GetFolder <\/b>aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-64-anchor\">Listing 3<\/a><\/span> erwartet drei Parameter:<\/p>\n<p class=\"listingueberschrift\">Listing 3: Holen und\/oder Anlegen eines Verweises auf einen Ordner<\/p>\n<pre>Public Function GetFolder(objOutlook As Outlook.Application, strFolder As String, _\r\n        bolCreate As Boolean) As Outlook.MAPIFolder\r\n    Dim i As Integer\r\n    Dim objFolder As Outlook.MAPIFolder\r\n    Dim objFolderTemp As Outlook.MAPIFolder\r\n    On Error Resume Next\r\n    strFolder = Mid(strFolder, 3)\r\n    Set objFolder = objOutlook.GetNamespace(&quot;MAPI&quot;).Folders.Item(Left(strFolder, InStr(1, strFolder, &quot;\\&quot;) - 1))\r\n    For i = LBound(Split(strFolder, &quot;\\&quot;)) + 1 To UBound(Split(strFolder, &quot;\\&quot;))\r\n        Set objFolderTemp = Nothing\r\n        Set objFolderTemp = objFolder.Folders.Item(Split(strFolder, &quot;\\&quot;)(i))\r\n        If objFolderTemp Is Nothing Then\r\n            If bolCreate = True Then\r\n                Set objFolder = objFolder.Folders.Add(Split(strFolder, &quot;\\&quot;)(i))\r\n            End If\r\n        Else\r\n            Set objFolder = objFolderTemp\r\n        End If\r\n    Next i\r\n    Set GetFolder = objFolder\r\nEnd Function<\/pre>\n<ul>\n<li class=\"aufz-hlung\"><b>objOutlook<\/b>: Verweis auf die Outlook-Instanz<\/li>\n<li class=\"aufz-hlung\"><b>strFolder<\/b>: Name des zu holenden oder zu erstellenden Outlook-Ordners<\/li>\n<li class=\"aufz-hlung\"><b>bolCreate<\/b>: Parameter, der angibt, ob nicht vorhandene Ordner angelegt werden sollen<\/li>\n<\/ul>\n<p>Die Funktion schneidet zun&auml;chst die beiden Backslash-Zeichen zu Beginn des mit <b>strFolder <\/b>&uuml;bergebenen Verzeichnisses ab und speichert das Ergebnis wiederum in der Variablen <b>strFolder<\/b>. Aus<\/p>\n<pre>\\\\Outlook\\Posteingang\\Test<\/pre>\n<p>wird so folgender Wert:<\/p>\n<pre>Outlook\\Posteingang\\Test<\/pre>\n<p>Dann ermittelt sie mit der <b>InStr<\/b>-Funktion die Position des n&auml;chsten Backslash-Zeichens von links aus gesehen und ermittelt den Ausdruck links von dieser Position, in diesem Beispiel <b>Outlook<\/b>. Dieser Ordner wird schlie&szlig;lich mit <b>objFolder <\/b>referenziert.<\/p>\n<p>Dann durchl&auml;uft die Prozedur alle verbleibenden Elemente, die durch Backslash-Zeichen getrennt sind. Dazu erzeugt sie zun&auml;chst mit der <b>Split<\/b>-Funktion entsprechende Arrays, &uuml;ber deren mit <b>LBound <\/b>und <b>UBound <\/b>ermittelte Array-Grenzen dann eine <b>For&#8230;Next<\/b>-Schleife ausgef&uuml;hrt wird. Innerhalb der Schleife greift dann eine Anweisung &uuml;ber den Index <b>i <\/b>auf das jeweilige Element zu. Mit der Variablen <b>objFolderTemp <\/b>referenziert die Prozedur dann das unterhalb von <b>objFolder <\/b>liegende Objekt mit dem aus dem Array ermittelten Namen (hier erst <b>Posteingang <\/b>und dann <b>Test<\/b>).<\/p>\n<p>Sollte eines der per String &uuml;bergebenen Verzeichnisse nicht vorhanden sein, bleibt <b>objFolderTemp <\/b>leer. Dies wird in der folgenden <b>If&#8230;Then<\/b>-Bedingung gepr&uuml;ft. Ist <b>objFolderTemp <\/b>leer und hat <b>bolCreate <\/b>den Wert <b>True<\/b>, erstellt die Prozedur das Unterverzeichnis in Outlook neu.<\/p>\n<p>Dies erledigt die Prozedur mit der <b>Add<\/b>-Methode der <b>Folders<\/b>-Auflistung des zuletzt referenzierten Outlook-Mailordners aus <b>objFolder<\/b>. Das Ergebnis landet wiederum in <b>objFolder<\/b>, das nach dem Ermitteln oder Erstellen aller Ordner als R&uuml;ckgabewert der Funktion festgelegt wird.<\/p>\n<p><b>Pr&uuml;fen, ob eine bestimmte Kategorie in Outlook angelegt wurde<\/b><\/p>\n<p>Wenn Sie die eingelesenen Mails nicht in ein anderes Verzeichnis verschieben, k&ouml;nnen Sie diese mit einer Kategorie versehen, um diese sp&auml;ter als bereits eingelesen zu erkennen.<\/p>\n<p>Diese Kategorie muss jedoch zun&auml;chst einmal vorhanden sein. Um dies zu pr&uuml;fen, verwendet die Prozedur <b>EMailsEinlesen <\/b>die Funktion <b>KategoriePruefen<\/b> (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-65-anchor\">Listing 4<\/a><\/span>). Diese Funktion erwartet zwei Parameter:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>objOutlook<\/b>: Verweis auf die Outlook-Instanz<\/li>\n<li class=\"aufz-hlung\"><b>strKategorie<\/b>: Name der zu pr&uuml;fenden Kategorie<\/li>\n<\/ul>\n<p class=\"listingueberschrift\">Listing 4: Pr&uuml;fen, ob eine bestimmte Kategorie in Outlook vorhanden ist<\/p>\n<pre>Public Function KategoriePruefen(objOutlook As Outlook.Application, strKategorie As String) As Boolean\r\n    Dim objNamespace As Outlook.NameSpace\r\n    Dim i As Integer\r\n    Set objNamespace = objOutlook.GetNamespace(&quot;MAPI&quot;)\r\n    For i = 1 To objNamespace.Categories.Count\r\n        If objNamespace.Categories(i).Name = strKategorie Then\r\n            KategoriePruefen = True\r\n            Exit Function\r\n        End If\r\n    Next i\r\nEnd Function<\/pre>\n<p>Die Prozedur durchl&auml;uft alle Elemente der Auflistung <b>Categories <\/b>des MAPI-Namespace von Outlook. Dies geschieht nicht in einer <b>For Each<\/b>-Schleife, sondern in einer <b>For&#8230;Next<\/b>-Schleife &uuml;ber die Werte von <b>1 <\/b>bis zur Anzahl der Elemente der Auflistung <b>Categories<\/b>.<\/p>\n<p>Ist die mit <b>strKategorie <\/b>&uuml;bergebene Kategorie vorhanden, liefert die Funktion den Wert <b>True <\/b>zur&uuml;ck.<\/p>\n<p><b>Benutzeroberfl&auml;che zum Einlesen von E-Mails<\/b><\/p>\n<p>Nun fehlt noch eine einigerma&szlig;en ergonomische Bedienoberfl&auml;che, um das Einlesen der E-Mails zu starten. Diese sieht zun&auml;chst wie in Bild 9 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic013.png\" alt=\"pic013.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Formular zum Steuern des Einlesevorgangs<\/span><\/b><\/p>\n<p>Das Formular dient der Auswahl der Parameter f&uuml;r die Prozedur <b>EMailsEinlesen <\/b>und ruft diese per Schaltfl&auml;che auf.<\/p>\n<p>Der Parameter <b>Zielordner <\/b>soll in das Textfeld <b>txtZielordner <\/b>eingetragen werden. Als Hilfe finden Sie rechts von diesem Textfeld eine Schaltfl&auml;che namens <b>cmdOrdnerauswaehlen<\/b>, die per Mausklick die folgende Prozedur ausl&ouml;st:<\/p>\n<pre>Private Sub cmdOrdnerAuswaehlen_Click()\r\n    Me!txtZielordner = OrdnerAuswaehlen.FolderPath\r\nEnd Sub<\/pre>\n<p>Diese wiederum ruft die Funktion <b>OrdnerAuswaehlen<\/b> aus Bild 10 und liefert den Pfad des ausgew&auml;hlten Verzeichnisses zur&uuml;ck.<\/p>\n<p class=\"listingueberschrift\">Listing 5: Ausw&auml;hlen eines Outlook-Ordners<\/p>\n<pre>Public Function OrdnerAuswaehlen() As Outlook.Folder\r\n    Dim objOutlook As Outlook.Application\r\n    Dim objFolder As Outlook.Folder\r\n    Set objOutlook = New Outlook.Application\r\n    Set objFolder = objOutlook.GetNamespace(&quot;MAPI&quot;).PickFolder\r\n    If Not objFolder Is Nothing Then\r\n        Set OrdnerAuswaehlen = objFolder\r\n    End If\r\nEnd Function<\/pre>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic014.png\" alt=\"pic014.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Ausw&auml;hlen eines Outlook-Ordners<\/span><\/b><\/p>\n<p><b>Kategorien zur Auswahl bereitstellen<\/b><\/p>\n<p>Das Kombinationsfeld <b>cboKategorieFuerEingeleseneMails <\/b>soll alle in Outlook verf&uuml;gbaren Kategorien zur Auswahl bereitstellen. Dazu stellen Sie zun&auml;chst die Eigenschaft <b>Herkunftsart <\/b>auf <b>Wertliste <\/b>ein.<\/p>\n<p>Dann weisen Sie per VBA in der Ereignisprozedur, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird, die Datensatzherkunft des Kombinationsfeldes zu. Die Prozedur <b>Form_Load <\/b>aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-69-anchor\">Listing 6<\/a><\/span> erzeugt zun&auml;chst eine Outlook-Instanz beziehungsweise referenziert eine existierende Instanz mit der Variablen <b>objOutlook<\/b>. Dann durchl&auml;uft die Prozedur alle Elemente der Auflistung <b>Categories <\/b>des MAPI-Namespaces von Outlook und f&uuml;gt mit jedem Durchlauf einer <b>For&#8230;Next<\/b>-Schleife eine weitere Kategorie zur String-Variablen <b>strKategorien <\/b>hinzu &#8211; getrennt durch ein Semikolon. Nach dem Einlesen aller Kategorien weist die Prozedur die Variable <b>strKategorien <\/b>der Eigenschaft <b>RowSource <\/b>des Kombinationsfeldes zu.<\/p>\n<p class=\"listingueberschrift\">Listing 6: F&uuml;llen der Kategorien beim Laden des Formulars<\/p>\n<pre>Private Sub Form_Load()\r\n    Dim objOutlook As Outlook.Application\r\n    Dim i As Integer\r\n    Dim strKategorien As String\r\n    Set objOutlook = New Outlook.Application\r\n    For i = 1 To objOutlook.GetNamespace(&quot;MAPI&quot;).Categories.Count\r\n        strKategorien = strKategorien &amp; objOutlook.GetNamespace(&quot;MAPI&quot;).Categories(i) &amp; &quot;;&quot;\r\n    Next i\r\n    Me!cboKategorieFuerEingeleseneMails.RowSource = strKategorien\r\nEnd Sub<\/pre>\n<p>Nun sollten die in die beiden Steuerelemente eingegebenen Daten auch noch gespeichert werden, damit der Benutzer diese nur einmal eingeben muss.<\/p>\n<p>Kein Problem: Sie f&uuml;gen einfach der Tabelle <b>tblOptionen <\/b>zwei Textfelder namens <b>Zielordner <\/b>und <b>KategorieFuerEingeleseneMails <\/b>hinzu, stellen die Eigenschaft <b>Datenherkunft <\/b>des Formulars auf diese Tabelle ein und die Eigenschaft <b>Steuerelementinhalt <\/b>der beiden Steuerelemente auf die entsprechenden Felder (s. Bild 11).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic015.png\" alt=\"pic015.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 11: Das Formular frmMailsEinlesen ist an die Tabelle tblOptionen gebunden.<\/span><\/b><\/p>\n<p>Nun fehlt noch die Schaltfl&auml;che zum Starten des Einlesevorgangs. Diese hei&szlig;t <b>cmdEMailsEinlesen <\/b>und l&ouml;st die folgende Prozedur aus:<\/p>\n<pre>Private Sub cmdEMailsEinlesen_Click()\r\n    Nz(EMailsEinlesen Me!txtZielordner), Nz(Me!cboKategorieFuerEingeleseneMails)\r\nEnd Sub<\/pre>\n<p>Dabei &uuml;bergibt sie die Werte der beiden Textfelder an die entsprechenden Parameter der Prozedur <b>EMailsEinlesen<\/b>.<\/p>\n<p><b>Quellordner ausw&auml;hlen<\/b><\/p>\n<p>Im ersten Teil der Beitragsreihe haben wir bereits ein Formular erstellt, mit dem Sie die beim Einlesen zu ber&uuml;cksichtigenden Outlook-Ordner festlegen k&ouml;nnen. Dieses soll der Benutzer mit einer Schaltfl&auml;che vom Formular <b>frmEMailsEinlesen <\/b>&ouml;ffnen k&ouml;nnen. Dazu legen Sie eine Schaltfl&auml;che namens <b>cmdQuellordnerAusw&auml;hlen <\/b>an und f&uuml;gen dieser die folgende Ereignisprozedur hinzu:<\/p>\n<pre>Private Sub cmdQuellordnerAuswaehlen_Click()\r\n    DoCmd.OpenForm &quot;frmMailordnerTree&quot;\r\nEnd Sub<\/pre>\n<p>Wenn der Benutzer die Auswahl &auml;ndert, wird diese gleich beim n&auml;chsten Einlesen angewendet.<\/p>\n<p><b>Kategorien zur&uuml;cksetzen<\/b><\/p>\n<p>Beim Experimentieren mit der Beispieldatenbank ist es oft passiert, dass E-Mails zu Kategorien hinzugef&uuml;gt wurden, aber wieder entfernt werden sollten. Da dies bei mehreren hundert E-Mails von Hand etwas aufwendig ist, schien das Erstellen einer kleinen Hilfsprozedur sinnvoll zu sein. Den Aufruf dieser Prozedur packen Sie ebenfalls in eine Schaltfl&auml;che im Formular <b>frmEMailsEinlesen<\/b>. Die Schaltfl&auml;che hei&szlig;t <b>cmdKategoriezuweisungEntfernen <\/b>und l&ouml;st die Prozedur <b>KategorienEntfernen <\/b>aus:<\/p>\n<pre>Private Sub cmdKategoriezuweisungEntfernen_Click()\r\n    KategorienEntfernen Me!cboKategorieFuerEingeleseneMails\r\nEnd Sub<\/pre>\n<p>Die hier aufgerufene Prozedur <b>KategorieEntfernen<\/b> finden Sie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-71-anchor\">Listing 7<\/a><\/span>. Die Prozedur erstellt zun&auml;chst ein Recordset auf Basis der Tabelle <b>tblMailordner <\/b>und durchl&auml;uft alle zu ber&uuml;cksichtigenden Outlook-Mailordner in einer <b>Do While<\/b>-Schleife.<\/p>\n<p class=\"listingueberschrift\">Listing 7: Entfernen von E-Mails aus einer Kategorie<\/p>\n<pre>Public Sub KategorienEntfernen(strKategorie As String)\r\n    Dim db As DAO.Database\r\n    Dim rstMailordner As DAO.Recordset\r\n    Dim objFolder As Outlook.MAPIFolder\r\n    Dim obj As Object\r\n    Dim objMail As Outlook.MailItem\r\n    Dim objOutlook As Outlook.Application\r\n    Dim strMailordner As String\r\n    Set objOutlook = New Outlook.Application\r\n    Set db = CurrentDb\r\n    Set rstMailordner = db.OpenRecordset(&quot;SELECT * FROM tblMailordner&quot;, dbOpenDynaset)\r\n    Do While Not rstMailordner.EOF\r\n         strMailordner = rstMailordner!Mailordner\r\n        Set objFolder = GetFolder(objOutlook, strMailordner, False)\r\n        For Each obj In objFolder.Items\r\n            If TypeName(obj) = &quot;MailItem&quot; Then\r\n                Set objMail = obj\r\n                objMail.Categories = Replace(objMail.Categories, strKategorie, &quot;&quot;)\r\n                objMail.Save\r\n            End If\r\n        Next obj\r\n        rstMailordner.MoveNext\r\n    Loop\r\n    Set objOutlook = Nothing\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Dabei holt sie sich einen Verweis auf das zum Namen des Mailordners passende <b>Folder<\/b>-Objekt und durchl&auml;uft alle enthaltenen Objekte. Handelt es sich bei dem Objekt um eines vom Typ <b>MailItem<\/b>, ersetzt es den Namen der betroffenen Kategorie in der Eigenschaft <b>Categories <\/b>dieser Mail durch eine leere Zeichenkette. Es k&ouml;nnte zu Problemen kommen, wenn Sie zum Markieren der eingelesenen E-Mails eine Kategorie verwenden, deren Name im Namen einer oder mehrerer weiterer Kategorien enthalten ist. Diese w&uuml;rden dann um die entsprechende Zeichenkette beschnitten. Dies m&uuml;ssen Sie jedoch nur ber&uuml;cksichtigen, wenn Sie ohnehin viel mit Kategorien arbeiten.<\/p>\n<p><b>Kunden und Kommunikation anzeigen<\/b><\/p>\n<p>Nun m&uuml;ssen wir noch das Formular zur Anzeige der Kundendetails mit der Tabelle <b>tblKommunikation<\/b> und den darin passend zum jeweiligen Kunden gespeicherten E-Mails verdrahten. Um die Arbeiten am Formular <b>frmEMailsEinlesen <\/b>abzuschlie&szlig;en, f&uuml;gen Sie hier noch eine Schaltfl&auml;che ein, welche das Formular <b>frmKundeDetail <\/b>&ouml;ffnet &#8211; und zwar mit folgender Ereignisprozedur:<\/p>\n<pre>Private Sub cmdKundendetails_Click()\r\n    DoCmd.OpenForm &quot;frmKundeDetail&quot;\r\nEnd Sub<\/pre>\n<p>Danach erweitern wir das Formular <b>frmKundeDetail <\/b>um ein Listenfeld, das alle zum aktuellen Kunden passenden E-Mails anzeigt.<\/p>\n<p>Das Listenfeld soll folgende wichtige Informationen enthalten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Datum der E-Mail<\/li>\n<li class=\"aufz-hlung\">Betreff der E-Mail<\/li>\n<li class=\"aufz-hlung\">Wer hat die E-Mail gesendet &#8211; der Benutzer selbst oder der Kunde<\/li>\n<\/ul>\n<p>Gerade die letzte Information ist interessant. In der E-Mail-Liste unter Outlook k&ouml;nnen Sie den Absender und den Empf&auml;nger anzeigen lassen. Dort sind aber auch beide Informationen wichtig, denn dort landen ja in der Regel auch E-Mails aller Kommunikationspartner.<\/p>\n<p>Das Listenfeld, das die Kommunikation mit dem aktuell im Formular angezeigten Kunden liefern soll, enth&auml;lt nur E-Mails, die entweder von Ihnen an den Kunden oder vom Kunden an Sie versendet wurden. Das hei&szlig;t, dass Sie grunds&auml;tzlich nur wissen m&uuml;ssen, ob die Mail von Ihnen oder vom Kunden stammt. Dazu k&ouml;nnten Sie beispielsweise eine eigene Spalte reservieren und dort einen der beiden Ausdr&uuml;cke <b>Kunde <\/b>und <b>Ich <\/b>eintragen. Noch platzsparender ist es jedoch, wenn Sie die Betreffzeile der E-Mails des Kunden normal darstellen und die Betreffzeilen Ihrer eigenen E-Mails etwas einr&uuml;cken &#8211; beispielsweise um vier Zeichen.<\/p>\n<p>Das Endergebnis soll wie in Bild 12 aussehen. Wir haben den Bereich zur Eingabe der E-Mail-Adressen eines Kunden rechts neben die Kundendaten verschoben und unten ein neues Listenfeld namens <b>lstKommunikation <\/b>eingerichtet. Das Listenfeld soll das Datum und den Betreff der E-Mails anzeigen. Rechts daneben liefert ein Textfeld den Inhalt der aktuell markierten E-Mail. Ein Klick auf eine andere E-Mail liefert den jeweiligen Inhalt. Ein Doppelklick auf einen Eintrag im Listenfeld soll die E-Mail im entsprechenden Outlook-Fenster &ouml;ffnen &#8211; zu diesem Zweck wurde die <b>EntryID <\/b>der jeweiligen E-Mail in der Tabelle <b>tblKommunikation <\/b>gespeichert.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic016.png\" alt=\"pic016.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12: Das Formular frmKundeDetail mit der Erweiterung zum Anzeigen der Kommunikation und der aktuell ausgew&auml;hlten E-Mail<\/span><\/b><\/p>\n<p><b>Datenherkunft des Listenfeldes<\/b><\/p>\n<p>Das Listenfeld <b>lstKommunikation <\/b>verwendet die Abfrage <b>qryFrmKundeDetail_lstKommunikation <\/b>als Datensatzherkunft. Diese wird jedoch noch in Abh&auml;ngigkeit vom jeweiligen Kunden gefiltert &#8211; dazu sp&auml;ter mehr. Werfen wir zun&auml;chst einen Blick auf die Abfrage.<\/p>\n<p>Diese sieht wie in Bild 13 aus und enth&auml;lt die Tabelle <b>tblKommunikation <\/b>als Datenquelle. Neben den Feldern <b>KommunikationID<\/b>, <b>DatumZeit<\/b>, <b>KundeID <\/b>und <b>EntryID <\/b>enth&auml;lt sie ein berechnetes Feld mit folgendem Ausdruck:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic017.png\" alt=\"pic017.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 13: Diese Abfrage dient als Basis der Datenherkunft des Listenfeldes lstKommunikation.<\/span><\/b><\/p>\n<pre>Betreffzeile: Wenn(IstNull(DomWert(&quot;EMailAdresse&quot;;&quot;tblEMailAdressen&quot;;&quot;KundeID IS NULL AND EMailAdresse=''&quot; &amp; [Email_From] &amp; &quot;''&quot;));&quot;&quot;;&quot; &quot;) &amp; [Betreff]<\/pre>\n<p>Dieser Ausdruck pr&uuml;ft, ob es in der Tabelle <b>tblEMailAdressen <\/b>einen Eintrag gibt, dessen <b>KundeID <\/b>nicht <b>Null <\/b>ist (was nur bei den E-Mail-Adressen des Benutzers der Fall sein sollte) und dessen Feld <b>EMailAdresse <\/b>mit der Absenderadresse des jeweiligen Datensatzes &uuml;bereinstimmt.<\/p>\n<p>Wenn diese Bedingung wahr ist, liefert die umschlie&szlig;ende <b>Wenn<\/b>-Bedingung eine leere Zeichenkette zur&uuml;ck, sonst eine Zeichenkette mit vier Leerzeichen. Diese Leerzeichen sorgen f&uuml;r die gew&uuml;nschte Einr&uuml;ckung. An die leere Zeichenkette oder die vier Leerzeichen h&auml;ngt der berechnete Ausdruck noch den eigentlichen Betreff der E-Mail an.<\/p>\n<p>Damit das Listenfeld <b>lstKommunikation <\/b>nur die beiden Felder <b>DatumZeit <\/b>und <b>Betreffzeile <\/b>anzeigt, das Prim&auml;rschl&uuml;sselfeld und die beiden &uuml;brigen Felder <b>KundeID <\/b>und <b>EntryID <\/b>jedoch nicht, stellen Sie die beiden Eigenschaften <b>Spaltenanzahl <\/b>und <b>Spaltenbreiten <\/b>auf die Werte <b>5 <\/b>und <b>0cm;3cm;7cm;0cm;0cm <\/b>ein.<\/p>\n<p>Damit das Listenfeld seine Datens&auml;tze entsprechend dem aktuellen Kunden im Hauptformular filtert, erweitern Sie die Prozedur, die durch das Ereignis <b>Beim Anzeigen <\/b>ausgel&ouml;st wird, wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-74-anchor\">Listing 8<\/a><\/span>.<\/p>\n<p class=\"listingueberschrift\">Listing 8: Aktualisieren der Liste der E-Mails f&uuml;r den aktuellen Kunden<\/p>\n<pre>Private Sub Form_Current()\r\n    Me!cboStandardEMailID.RowSource = _\r\n        &quot;SELECT EMailAdresseID, EMailAdresse FROM tblEMailAdressen WHERE KundeID = &quot; &amp; Me!KundeID\r\n    Me!lstKommunikation.RowSource = _\r\n        &quot;SELECT * FROM qryfrmKundeDetail_lstKommunikation WHERE KundeID = &quot; &amp; Me!KundeID\r\n    Me!lstKommunikation = Me!lstKommunikation.ItemData(0)\r\n    lstKommunikation_AfterUpdate\r\nEnd Sub<\/pre>\n<p>Die zweite Anweisung dieser Prozedur stellt die Datensatzherkunft des Listenfeldes auf die Abfrage <b>qryfrmKundeDetail_lstKommunikation<\/b>, wobei diese noch nach dem aktuellen Wert von <b>KundeID <\/b>gefiltert wird. Die dritte Anweisung markiert den ersten Eintrag des Listenfeldes, die vierte ruft die gleich im Anschluss beschriebene Ereignisprozedur auf, um den Inhalt der Mail des aktuell markierten Datensatzes anzuzeigen.<\/p>\n<p>Damit das Textfeld <b>txtMail <\/b>mit dem Inhalt der aktuell im Listenfeld ausgew&auml;hlten E-Mail gef&uuml;llt wird, f&uuml;gen Sie dem Listenfeld eine Ereignisprozedur hinzu, die durch das Ereignis <b>Nach Aktualisierung <\/b>ausgel&ouml;st wird und wie folgt aussieht:<\/p>\n<pre>Private Sub lstKommunikation_AfterUpdate()\r\n    Me!txtMail = DLookup(&quot;Inhalt&quot;, &quot;tblKommunikation&quot;, &quot;KommunikationID = &quot;&amp; Nz(Me!lstKommunikation.Column(0),0))\r\nEnd Sub<\/pre>\n<p>Fehlt noch das &Ouml;ffnen einer E-Mail per Doppelklick. Dazu f&uuml;gen Sie dem Listenfeld eine Ereignisprozedur f&uuml;r das Ereignis <b>Beim Doppelklicken <\/b>hinzu (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-75-anchor\">Listing 9<\/a><\/span>). Diese referenziert zuerst eine vorhandene oder neu zu erstellende Outlook-Instanz und danach den MAPI-Namespace. Schlie&szlig;lich ermittelt sie mit der Funktion <b>GetItemFromID <\/b>unter Verwendung der in der f&uuml;nften Spalte des Listenfeldes enthaltenen <b>EntryID <\/b>einen Verweis auf die entsprechende E-Mail in Outlook und zeigt diese mit der <b>Display<\/b>-Methode an.<\/p>\n<p class=\"listingueberschrift\">Listing 9: &Ouml;ffnen einer E-Mail in Outlook<\/p>\n<pre>Private Sub lstKommunikation_DblClick(Cancel As Integer)\r\n    Dim objOutlook As Outlook.Application\r\n    Dim objMAPI As Outlook.NameSpace\r\n    Dim objMail As Outlook.MailItem\r\n    Set objOutlook = New Outlook.Application\r\n    Set objMAPI = objOutlook.GetNamespace(&quot;MAPI&quot;)\r\n    Set objMail = objMAPI.GetItemFromID(Me!lstKommunikation.Column(4))\r\n    objMail.Display\r\nEnd Sub<\/pre>\n<p>Durch die M&ouml;glichkeit der Anzeige der in die Datenbank eingelesenen E-Mails im entsprechenden Outlook-Fenster werden die &uuml;blichen E-Mail-Funktionen wie etwa zum Beantworten, Weiterleiten et cetera bereitgestellt. Au&szlig;erdem k&ouml;nnen Sie auf auf eventuell enthaltene Anh&auml;nge zugreifen, die beim Einlesen nicht ber&uuml;cksichtigt werden.<\/p>\n<p>Bild 14 zeigt eine in Outlook ge&ouml;ffnete, bereits eingelesene E-Mail. Dies erkennen Sie an dem gelben Balken, der die beim Einlesen zugewiesene Kategorie anzeigt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/Kundenkommunikation_2-web-images\/pic018.png\" alt=\"pic018.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 14: Anzeige einer bereits eingelesenen E-Mail im Outlook-Fenster<\/span><\/b><\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die in dieser Beitragsreihe beschriebenen Techniken geben Ihnen die M&ouml;glichkeit, E-Mails aus beliebigen Ordnern in Outlook in eine Tabelle der Datenbank einzulesen und die eingelesenen E-Mails durch Zuordnen zu einer bestimmten Kategorie zu markieren oder diese gleich in einen Ordner eingelesener E-Mails zu verschieben. Der Clou ist, dass hierbei nur solche E-Mails eingelesen werden, die von einem der in der Datenbank erfassten Kunden geschrieben oder empfangen wurden. Auf diese Weise k&ouml;nnen Sie innerhalb der Datenbank auf die komplette Kommunikation mit dem jeweiligen Kunden zugreifen.<\/p>\n<p>Zus&auml;tzlich erm&ouml;glicht die Datenbank das Verwalten einer oder mehrerer E-Mail-Adressen sowohl f&uuml;r den Benutzer selbst als auch f&uuml;r die Kunden, sodass auch E-Mails etwa von beruflichen oder privaten Absenderadressen erfasst werden k&ouml;nnen.<\/p>\n<p>Man k&ouml;nnte die L&ouml;sung noch erweitern, indem man das Einlesen der E-Mails nach Outlook verlegt. Dort lassen sich ab Version 2007 Ereignisse definieren, die durch eingehende und versendete E-Mails ausgel&ouml;st werden und diese gleich in die Datenbank &uuml;bertragen k&ouml;nnten.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Kundenkommunikation_2.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{07845907-DA25-4DD5-AD79-2289F893B484}\/aiu_878.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im ersten Teil dieser Beitragsreihe haben wir die Grundlagen geschaffen, um die E-Mails aus den verschiedenen Ordnern von Outlook zu importieren. Im zweiten Teil schauen wir uns das notwendige Datenmodell an und schreiten zur Tat: Die E-Mails aus den ausgew&auml;hlten Outlook-Ordnern sollen importiert und den einzelnen Kunden zugeordnet werden.<\/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":[66022013,662013,44000026],"tags":[],"class_list":["post-55000878","post","type-post","status-publish","format-standard","hentry","category-66022013","category-662013","category-Interaktiv"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Kundenkommunikation per E-Mail verwalten, Teil 2 - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kundenkommunikation per E-Mail verwalten, Teil 2\" \/>\n<meta property=\"og:description\" content=\"Im ersten Teil dieser Beitragsreihe haben wir die Grundlagen geschaffen, um die E-Mails aus den verschiedenen Ordnern von Outlook zu importieren. Im zweiten Teil schauen wir uns das notwendige Datenmodell an und schreiten zur Tat: Die E-Mails aus den ausgew&auml;hlten Outlook-Ordnern sollen importiert und den einzelnen Kunden zugeordnet werden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:35:03+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/56d6eb499ad74fc2a76827ccb5464a7f\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"32\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Kundenkommunikation per E-Mail verwalten, Teil 2\",\"datePublished\":\"2020-05-22T21:35:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/\"},\"wordCount\":5216,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/56d6eb499ad74fc2a76827ccb5464a7f\",\"articleSection\":[\"2\\\/2013\",\"2013\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/\",\"name\":\"Kundenkommunikation per E-Mail verwalten, Teil 2 - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/56d6eb499ad74fc2a76827ccb5464a7f\",\"datePublished\":\"2020-05-22T21:35:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/56d6eb499ad74fc2a76827ccb5464a7f\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/56d6eb499ad74fc2a76827ccb5464a7f\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenkommunikation_per_EMail_verwalten_Teil_2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kundenkommunikation per E-Mail verwalten, Teil 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Kundenkommunikation per E-Mail verwalten, Teil 2 - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/","og_locale":"de_DE","og_type":"article","og_title":"Kundenkommunikation per E-Mail verwalten, Teil 2","og_description":"Im ersten Teil dieser Beitragsreihe haben wir die Grundlagen geschaffen, um die E-Mails aus den verschiedenen Ordnern von Outlook zu importieren. Im zweiten Teil schauen wir uns das notwendige Datenmodell an und schreiten zur Tat: Die E-Mails aus den ausgew&auml;hlten Outlook-Ordnern sollen importiert und den einzelnen Kunden zugeordnet werden.","og_url":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:35:03+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/56d6eb499ad74fc2a76827ccb5464a7f","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"32\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Kundenkommunikation per E-Mail verwalten, Teil 2","datePublished":"2020-05-22T21:35:03+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/"},"wordCount":5216,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/56d6eb499ad74fc2a76827ccb5464a7f","articleSection":["2\/2013","2013","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/","url":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/","name":"Kundenkommunikation per E-Mail verwalten, Teil 2 - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/56d6eb499ad74fc2a76827ccb5464a7f","datePublished":"2020-05-22T21:35:03+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/56d6eb499ad74fc2a76827ccb5464a7f","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/56d6eb499ad74fc2a76827ccb5464a7f"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Kundenkommunikation_per_EMail_verwalten_Teil_2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Kundenkommunikation per E-Mail verwalten, Teil 2"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000878"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000878\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}