{"id":55000465,"date":"2025-04-01T00:00:00","date_gmt":"2025-07-02T14:49:28","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=465"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Microsoft_365_EMails_mit_Make_per_Klasse_senden","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Microsoft_365_EMails_mit_Make_per_Klasse_senden\/","title":{"rendered":"Microsoft 365 E-Mails mit Make per Klasse senden"},"content":{"rendered":"<p><b>In unserem Artikel Google Mail mit Make.com und VBA statt Outlook (www.vbentwickler.de\/464) haben wir detailliert gezeigt, wie man per VBA die Informationen zum Versenden einer E-Mail zusammenstellt und diese dann &uuml;ber den Automatisierungsdienst Make.com an Microsoft 365 E-Mail sendet. Hier sind wir allerdings nur so weit gekommen, dass wir die notwendige JSON-Datei mit den eigentlichen Daten der E-Mail Zeile f&uuml;r Zeile zusammengestellt und mit den n&ouml;tigen Daten gef&uuml;llt haben. F&uuml;r einen ersten Schritt nicht schlecht, aber wenn man diesen Weg professionell nutzen m&ouml;chte, sollte man sich dazu eine ordentliche Klasse bauen. Eine, die man schnell initialisieren und mit den Daten wie Empf&auml;nger, Betreff, Inhalt, CC\/BCC-Empf&auml;ngern und Anlagen f&uuml;llen kann und die eine einfache Send-Methode enth&auml;lt. Ganz genau so, wie es auch mit VBA und Outlook geht &#8211; mit dem Unterschied, dass die hier vorgestellte Methode vermutlich wesentlich bessere Chancen hat, die n&auml;chsten f&uuml;nf Jahre zu &uuml;berleben.<\/b><\/p>\n<p>Das Versenden von E-Mails per VBA k&ouml;nnte so einfach sein. Dazu ben&ouml;tigen wir lediglich eine Prozedur wie die aus Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>MailVersenden()\r\n     <span style=\"color:blue;\">Dim <\/span>objMail<span style=\"color:blue;\"> As <\/span>clsMail\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objMail = <span style=\"color:blue;\">New<\/span> clsMail\r\n     <span style=\"color:blue;\">With<\/span> objMail\r\n         .Subject = \"Testmail von Andr&eacute;\"\r\n         .ContentType = PlainText\r\n         .Body = \"Dies ist eine Test-E-Mail.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & \"Viele Gr&uuml;&szlig;e - Andr&eacute;\"\r\n         .AddToRecipient \"andre@minhorst.com\", \"Andr&eacute; Minhorst\"\r\n         .AddAttachmentPath CurrentProject.Path & \"\\test.pdf\"\r\n         <span style=\"color:blue;\">If <\/span>.Send(strResponse) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> strResponse\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> strResponse\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Einfacher Versand einer E-Mail per Klasse<\/span><\/b><\/p>\n<p>Hier erstellen wir ein neues <b>clsMail<\/b>-Objekt und f&uuml;llen es mit den f&uuml;r eine E-Mail ben&ouml;tigten Daten wie Empf&auml;nger, Betreff, Inhalt und Anlagen. Ein Aufruf der <b>Send<\/b>-Methode erledigt den Rest und die E-Mail landet im Postfach des angegebenen Empf&auml;ngers.<\/p>\n<p>Dazu brauchen wir allerdings noch ein wenig mehr &#8211; aber das ist nur einmal einzurichten und l&auml;uft dann, gegebenenfalls auch in all Deinen Anwendungen aufrufbar. Was wir noch ben&ouml;tigen:<\/p>\n<ul>\n<li>Ein Microsoft 365-Konto, &uuml;ber das Du auch E-Mails versenden kannst,<\/li>\n<li>ein Konto bei Make.com, um dieses Konto auf einfache Weise und ohne aufwendige Authentifizierung anzusteuern,<\/li>\n<li>eine Automation bei Make.com, die Deine zu versendenden Informationen entgegennimmt und sie an Microsoft 365 sendet und <\/li>\n<li>die hier vorgestellten VBA-Klassen, welche die Daten f&uuml;r Deine E-Mail im entsprechenden Format zusammenstellen und sie an Make.com schicken, damit dieses den Rest der Arbeit erledigt.<\/li>\n<\/ul>\n<p>Wie die ersten Schritte gelingen, zeigen wir Dir in den folgenden Artikeln. Danach stellen wir Dir ausf&uuml;hrlich die Ableitung einer Klasse daraus vor:<\/p>\n<ul>\n<li><b>Automation mit VBA und Make <\/b>(<b>www.vbentwickler.de\/463<\/b>)<\/li>\n<li><b>Google Mail mit Make.com und VBA statt Outlook <\/b>(<b>www.vbentwickler.de\/464<\/b>)<\/li>\n<\/ul>\n<p>Im ersten Artikel geht es um die Grundlagen zur Steuerung von Webprodukten wie Microsoft 365 et cetera mit Make.com. Der zweite Artikel zeigt, wie wir Make.com dazu nutzen, eine E-Mail &uuml;ber Microsoft 365 zu versenden. Dort lernst Du, wie Du eine entsprechende Automation zusammenstellst. Auf diese Automation bauen wir im vorliegenden Artikel auf.<\/p>\n<p>Die Automation besteht aus wenigen, einfachen Schritten. <b>Webhooks|Custom webhook <\/b>nimmt die Anfrage entgegen. Microsoft 365 Email liest die &uuml;bermittelten Daten aus und versendet die E-Mail. Das obere Response-Element sendet eine R&uuml;ckgabe, wenn die E-Mail erfolgreich versendet wurde, die untere eine R&uuml;ckgabe mit Informationen bez&uuml;glich auftretender Fehler (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_465_001.png\" alt=\"Diese Automation steuern wir &uuml;ber die hier vorgestellten Klassen an.\" width=\"700\" height=\"407,7622\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Diese Automation steuern wir &uuml;ber die hier vorgestellten Klassen an.<\/span><\/b><\/p>\n<h2>Ben&ouml;tigtes JSON-Dokument<\/h2>\n<p>Im Folgenden werden dazu zum Beispiel das JSON-Dokument zusammensetzen, das &uuml;ber den Webhook an Microsoft 365 gesendet wird, damit es von dort verschickt werden kann.<\/p>\n<p>Dies sieht f&uuml;r unseren Aufruf von oben wie in Listing 2 aus.<\/p>\n<pre>{\r\n   \"subject\": \"Testmail von Andr\\u00E9\",\r\n   \"body\": {\r\n     \"content\": \"Dies ist eine Test-E-Mail.\\r\\n\\r\\nViele Gr\\u00FC\\u00DFe - Andr\\u00E9\",\r\n     \"contentType\": \"text\"\r\n   },\r\n   \"toRecipients\": [\r\n     {\r\n       \"address\": \"andre@minhorst.com\",\r\n       \"name\": \"Andr\\u00E9 Minhorst To\"\r\n     }\r\n   ],\r\n   \"attachments\": [\r\n     {\r\n       \"filename\": \"test.pdf\",\r\n       \"data\": \"JVBERi0xLjYNJeLjz9MNCjE2IDAgb2J...\"\r\n     }\r\n   ],\r\n   \"importance\": \"Normal\"\r\n}<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: JSON-Dokument f&uuml;r das Versenden einer E-Mail<\/span><\/b><\/p>\n<p>Dieses Beispiel enth&auml;lt nur die wichtigsten Elemente. Wir k&ouml;nnten noch weitere To-Empf&auml;nger einf&uuml;gen, CC- und BCC-Empf&auml;nger, Reply-Adressen oder weitere Attachments.<\/p>\n<h2>Mapping der JSON-Daten im Make.com<\/h2>\n<p>Die so gelieferten Informationen k&ouml;nnen wir in Make.com wie in Bild 2 verarbeiten. Hier klicken wir einfach nur in eines der vorhandenen Eigenschaftsfelder und w&auml;hlen die im JSON-Dokument enthaltenen Informationen aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_465_002.png\" alt=\"Die Informationen aus dem JSON-Dokument k&ouml;nnen hier gemappt werden.\" width=\"424,6267\" height=\"767,1589\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die Informationen aus dem JSON-Dokument k&ouml;nnen hier gemappt werden.<\/span><\/b><\/p>\n<h2>Vorbereitungen<\/h2>\n<p>Da wir hier viel mit JSON-Dokumenten arbeiten werden, holen wir uns die beiden Module <b>mdlJSON <\/b>und <b>mdlJSONDOM <\/b>hinzu. Diese k&ouml;nnen wir zum Zusammenstellen und Parsen von JSON-Dokumenten nutzen.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir zwei Verweise auf die Bibliotheken <b>Microsoft XML, v6.0 <\/b>und <b>Microsoft Scripting Runtime<\/b>. Letztere steuert das in <b>mdlJSON <\/b>und <b>mdlJSONDOM <\/b>verwendete <b>Dictionary<\/b>-Element bei, das wir auch in der Klasse vermehrt einsetzen.<\/p>\n<h2>Klassenmodul erstellen<\/h2>\n<p>Die Hauptklasse unseres Projekts hei&szlig;t <b>clsMail<\/b>. Sie soll per IntelliSense alle ben&ouml;tigten Eigenschaften, Funktionen und Methoden anbieten (siehe Bild 3). Dazu definieren wir einige Elemente, die extern sichtbar sein sollen und einige interne Elemente. Die internen Elemente sind zum Beispiel die folgenden <b>Collection<\/b>-Elemente, mit denen wir die verschiedenen Mail-Adressen f&uuml;r Empf&auml;nger und Absender sammeln sowie f&uuml;r die Attachments:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_465_003.png\" alt=\"Auswahl der Elemente der Klasse clsMail\" width=\"424,6267\" height=\"293,5895\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Auswahl der Elemente der Klasse clsMail<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private <\/span>colFrom<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Private <\/span>colToMailContacts<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Private <\/span>colCCMailContacts<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Private <\/span>colBCCMailContacts<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Private <\/span>colReplyToMailContacts<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Private <\/span>colAttachmentPaths<span style=\"color:blue;\"> As <\/span>Collection<\/pre>\n<p>Au&szlig;erdem gibt es einige Eigenschaften, die wir &uuml;ber <b>Property Let\/Get<\/b>-Prozeduren nach au&szlig;en ver&ouml;ffentlichen. Die damit erfassten Werte sollen in den wie folgt deklarierten privaten Variablen erfasst werden:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_ContentType<span style=\"color:blue;\"> As <\/span>ContentTypeEnum\r\n<span style=\"color:blue;\">Private <\/span>m_Subject<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_Body<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_Importance<span style=\"color:blue;\"> As <\/span>ImportanceEnum<\/pre>\n<h2>Klasse initialisieren<\/h2>\n<p>Damit die Collections mit den nachfolgend beschriebenen <b>Add&#8230;<\/b>-Methoden gef&uuml;llt werden k&ouml;nnen, erstellen wir jeweils eine Instanz dieser <b>Collection<\/b>-Objekte. Das erledigen wir in der Ereignisprozedur <b>Class_Initialize<\/b>, das automatisch beim Erstellen der Klasse ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Class_Initialize()\r\n     <span style=\"color:blue;\">Set<\/span> colFrom = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> colToMailContacts = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> colCCMailContacts = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> colBCCMailContacts = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> colReplyToMailContacts = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> colAttachmentPaths = <span style=\"color:blue;\">New<\/span> Collection\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Methoden zum Hinzuf&uuml;gen von Mailkontakten und Anlagen<\/h2>\n<p>In Listing 3 sehen wir verschiedene <b>Add&#8230;<\/b>-Methoden. Wir schauen uns diese am Beispiel der Methode <b>AddToRecipient <\/b>an. Diese soll einen Absender-E-Mail-Kontakt zur Klasse hinzuf&uuml;gen.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AddToRecipient(strEMail<span style=\"color:blue;\"> As String<\/span>, strName<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objMailContact<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> clsMailContact\r\n     <span style=\"color:blue;\">With<\/span> objMailContact\r\n         .Address = strEMail\r\n         .Name = strName\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     colToMailContacts.Add objMailContact\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>AddCCRecipient(strEMail<span style=\"color:blue;\"> As String<\/span>, strName<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objMailContact<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> clsMailContact\r\n     <span style=\"color:blue;\">With<\/span> objMailContact\r\n         .Address = strEMail\r\n         .Name = strName\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     colCCMailContacts.Add objMailContact\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>AddBCCRecipient(strEMail<span style=\"color:blue;\"> As String<\/span>, strName<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objMailContact<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> clsMailContact\r\n     <span style=\"color:blue;\">With<\/span> objMailContact\r\n         .Address = strEMail\r\n         .Name = strName\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     colBCCMailContacts.Add objMailContact\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>AddReplyToRecipient(strEMail<span style=\"color:blue;\"> As String<\/span>, strName<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objMailContact<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> clsMailContact\r\n     <span style=\"color:blue;\">With<\/span> objMailContact\r\n         .Address = strEMail\r\n         .Name = strName\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     colReplyToMailContacts.Add objMailContact\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>AddFrom(strEMail<span style=\"color:blue;\"> As String<\/span>, strName<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objMailContact<span style=\"color:blue;\"> As <\/span>clsMailContact\r\n     <span style=\"color:blue;\">With<\/span> objMailContact\r\n         .Address = strEMail\r\n         .Name = strName\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     colFrom.Add objMailContact\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>AddAttachmentPath(strPath<span style=\"color:blue;\"> As String<\/span>)\r\n     colAttachmentPaths.Add strPath\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozeduren zum Hinzuf&uuml;gen von E-Mail-Kontakten und Attachments <\/span><\/b><\/p>\n<p>Ein E-Mail-Kontakt, wie wir ihn als Absender, Empf&auml;nger, CC oder BCC angeben k&ouml;nnen, erfordert aber immer die Angabe von E-Mail-Adresse und Name. Damit wir diese gemeinsam in einer Collection unterbringen k&ouml;nnen, haben wir dazu noch eine Klasse erstellt. Diese hei&szlig;t <b>clsMailContact <\/b>uns wird in Listing 4 abgebildet.<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_Address<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_Name<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>Address(strAddress<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Address = strAddress\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Get <\/span>Address()<span style=\"color:blue;\"> As String<\/span>\r\n     Address = m_Address\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>Name(strName<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Name = strName\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Get <\/span>Name()<span style=\"color:blue;\"> As String<\/span>\r\n     Name = m_Name\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Klassen f&uuml;r E-Mail-Adresse und Name eines Kontakts<\/span><\/b><\/p>\n<p>In Prozeduren wie <b>AddToRecipient <\/b>nehmen wir nun die E-Mail-Adresse und den Namen per Parameter entgegen, erstellen eine neue Instanz der Klasse <b>clsMailContact <\/b>und weisen ihren Eigenschaften <b>Address <\/b>und <b>Name <\/b>die ben&ouml;tigten Daten hinzu. Danach h&auml;ngen wir das neue <b>clsMailContact<\/b>-Objekt an die jeweilige Collection an, in diesem Fall <b>colToMailContacts<\/b>.<\/p>\n<p>Da diese Collections klassenweit deklariert sind, gehen ihre Inhalte nicht verloren und wir k&ouml;nnen Schritt f&uuml;r Schritt weitere Elemente hinzuf&uuml;gen.<\/p>\n<h2>Anlagen hinzuf&uuml;gen<\/h2>\n<p>Noch etwas einfacher gelingt dies bei den Anlagen. Die Prozedur <b>AddAttachmentPath <\/b>nimmt den Pfad der Anlage entgegen und f&uuml;gt diese einfach als Elements zur Collection <b>colAttachmentPaths <\/b>hinzu.<\/p>\n<h2>Betreff hinzuf&uuml;gen<\/h2>\n<p>Der Betreff wird in der <b>String<\/b>-Variablen <b>m_Subject <\/b>gespeichert. Damit wir diesen von au&szlig;en schreiben und lesen k&ouml;nnen, legen wir jeweils eine <b>Property Let<\/b>&#8211; und eine <b>Property Get<\/b>-Prozedur an.<\/p>\n<p>Die <b>Property Let<\/b>-Prozedur nimmt einen neuen Betreff entgegen und speichert diesen in der Variablen <b>m_Subject<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>Subject(strSubject<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Subject = strSubject\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Die entsprechende <b>Property Get<\/b>-Prozedur dient zum Auslesen des Betreffs:<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>Subject()<span style=\"color:blue;\"> As String<\/span>\r\n     Subject = m_Subject\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<h2>Inhalt hinzuf&uuml;gen<\/h2>\n<p>Auf die gleiche Weise gehen wir mit dem Inhalt der E-Mail um, die in <b>m_Body <\/b>geschrieben wird:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>Body(strBody<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Body = strBody\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Get <\/span>Body()<span style=\"color:blue;\"> As String<\/span>\r\n     Body = m_Body\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<h2>ContentType festlegen<\/h2>\n<p>Zum Festlegen des <b>ContentTypes <\/b>haben wir im Standardmodul eine Enumeration erstellt, die das Ausw&auml;hlen des gew&uuml;nschten Wertes per IntelliSense vereinfachen soll:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Enum ContentTypeEnum\r\n     HTML = 1\r\n     PlainText = 2\r\nEnd Enum<\/pre>\n<p>Mit den <b>Property Let<\/b>&#8211; und <b>Property Get<\/b>-Funktion k&ouml;nnen wir diesen Wert setzen und lesen:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>ContentType(lngContentType<span style=\"color:blue;\"> As <\/span>_\r\n         ContentTypeEnum)\r\n     m_ContentType = lngContentType\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Get <\/span>ContentType()<span style=\"color:blue;\"> As <\/span>ContentTypeEnum\r\n     ContentType = m_ContentType\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<h2>Wichtigkeit einstellen<\/h2>\n<p>Auch die Wichtigkeit einer E-Mail k&ouml;nnen wir vorgeben. Dazu geben wir wiederum die Werte mit einer Enumeration im Modul <b>mdlGlobal <\/b>vor:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Enum ImportanceEnum\r\n     High = 1\r\n     Normal = 0\r\n     Low = 2\r\nEnd Enum<\/pre>\n<p>Die Prozeduren zum Einstellen sehen wir hier:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>Importance(lngImportance<span style=\"color:blue;\"> As <\/span>_\r\n         ImportanceEnum)\r\n     m_Importance = lngImportance\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Get <\/span>Importance()<span style=\"color:blue;\"> As <\/span>ImportanceEnum\r\n     Importance = m_Importance\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<h2>Funktion zum Senden einer E-Mail<\/h2>\n<p>Damit kommen wir zum eigentlichen Arbeitstier dieser Klasse. Dabei handelt es sich um die Funktion <b>Send<\/b>, die lediglich einen optionalen Parameter namens <b>strResponse <\/b>erwartet (siehe Listing 5). Als Funktionswert liefert sie einen <b>Boolean<\/b>-Wert, der angibt, ob die E-Mail erfolgreich an Microsoft 365 &uuml;bergeben werden konnte.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Send(<span style=\"color:blue;\">Optional<\/span> strResponse<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strWebhookURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objXMLHTTP<span style=\"color:blue;\"> As <\/span>MSXML2.XMLHTTP60\r\n     <span style=\"color:blue;\">Dim <\/span>strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBody<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Validate(strResponse) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         Send = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     \r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> CreateJSON(strJSON, strResponse) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         Send = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strWebhookURL = \"https:\/\/hook.eu2.make.com\/5yauwb5ehk63mudiohao3xf4mkc7lwe2\"\r\n     \r\n     Inzwischenablage strJSON\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = <span style=\"color:blue;\">New<\/span> MSXML2.XMLHTTP60\r\n     objXMLHTTP.Open \"POST\", strWebhookURL, <span style=\"color:blue;\">False<\/span>\r\n     objXMLHTTP.setRequestHeader \"Content-Type\", \"application\/json\"\r\n     \r\n     objXMLHTTP.Send strJSON\r\n     Select Case objXMLHTTP.status\r\n         <span style=\"color:blue;\">Case <\/span>201\r\n             strResponse = \"201 - Erfolgreich gesendet.\" & objXMLHTTP.statusText\r\n             Send = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Case <\/span>200\r\n             strResponse = \"200 - Automation l&auml;uft nicht.\"\r\n         <span style=\"color:blue;\">Case <\/span>400\r\n             strResponse = \"400 - JSON ung&uuml;ltig.\"\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> objXMLHTTP.status & \" Fehler beim Senden: \" - \" & objXMLHTTP.statusText & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n                 & objXMLHTTP.responseText\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Funktion zum Senden der E-Mail<\/span><\/b><\/p>\n<p>Sie pr&uuml;ft zuerst mit der Funktion <b>Validate<\/b>, ob &uuml;berhaupt alle f&uuml;r den Versand einer E-Mail ben&ouml;tigten Informationen geliefert wurden. Dabei handelt es sich um die Empf&auml;ngeradresse, den Betreff und den Inhalt. Diese Funktion beschreiben wir weiter unten. Liefert <b>Validate <\/b>den Wert <b>False<\/b>, wird die Funktion <b>Send <\/b>an dieser Stelle mit dem R&uuml;ckgabewert <b>False <\/b>verlassen.<\/p>\n<p>Danach ruft sie die Funktion <b>CreateJSON <\/b>auf, welche die Informationen aus den verschiedenen Variablen und Collections zu dem JSON-Dokument zusammenstellt, dass an Microsoft 365 gesendet werden soll.<\/p>\n<p>Diese liefert das JSON-Dokument mit der Variablen <b>strJSON <\/b>&#8211; plus mit <b>strResponse <\/b>Hinweise, wenn <b>CreateJSON <\/b>den Wert <b>False <\/b>zur&uuml;ckliefern sollte. Diese Funktion, die wir weiter unten beschreiben, muss ebenfalls den Wert <b>True <\/b>zur&uuml;ckgeben, damit wir fortfahren k&ouml;nnen.<\/p>\n<p>Danach stellt die Prozedur die Adresse des Webhooks zusammen und ersetzt im Inhalt f&uuml;r die E-Mail Zeilenumbr&uuml;che durch das HTML-Zeichen <b><\/b>.<\/p>\n<p>Danach startet der bereits im Artikel <b>Google Mail mit Make.com und VBA statt Outlook <\/b>(<b>www.vbentwickler.de\/464<\/b>) beschriebene Vorgang zum Senden der Anfrage und ihrer Auswertung.<\/p>\n<h2>Validieren der Daten f&uuml;r die E-Mail<\/h2>\n<p>Die Funktion <b>Validate <\/b>aus Listing 6 pr&uuml;ft, ob alle mindestens notwendigen Informationen vorliegen. Diese befinden sich in den Variablen <b>m_Subject<\/b> und <b>m_Body <\/b>sowie in der Collection <b>colToMailContacts<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>Validate(strResponse<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(m_Subject) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strResponse = \"Kein Subject angegeben. Stelle ''Subject'' auf den gew&uuml;nschten Betreff ein.\"\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(m_Body) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strResponse = \"Kein Body angegeben. Stelle ''Body'' auf den gew&uuml;nschten Inhalt ein.\"\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>m_ContentType = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strResponse = \"Kein ContentType angegeben. Stelle ''ContentType'' auf HTML oder Text ein.\"\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>colToMailContacts.Count = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strResponse = \"Kein Empf&auml;nger angegeben. F&uuml;ge einen mit ''AddRecipientTo.Add'' hinzu.\"\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Validate = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Funktion zum Validieren der &uuml;bermittelten Daten<\/span><\/b><\/p>\n<p>Ist eines dieser Elemente leer, liefert <b>Validate <\/b>den Wert <b>False <\/b>zur&uuml;ck und mit <b>strResponse <\/b>die Angabe des entsprechenden Grundes.<\/p>\n<h2>JSON-Dokument zusammenstellen<\/h2>\n<p>Ein JSON-Dokument k&ouml;nnte man auch einfach per Zeichenkettenoperationen zusammenstellen. Allerdings treten dabei sehr schnell Fehler auf, die immer erst beim &Uuml;bergeben des JSON-Dokuments beim n&auml;chsten Aufruf des Webhooks auftauchen.<\/p>\n<p>Also w&auml;hlen wir eine mittlerweile in unseren Projekten bew&auml;hrte Variante, bei der wir ein aus <b>Dictionary<\/b>&#8211; und <b>Collection<\/b>-Objekten bestehendes Objektmodell zusammenstellen und diesem die Name-Wert-Paare hinzuf&uuml;gen. Dieses Objektmodell k&ouml;nnen wir anschlie&szlig;end mit der Funktion <b>ConvertToJSON <\/b>des Moduls <b>mdlJSON <\/b>in ein JSON-Dokument umwandeln.<\/p>\n<p>Mehr dazu erf&auml;hrst Du im Artikel <b>JSON-Dokumente per Objektmodell zusammenstellen <\/b>(<b>www.vbentwickler.de\/412<\/b>).<\/p>\n<h2>Hauptfunktion CreateJSON<\/h2>\n<p>Das Zusammenstellen dieses Objektmodells &uuml;bernimmt die Funktion <b>CreateJSON<\/b> (siehe Listing 7). Dieser &uuml;bergeben wir die noch leere Variable <b>strJSON <\/b>sowie eine Variable namens <b>strResponse <\/b>f&uuml;r die R&uuml;ckmeldung eventueller Fehler. Wenn das Zusammenstellen erfolgreich war, liefert die Funktion den Wert <b>True<\/b> zur&uuml;ck. Dies ist theoretisch immer der Fall, da hier eine bew&auml;hrte Abfolge von Anweisungen durchgef&uuml;hrt wird.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>CreateJSON(strJSON<span style=\"color:blue;\"> As String<\/span>, strResponse<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>dicJSON<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>dicBodyJSON<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>strContenttype<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strImportance<span style=\"color:blue;\"> As String<\/span>\r\n     \r\n     dicJSON.Add \"subject\", m_Subject\r\n     dicJSON.Add \"body\", dicBodyJSON\r\n     dicBodyJSON.Add \"content\", m_Body\r\n     strContenttype = GetContentType(m_ContentType)\r\n     dicBodyJSON.Add \"contentType\", strContenttype\r\n     \r\n     AddContacts \"toRecipients\", colToMailContacts, dicJSON\r\n     AddContacts \"ccRecipients\", colCCMailContacts, dicJSON\r\n     AddContacts \"bccRecipients\", colBCCMailContacts, dicJSON\r\n     AddContacts \"replyTo\", colReplyToMailContacts, dicJSON\r\n     AddAttachments colAttachmentPaths, dicJSON\r\n     \r\n     strImportance = GetImportance(m_Importance)\r\n     dicJSON.Add \"importance\", strImportance\r\n     \r\n     strJSON = ConvertToJson(dicJSON)\r\n     CreateJSON = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Hauptfunktion zum Zusammenstellen des JSON-Dokuments<\/span><\/b><\/p>\n<p>Die kleine Regel lautet: Wenn wir eine JSON-Auflistung erstellen wollen, also mehrere in eckigen Klammern eingefasste Elemente, ben&ouml;tigen wir ein Collection-Element &#8211; wie zum Beispiel f&uuml;r die <b>toRecipients<\/b>:<\/p>\n<pre>  \"toRecipients\": [\r\n   {\r\n     \"address\": \"andre@minhorst.com\",\r\n     \"name\": \"Andr\\u00E9 Minhorst To\"\r\n   }\r\n]<\/pre>\n<p>F&uuml;r eine Auflistung von Elementen in geschweiften Klammern ben&ouml;tigen wir <b>Dictionary<\/b>-Elemente. Das Hauptelement ist eines mit geschweiften Klammern, also deklarieren wir daf&uuml;r das <b>Dictionary<\/b>-Objekt <b>dicJSON<\/b>. Darin f&uuml;gen wir mit der <b>Add<\/b>-Methode das Name-Wert-Paar f&uuml;r die Eigenschaft <b>subject <\/b>ein.<\/p>\n<p>Das <b>body<\/b>-Element ist bereits eines mit zwei Unterelementen in geschweiften Klammern, also nutzen wir dazu ein weiteres <b>Dictionary<\/b>-Element namens <b>dicBodyJSON<\/b>. Diesem weisen wir mit der <b>Add<\/b>-Methode die Eigenschaften <b>content <\/b>und <b>contentType <\/b>zu.<\/p>\n<p>Um <b>contentType <\/b>zu f&uuml;llen, ermitteln wir zun&auml;chst mit der Funktion <b>GetContentType <\/b>die entsprechende Zeichenfolge f&uuml;r den Zahlenwert aus <b>m_ContentType<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetContentType(lngContentType<span style=\"color:blue;\"> As <\/span>_\r\n         ContentTypeEnum)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strContenttype<span style=\"color:blue;\"> As String<\/span>\r\n     Select Case lngContentType\r\n         <span style=\"color:blue;\">Case <\/span>1\r\n             strContenttype = \"html\"\r\n         <span style=\"color:blue;\">Case <\/span>2\r\n             strContenttype = \"text\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     GetContentType = strContenttype\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Dann f&uuml;gen wir es mit <b>Add <\/b>zu <b>dicBodyJSON <\/b>hinzu.<\/p>\n<p>Danach folgenden die Elemente <b>toRecipients<\/b>, <b>ccRecipients<\/b>, <b>bccRecipients <\/b>und <b>replyTo<\/b>. Diese sind &auml;hnlich aufgebaut und unterscheiden sich nur durch wenige Details, daher haben wir daf&uuml;r eine weitere Prozedur namens <b>AddContacts <\/b>geschrieben. Diese rufen wir nacheinander f&uuml;r jedes Element auf und &uuml;bergeben jeweils den Namen des Elements, zum Beispiel <b>toRecipients<\/b>, die Collection, in der sich die entsprechenden Kontakte befinden, also zum Beispiel <b>colToMailContacts<\/b>, sowie das Objekt <b>dictJSON<\/b>, dem wir die neuen Unterelemente hinzuf&uuml;gen wollen.<\/p>\n<h2>Kontaktelemente zusammenstellen<\/h2>\n<p>Ein solches Kontaktelement kann einen oder mehrere Kontakte enthalten. F&uuml;r mehrere Empf&auml;nger in CC sieht dies beispielsweise wie folgt aus:<\/p>\n<pre>\"ccRecipients\": [\r\n   {\r\n     \"address\": \"andre@minhorst.com\",\r\n     \"name\": \"Andr\\u00E9 Minhorst CC\"\r\n   },\r\n   {\r\n     \"address\": \"info@andreminhorst.de\",\r\n     \"name\": \"Andr\\u00E9 Minhorst CC\"\r\n   }\r\n]<\/pre>\n<p>Da wir hier ein oder mehrere Elemente gleichen Namens als Unterelemente des gleichen Elements hinzuf&uuml;gen, ben&ouml;tigen wir in der Funktion <b>AddContacts <\/b>aus Listing 8 ein tempor&auml;res <b>Collection<\/b>-Objekt namens <b>colTemp<\/b>. In diesem sammeln wir die untergeordneten <b>Dictionary<\/b>-Elemente.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>AddContacts(str<span style=\"color:blue;\"> As String<\/span>, colMailContacts<span style=\"color:blue;\"> As <\/span>Collection, dicJSON<span style=\"color:blue;\"> As <\/span>Dictionary)\r\n     <span style=\"color:blue;\">Dim <\/span>colTemp<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Dim <\/span>col<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Dim <\/span>dic<span style=\"color:blue;\"> As <\/span>Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>objMailContact<span style=\"color:blue;\"> As <\/span>clsMailContact\r\n     dicJSON.Add str, col\r\n     For Each objMailContact In colMailContacts\r\n         <span style=\"color:blue;\">Set<\/span> dic = <span style=\"color:blue;\">New<\/span> Dictionary\r\n         col.Add dic\r\n         dic.Add \"address\", objMailContact.Address\r\n         dic.Add \"name\", objMailContact.Name\r\n         colTemp.Add dic\r\n     <span style=\"color:blue;\">Next<\/span> objMailContact\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Funktion zum Hinzuf&uuml;gen von Kontakten<\/span><\/b><\/p>\n<p>Insgesamt f&uuml;gen wir als erstes dem Hauptelement <b>dicJSON <\/b>ein Unterelement hinzu, dass den entsprechenden Namen enth&auml;lt, zum Beispiel <b>toRecipients <\/b>oder <b>ccRecipients<\/b>.<\/p>\n<p>Dann durchlaufen wir in einer <b>For Each<\/b>-Schleife alle Kontakt-Elemente der Auflistung <b>colMailContacts<\/b>, die Elemente des Typs <b>clsMailContact <\/b>enth&auml;lt.<\/p>\n<p>Wir erstellen ein neues <b>Dictionary<\/b>-Objekt namens <b>dic<\/b> und f&uuml;gen dieses <b>col <\/b>hinzu (also in eckigen Klammern). Dann weisen wir <b>dic <\/b>zwei Unterelemente f&uuml;r die Elemente <b>address <\/b>und <b>name <\/b>hinzu und weisen die Werte aus <b>objMailContact.Address <\/b>und <b>objMailContact.Name <\/b>zu.<\/p>\n<p>Das so erstellte Objekt m&uuml;ssen wir in der Collection <b>colTemp <\/b>speichern, da wir <b>dic <\/b>f&uuml;r eventuelle weitere Kontakte dieser Kategorie oben in der Schleife neu erstellen.<\/p>\n<p>Da wir hier direkt mit dem &uuml;bergebenen Parameter <b>dicJSON <\/b>arbeiten und dieses erweitern, ben&ouml;tigen wir keinen R&uuml;ckgabeparameter.<\/p>\n<h2>Attachments hinzuf&uuml;gen<\/h2>\n<p>Damit kehren wir zur Funktion <b>CreateJSON <\/b>zur&uuml;ck, die nun die Funktion <b>AddAttachments <\/b>aufruft. Diese stellt &auml;hnliche Strukturen zusammen, wie es bei den Kontakten erforderlich war.<\/p>\n<pre>\"attachments\": [\r\n   {\r\n     \"filename\": \"test1.pdf\",\r\n     \"data\": \"JVBERi0xLjYNJeLjz9MNC2IDAgb2JqDTw8L0xpbm...\"\r\n   },\r\n   {\r\n     \"filename\": \"test.pdf\",\r\n     \"data\": \"JVBERi0xLjYNJeLjz9MNY3NiAwIG9iag08PC9GaW...\"\r\n   }\r\n]<\/pre>\n<p>Die hier enthaltenen <b>data<\/b>-Elemente sind jedoch wesentlich umfangreicher als hier abgebildet und entsprechenden einer Respr&auml;sentation der anzuh&auml;ngenden Dateien.<\/p>\n<p>Wir m&uuml;ssen die Dateien also erst einmal in eine derartige Zeichenkette umwandeln. Die Funktion <b>AddAttachments <\/b>aus Listing 9 erledigt genau das. Sie nimmt die Collection mit den Dateipfaden der anzuh&auml;ngenden Dateien entgegen sowie das Haupt-Dictionary mit den bisher hinzugef&uuml;gten Elementen. Der Ablauf ist prinzipiell mit dem identisch, den wir beim Hinzuf&uuml;gen der Kontaktdaten erstellt haben. Wir pr&uuml;fen hier in einer <b>If&#8230;Then<\/b>-Bedingung, ob &uuml;berhaupt Anlagen vorhanden sind. Falls ja, erstellen wir ein neues tempor&auml;res <b>Collection<\/b>-Objekt, um die Unterelemente mit den Werten f&uuml;r <b>filename <\/b>und <b>data <\/b>aufzunehmen.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>AddAttachments(colAttachmentPaths<span style=\"color:blue;\"> As <\/span>Collection, dicJSON<span style=\"color:blue;\"> As <\/span>Dictionary)\r\n     <span style=\"color:blue;\">Dim <\/span>colAttachmentsTemp<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Dim <\/span>col<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Dim <\/span>colTemp<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Dim <\/span>dic<span style=\"color:blue;\"> As <\/span>Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>varAttachmentPath<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilename<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBase64<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> colAttachmentPaths.Count = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> colAttachmentsTemp = <span style=\"color:blue;\">New<\/span> Collection\r\n         dicJSON.Add \"attachments\", col\r\n         For Each varAttachmentPath In colAttachmentPaths\r\n             <span style=\"color:blue;\">Set<\/span> dic = <span style=\"color:blue;\">New<\/span> Dictionary\r\n             col.Add dic\r\n             strFilename = <span style=\"color:blue;\">Mid<\/span>(varAttachmentPath, <span style=\"color:blue;\">InStrRev<\/span>(varAttachmentPath, \"\\\") + 1)\r\n             dic.Add \"filename\", strFilename\r\n             strBase64 = GetBase64FromPath(CStr(varAttachmentPath))\r\n             dic.Add \"data\", strBase64\r\n             colTemp.Add dic\r\n         <span style=\"color:blue;\">Next<\/span> varAttachmentPath\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Funktion zum Hinzuf&uuml;gen von Attachments<\/span><\/b><\/p>\n<p>Der Inhalt der Schleife unterscheidet sich insofern, als dass wir noch den Dateinamen ermitteln und mit der Funktion <b>GetBase64FromPath <\/b>die Zeichenkette, welche die anzuh&auml;ngende Datei repr&auml;sentiert. Nachdem diese Daten angeh&auml;ngt sind, wird die Funktion beendet.<\/p>\n<h2>Wichtigkeit hinzuf&uuml;gen<\/h2>\n<p>Fehlt noch die Eigenschaft <b>Importance<\/b>, die wir wieder durch einfache Zuweisung an <b>dicJSON <\/b>anh&auml;ngen.<\/p>\n<p>Hier rufen wir die Funktion <b>GetImportance<\/b> auf, die f&uuml;r die in <b>m_Importance <\/b>angegebene Zahl den entsprechenden Text ermittelt (<b>High<\/b>, <b>Normal <\/b>oder <b>Low)<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetImportance(lngImportance<span style=\"color:blue;\"> As <\/span>ImportanceEnum)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strImportance<span style=\"color:blue;\"> As String<\/span>\r\n     Select Case lngImportance\r\n         <span style=\"color:blue;\">Case <\/span>1\r\n             strImportance = \"High\"\r\n         <span style=\"color:blue;\">Case <\/span>0\r\n             strImportance = \"Normal\"\r\n         <span style=\"color:blue;\">Case <\/span>2\r\n             strImportance = \"Low\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     GetImportance = strImportance\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Schlie&szlig;lich rufen wir die Funktion <b>ConvertToJson <\/b>aus dem Modul <b>mdlJSON <\/b>auf und wandeln das zuvor in <b>dicJSON<\/b> erstellte Objektmodell in das JSON-Dokument in Textform um.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit der hier vorgestellten L&ouml;sung ist es genauso einfach, E-Mails &uuml;ber Microsoft 365 zu versenden, wie es zuvor mit der VBA-Programmierung von Outlook war. Mit dem Nachsatz, dass hier einige vorbereitende Schritte durchzuf&uuml;hren sind:<\/p>\n<ul>\n<li>das Anlegen eines Benutzerkontos in Make und das Erstellen einer Automation als einfache Schnittstelle zu Microsoft 365 und<\/li>\n<li>das Programmieren einer Logik, mit der wir diese Schnittstelle steuern k&ouml;nnen &#8211; was wir in diesem Artikel bereits erledigt haben.<\/li>\n<\/ul>\n<p>In einem weiteren Artikel namens <b>Microsoft 365-E-Mails per Formular verschicken <\/b>(<b>www.vbentwickler.de\/466<\/b>) zeigen wir in der n&auml;chsten Ausgabe, wie man diese Klasse &uuml;ber ein Formular steuern kann.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Microsoft365EMailsMitMakePerKlasse.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/2548A9A6-C83E-4764-AE44-B60429467377\/vbe_465.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In unserem Artikel Google Mail mit Make.com und VBA statt Outlook (www.vbentwickler.de\/464) haben wir detailliert gezeigt, wie man per VBA die Informationen zum Versenden einer E-Mail zusammenstellt und diese dann &uuml;ber den Automatisierungsdienst Make.com an Microsoft 365 E-Mail sendet. Hier sind wir allerdings nur so weit gekommen, dass wir die notwendige JSON-Datei mit den eigentlichen Daten der E-Mail Zeile f&uuml;r Zeile zusammengestellt und mit den n&ouml;tigen Daten gef&uuml;llt haben. F&uuml;r einen ersten Schritt nicht schlecht, aber wenn man diesen Weg professionell nutzen m&ouml;chte, sollte man sich dazu eine ordentliche Klasse bauen. Eine, die man schnell initialisieren und mit den Daten wie Empf&auml;nger, Betreff, Inhalt, CC\/BCC-Empf&auml;ngern und Anlagen f&uuml;llen kann und die eine einfache Send-Methode enth&auml;lt. Ganz genau so, wie es auch mit VBA und Outlook geht &#8211; mit dem Unterschied, dass die hier vorgestellte Methode vermutlich wesentlich bessere Chancen hat, die n&auml;chsten f&uuml;nf Jahre zu &uuml;berleben.<\/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":[66022025,662025,44000012,44000028],"tags":[],"yst_prominent_words":[],"class_list":["post-55000465","post","type-post","status-publish","format-standard","hentry","category-66022025","category-662025","category-Interaktiv","category-Word_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000465","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=55000465"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000465\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000465"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}