{"id":55000464,"date":"2025-04-01T00:00:00","date_gmt":"2025-07-02T14:49:42","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=464"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Microsoft_365Mail_mit_Make_und_VBA_ohne_Outlook","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Microsoft_365Mail_mit_Make_und_VBA_ohne_Outlook\/","title":{"rendered":"Microsoft 365-Mail mit Make und VBA ohne Outlook"},"content":{"rendered":"<p><b>Am liebsten w&auml;re den meisten Microsoft-Anwendern vermutlich, wenn sie einfach ihre vorhandenen VBA-Automationen auf Basis von Microsoft Outlook verwenden k&ouml;nnten. Allerdings zeigt Microsoft aktuell kein Zeichen, dass das klassische Outlook f&uuml;r Desktop mit seiner VBA-Programmierbarkeit  &uuml;ber das Jahr 2029 hinaus unterst&uuml;tzt werden wird. Die neue Outlook-Version ist allerdings noch nicht so weit, dass wir damit so arbeiten k&ouml;nnen, wie es mit der klassischen Version m&ouml;glich ist. Genau genommen wird das, wenn man sich die Pl&auml;ne von Microsoft ansieht, auch zumindest per VBA nicht mehr m&ouml;glich sein. Um zumindest das Versenden von E-Mails von VBA aus zu realisieren, ben&ouml;tigen wir also eine Alternative. In diesem Artikel schauen wir uns an, wie wir Outlook.com &uuml;ber den Automatisierungdienst Make dazu bringen, E-Mails zu versenden &#8211; mit allen Funktionen, die wir von Outlook gewohnt sind.<\/b><\/p>\n<p>Microsoft Access und Microsoft Outlook in der klassischen Version sind ein gro&szlig;artiges Gespann. Wer von Access aus per VBA eine E-Mail versenden wollte, konnte dies mit wenigen Zeilen Code realisieren. Outlook starten (wenn auch unsichtbar), ein neues <b>MailItem<\/b>-Objekt erstellen, Betreff, Inhalt und gegebenenfalls noch Anlagen und weitere Eigenschaften einstellen und los geht es. Die so vorbereitete E-Mail k&ouml;nnen wir mit der <b>Send<\/b>-Methode direkt absenden oder mit der <b>Display<\/b>-Methode so &ouml;ffnen, als ob wir die E-Mail soeben selbst erstellt h&auml;tten &#8211; und brauchen dann nur noch auf <b>Senden <\/b>zu klicken, nachdem wir den Entwurf gegebenenfalls noch angepasst haben.<\/p>\n<p>In Zukunft k&ouml;nnen wir verschiedene Alternativen nutzen:<\/p>\n<ul>\n<li>E-Mails unter Versendung der Bibliothek CDO versenden: Das ist jedoch aufwendig, weil sich die Parameter je nach dem zu verwendenden E-Mail-Anbieter unterscheiden. Au&szlig;erdem ist auch diese Bibliothek bereits abgek&uuml;ndigt.<\/li>\n<li>E-Mails mit der Graph-API von Microsoft versenden: Dies haben wir uns bereits in einem Artikel in Access im Unternehmen angesehen &#8211; <b>Mails senden mit der Microsoft Graph API <\/b>(<b>www.access-im-unternehmen.de\/1532<\/b>). Allerdings ist es sehr aufwendig, dies zu realisieren, da sehr viel Vorbereitung notwendig ist &#8211; speziell f&uuml;r die Authentifizierung am entsprechenden Outlook-Konto.<\/li>\n<li>Office-JavaScript-API: Es soll auch f&uuml;r das neue Outlook eine API geben. Allerdings ist hier noch unklar, ob und wie man damit Mails mit VBA erstellen und verschicken kann.<\/li>\n<\/ul>\n<h2>Make.com als Schnittstelle<\/h2>\n<p>Also zeigen wir, wie wir mit alternativen Techniken E-Mails &uuml;ber Outlook.com versenden k&ouml;nnen &#8211; und dazu mit Make.com ein Tool zur Workflow-Automation nutzen.<\/p>\n<p>Im Artikel <b>Automation mit VBA und Make <\/b>(<b>www.vbentwickler.de\/463<\/b>) haben wir bereits gezeigt, wie wir Make.com von VBA aus ansteuern k&ouml;nnen. Dort haben wir uns angesehen, wie man ein Automations-Scenario anlegen, wie wir dieses von VBA aus starten und wie das Ergebnis der Automation abgefragt und ausgewertet werden kann.<\/p>\n<p>Auf den dort beschriebenen Techniken setzen wir nun auf und wollen darin den Versand einer E-Mail mit Outlook.com einbetten.<\/p>\n<p>Warum aber sollten wir dazu <b>Make.com <\/b>nutzen und nicht &uuml;ber die Microsoft Graph API auf Outlook.com zugreifen? Weil auch hier die Authentifizierung relativ aufwendig zu realisieren ist und <b>Make.com <\/b>uns dabei eine Menge Arbeit abnimmt.<\/p>\n<p>Wir gehen dabei in den folgenden Schritten vor:<\/p>\n<ul>\n<li>Programmierung des Mailversands in Make.com<\/li>\n<li>Aufruf des Mailversands in eine VBA-Prozedur<\/li>\n<\/ul>\n<h2>Mails versenden in Make.com<\/h2>\n<p>Zun&auml;chst programmieren wir einen Mailversand in <b>Make.com<\/b>, ohne dass wir Betreff, Inhalt, Empf&auml;nger und so weiter von VBA aus &uuml;bergeben.<\/p>\n<p>Wie wir ein <b>Make.com<\/b>-Konto anlegen und wie wir grunds&auml;tzlich Scenarios anlegen und damit arbeiten, haben wir im oben genannten Artikel beschrieben.<\/p>\n<p>Dazu legen wir in <b>Make.com <\/b>ein neues Scenario an, indem wir auf der Seite <b>All scenarios <\/b>auf <b>Create a new scenario <\/b>klicken. Im neuen Scenario &auml;ndern wir den Namen gleich oben links auf <b>Mail mit Outlook.com senden <\/b>(siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_003.png\" alt=\"Scenario umbenennen\" width=\"549,6265\" height=\"244,2785\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Scenario umbenennen<\/span><\/b><\/p>\n<p>Danach f&uuml;gen wir den Trigger ein. Wir wollen den Mailversand per VBA ansto&szlig;en, wozu wir ein <b>XMLHTTP60<\/b>-Objekt nutzen werden.<\/p>\n<p>Dazu ben&ouml;tigen wir ein <b>Webhook<\/b>-Element als Trigger, das wir nun hinzuf&uuml;gen. Dazu klicken wir auf das gro&szlig;e Plus-Icon im Scenario und w&auml;hlen <b>Webhook|Custom webhook <\/b>aus. Hier klicken wir nun auf <b>Add<\/b>, um einen neuen Hook hinzuzuf&uuml;gen (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_002.png\" alt=\"Trigger hinzuf&uuml;gen und Hook anlegen\" width=\"549,6265\" height=\"260,8792\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Trigger hinzuf&uuml;gen und Hook anlegen<\/span><\/b><\/p>\n<p>Anschlie&szlig;end legen wir den Namen des Webhooks fest und speichern diesen mit <b>Save<\/b> (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_004.png\" alt=\"Name des Webhooks festlegen\" width=\"424,6267\" height=\"368,0098\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Name des Webhooks festlegen<\/span><\/b><\/p>\n<p>Die URL des Webhooks speichern wir in der Zwischenablage und f&uuml;gen diese dann in einem Browser ein. Nach dem Bet&auml;tigen der Eingabetaste sollte der Text <b>Accepted <\/b>erscheinen.<\/p>\n<p>Das erste Element des Scenarios k&ouml;nnen wir damit speichern.<\/p>\n<h2>Aktion zum Versenden von E-Mails hinzuf&uuml;gen<\/h2>\n<p>Nun klicken wir auf das Plus-Zeichen rechts vom Trigger-Element. Im Popup suchen wir den Eintrag <b>Microsoft 365 Email (Outlook)<\/b> (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_005.png\" alt=\"Microsoft 365 E-Mail (Outlook)-Aktion hinzuf&uuml;gen\" width=\"649,627\" height=\"330,8847\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Microsoft 365 E-Mail (Outlook)-Aktion hinzuf&uuml;gen<\/span><\/b><\/p>\n<p>Nach dem Anklicken erscheinen alle Aktionen, die diese App bereitstellt. Wir sehen gleich, dass wir eine ganze Menge Aktionen durchf&uuml;hren k&ouml;nnen, die mit E-Mails in Microsoft 365 Mail zu tun haben.<\/p>\n<p>Uns interessiert jedoch zun&auml;chst die Aktion <b>Create and Send a Message <\/b>(siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_007.png\" alt=\"Aktion zum Versenden einer E-Mail ausw&auml;hlen\" width=\"424,6267\" height=\"488,7725\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Aktion zum Versenden einer E-Mail ausw&auml;hlen<\/span><\/b><\/p>\n<h2>Verbindung zu Microsoft 365 herstellen<\/h2>\n<p>Klicken wir diese an, wird diese Aktion angelegt und es erscheint ein Popup zur Auswahl oder zum Anlegen der Connection zu <b>Microsoft 365<\/b> (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_010.png\" alt=\"Ausw&auml;hlen oder Hinzuf&uuml;gen der Connection\" width=\"599,6265\" height=\"261,3367\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Ausw&auml;hlen oder Hinzuf&uuml;gen der Connection<\/span><\/b><\/p>\n<p>An dieser Stelle gehen wir davon aus, dass Du bereits ein Microsoft 365-Konto hast. Da dieser vermutlich noch nicht als Connection zu <b>Make.com <\/b>hinzugef&uuml;gt ist, klicken wir hier auf die Schaltfl&auml;che <b>Add<\/b>.<\/p>\n<p>Im nun erscheinenden Popup geben wir eine Bezeichnung f&uuml;r die zu verwendende Connection an (siehe Bild 7). Eine Bezeichnung ist sinnvoll, weil wir gegebenenfalls mehrere Microsoft 365-Konten haben. Wenn wir diese noch in anderen Scenarios f&uuml;r den Versand von E-Mails nutzen wollen, finden wir die Connection schnell wieder, wenn wir einen aussagekr&auml;ftigen Namen vergeben haben. Wir verwenden hier zum Beispiel <b>Microsoft 365-Connection<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_011.png\" alt=\"Angeben einer Bezeichnung f&uuml;r die Connection\" width=\"424,6267\" height=\"351,9684\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Angeben einer Bezeichnung f&uuml;r die Connection<\/span><\/b><\/p>\n<p>Danach klicken wir unten auf <b>Save<\/b>.<\/p>\n<p>Es erscheint nun ein Microsoft-Dialog, wo wir nach der Authentifizierung die Berechtigungen von Make f&uuml;r den Zugriff auf unser Microsoft-Konto akzeptieren m&uuml;ssen (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_012.png\" alt=\"Akzeptieren der Berechtigungen\" width=\"424,6267\" height=\"592,2425\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Akzeptieren der Berechtigungen<\/span><\/b><\/p>\n<h2>Eigenschaften der E-Mail einstellen<\/h2>\n<p>Schlie&szlig;lich landen wir in dem Dialog <b>Microsoft 365 Email (Outlook) <\/b>aus Bild 9, in dem die zuvor gew&auml;hlte Connection bereits angezeigt wird.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_013.png\" alt=\"Anlegen einer Beispiel-E-Mail\" width=\"424,6267\" height=\"957,9215\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Anlegen einer Beispiel-E-Mail<\/span><\/b><\/p>\n<p>Hier finden wir die &uuml;blichen Felder f&uuml;r das Verwenden einer E-Mail.<\/p>\n<p>Also tragen wir Werte in einige dieser Felder ein, zum Beispiel in <b>Subject<\/b>, <b>Body Content <\/b>und <b>To Recipients<\/b>. Noch sind diese Werte statisch, sp&auml;ter werden wir diese aus dem per VBA abgesetzten Aufruf entnehmen. Wir wollen allerdings erst einmal ausprobieren, ob das Versenden &uuml;berhaupt funktioniert.<\/p>\n<p>Nach dem Eingeben der Eigenschaften klicken wir auf die Schaltfl&auml;che <b>Save<\/b>.<\/p>\n<h2>Antwort-Element hinzuf&uuml;gen?<\/h2>\n<p>Im Beispiel aus dem oben genannten Artikel haben wir noch ein <b>Response<\/b>-Element angeh&auml;ngt, mit dem wir eine entsprechende Meldung zur&uuml;ckgegeben haben. Hier lohnt es sich eigentlich nicht, ein solches Element einzuf&uuml;gen &#8211; wenn wir die Connection korrekt aufgesetzt haben und die E-Mail-Daten korrekt gef&uuml;llt haben, sollten keine Fehler auftreten.<\/p>\n<p>Das kann jedoch dennoch der Fall sein, zum Beispiel wenn wir extern die Berechtigung f&uuml;r Make f&uuml;r den Zugriff auf Microsoft 365 entziehen. Dann sollte beim Versuch, im Kontext unserer Connection auf Microsoft 365 zuzugreifen, der Status 401 etc. zur&uuml;ckgeliefert werden.<\/p>\n<p>Leider k&ouml;nnen wir diesen Status aber nicht auslesen, da dieser vom Modul <b>Create and Send a Message <\/b>nicht weitergegeben wird. <\/p>\n<h2>Fehlerbehandlung einbauen<\/h2>\n<p>Allerdings gibt es auch in Make eine Fehlerbehandlung. Diese aktivieren wir, indem wir mit der rechten Maustaste auf das Modul <b>Create and Send a Message klicken <\/b>und dort den Befehl <b>Add error handler <\/b>aufrufen (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_018.png\" alt=\"Hinzuf&uuml;gen einer Fehlerbehandlung\" width=\"424,6267\" height=\"416,6317\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Hinzuf&uuml;gen einer Fehlerbehandlung<\/span><\/b><\/p>\n<p>Es erscheint ein neues Modul mit dem Plus-Zeichen, f&uuml;r das wir das Element <b>Webhooks|Webhook response <\/b>einf&uuml;gen. Hier klicken wir in das Feld <b>Body <\/b>und f&uuml;gen die Elemente aus der Auswahl wie in Bild 11 hinzu. Au&szlig;erdem stellen wir Status auf den Wert <b>410 <\/b>ein, der sonst normalerweise nicht verwendet wird.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_019.png\" alt=\"Hinzuf&uuml;gen einer Error-Response\" width=\"700\" height=\"265,3274\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Hinzuf&uuml;gen einer Error-Response<\/span><\/b><\/p>\n<h2>Response im Erfolgsfall einbauen<\/h2>\n<p>Allerdings wollen wir auch noch eine Response einbauen, die beim erfolgreichen Mailversand ausgel&ouml;st wird und ein entsprechendes Ergebnis zur&uuml;ckliefert.<\/p>\n<p>Dazu klicken wir im <b>Create and Send a Message<\/b>-Modul auf das Pluszeichen rechts. Hier f&uuml;gen wir ein weiteres Element des Typs <b>Webhooks|Webhook response <\/b>hinzu. Diesmal stellen wir <b>Status <\/b>auf <b>201 <\/b>und <b>Body <\/b>auf  <b>Erfolgreich versendet <\/b>ein.<\/p>\n<p>Au&szlig;erdem benennen wir die beiden <b>Response<\/b>-Elemente auch direkt um in <b>Webhook Success <\/b>und <b>Webhook Error<\/b>.<\/p>\n<p>Anschlie&szlig;end sieht unser Scenario wie in Bild 12 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_020.png\" alt=\"Die Automation im &Uuml;berblick\" width=\"649,627\" height=\"419,2205\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Die Automation im &Uuml;berblick<\/span><\/b><\/p>\n<h2>Ausf&uuml;hren des Mailversands<\/h2>\n<p>Bevor wir die Automation per VBA aufrufen wollen, testen wir diese einmal. Dazu klicken wir unten links im Make-Fenster in der Men&uuml;leiste auf <b>Run once<\/b> (siehe Bild 13) und dann auf <b>Wait for new data<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_017.png\" alt=\"Run once sorgt f&uuml;r das Lauschen auf einen Aufruf\" width=\"424,6267\" height=\"177,7142\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Run once sorgt f&uuml;r das Lauschen auf einen Aufruf<\/span><\/b><\/p>\n<p>Dadurch lauscht die Automation auf einen Aufruf. Den f&uuml;hren wir aus, indem wir die Prozedur aus Listing 1 in unserer Access-Anwendung ausf&uuml;hren.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Microsoft365_MailVersenden()\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     strWebhookURL = \"https:\/\/hook.eu2.make.com\/5yauwb5ehk63mudiohao3xf4mkc7lwe2\"\r\n     strJSON = \"\"\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             <span style=\"color:blue;\">MsgBox<\/span> \"Erfolgreich gesendet.\"\r\n         <span style=\"color:blue;\">Case <\/span>200\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Erfolgreich aufgerufen, aber nicht gesendet.\"\r\n        <span style=\"color:blue;\">Case <\/span>400\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"JSON ung&uuml;ltig.\"\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Fehler beim Senden: \" & objXMLHTTP.status & \" - \" & objXMLHTTP.statusText\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Die Prozedur f&uuml;hrt einen ersten Aufruf unserer Automation aus.<\/span><\/b><\/p>\n<p>Diese erfordert das Vorhandensein eines Verweises auf die Bibliothek <b>Microsoft XML, v6.0<\/b>. Im gleichen Zuge f&uuml;gen wir auch noch einen Verweis auf die Bibliothek <b>Microsoft Scripting Runtime<\/b> hinzu (siehe Bild 14).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_001.png\" alt=\"Verweise f&uuml;r das VBA-Projekt\" width=\"424,6267\" height=\"334,749\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Verweise f&uuml;r das VBA-Projekt<\/span><\/b><\/p>\n<p>Die Prozedur enth&auml;lt f&uuml;r die Variable <b>strWebhookURL <\/b>die URL, die wir im Element <b>Webhooks|Custom Webhook <\/b>finden. Diese &uuml;bergeben wir der <b>open<\/b>-Methode des <b>XMLHTTP60<\/b>-Objekts.<\/p>\n<p>Danach senden wir die Anfrage mit der <b>send<\/b>-Methode ab. Dabei verwenden wir als Parameter die noch mit einer leeren Zeichenkette gef&uuml;llte Variable <b>strJSON<\/b>. Sp&auml;ter nutzen wir diese, um Informationen wie den Empf&auml;nger der E-Mail, Betreff und Inhalt zu &uuml;bergeben.<\/p>\n<p>Danach werten wir den zur&uuml;ckgelieferten Status aus. Dieser kann verschiedene Werte liefern:<\/p>\n<ul>\n<li><b>200<\/b>: Wird geliefert, wenn der Aufruf an sich erfolgreich war, aber keines der beiden <b>Response<\/b>-Element erreicht wurde. Tritt zum Beispiel auf, wenn man das Scenario nicht gestartet hat. Die Adresse ist dann g&uuml;ltig, aber es gibt nur die allgemeine Erfolgsmeldung.<\/li>\n<li><b>201<\/b>: Bedeutet, dass die E-Mail erfolgreich versendet wurde.<\/li>\n<li><b>410<\/b>: Der R&uuml;ckgabewert f&uuml;r einen Fehler, den wir mit dem <b>Response<\/b>-Element der Fehlerbehandlung definiert haben.<\/li>\n<li><b>400<\/b>: Gesendetes JSON-Dokument ist ung&uuml;ltig.<\/li>\n<\/ul>\n<p>Diese m&ouml;glichen Werte adressieren wir in der <b>Select Case<\/b>-Bedingung. <\/p>\n<h2>N&auml;chster Schritt: Dynamische E-Mail-Daten<\/h2>\n<p>Nun wird es interessant. Wir wollen nun mit der Variablen <b>strJSON <\/b>die Informationen zusammentragen, die f&uuml;r das Versenden der E-Mail verwendet werden sollen &#8211; zun&auml;chst die E-Mail-Adresse des Empf&auml;ngers, der Betreff und der Inhalt der E-Mail.<\/p>\n<p>Dabei k&ouml;nnen wir ein einfaches, aus Name-Wert-Paaren bestehendes JSON-Dokument nutzen.<\/p>\n<p>Dieses stellen wir wie folgt zusammen:<\/p>\n<pre>strJSON = \"{\"\"to\"\":\"\"\" & strTo & \"\"\",\"\"subject\"\":\"\"\" _\r\n     & strSubject & \"\"\",\"\"body\"\":\"\"\" & strBody & \"\"\"}\"<\/pre>\n<p>Den Inhalt der Variablen wollen wir per Parameter an unsere Prozedur &uuml;bergeben, daher &auml;ndern wir die erste Zeile wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Microsoft365_MailVersenden(strTo<span style=\"color:blue;\"> As String<\/span>, _\r\n         strSubject<span style=\"color:blue;\"> As String<\/span>, strBody<span style=\"color:blue;\"> As String<\/span>)<\/pre>\n<p>Den Rest der Prozedur k&ouml;nnen wir vorerst beibehalten.<\/p>\n<p>Nun erledigen wir zwei Dinge:<\/p>\n<ul>\n<li>Wir starten erneut den Empfangsmodus der Automation. Diesmal dauerhaft, da wir noch weitere Aufrufe t&auml;tigen werden.<\/li>\n<li>Au&szlig;erdem schicken wir einmalig die Daten zu der Automation.<\/li>\n<\/ul>\n<h2>Automation dauerhaft aktivieren<\/h2>\n<p>Dazu aktivieren wir die Option <b>Immediately as data arrives <\/b>in Make (siehe Bild 15).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_021.png\" alt=\"Aktivieren der Automation\" width=\"424,6267\" height=\"70,90695\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Aktivieren der Automation<\/span><\/b><\/p>\n<p>Danach erscheint die Meldung aus Bild 16, wo wir <b>Delete old data <\/b>w&auml;hlen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_022.png\" alt=\"L&ouml;schen alter Daten\" width=\"549,6265\" height=\"196,5384\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: L&ouml;schen alter Daten<\/span><\/b><\/p>\n<p>Schlie&szlig;lich w&auml;hlen wir noch aus, dass das Scenario immer sofort ausgef&uuml;hrt werden soll, wenn ein Aufruf eingeht. Dazu stellen wir in Bild 17 den Wert <b>Immediately <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_023.png\" alt=\"Einstellen der Schedule settings\" width=\"424,6267\" height=\"188,723\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Einstellen der Schedule settings<\/span><\/b><\/p>\n<p>Damit ist die Automation nun jederzeit empfangsbereit und wir k&ouml;nnen zum ersten Mal unser JSON-Dokument &uuml;bermitteln.<\/p>\n<p>Das erledigen wir mit dem Aufruf unserer Prozedur &uuml;ber eine weitere Routine (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_MailSenden()\r\n     <span style=\"color:blue;\">Dim <\/span>strTo<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSubject<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     strTo = \"andre@minhorst.com\"\r\n     strSubject = \"Beispielbetreff einer Mail\"\r\n     strBody = \"Lieber Andr&eacute;,\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strBody = strBody & \"hier kommt eine Testmail.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strBody = strBody & \"Viele Gr&uuml;&szlig;e\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strBody = strBody & \"Klaus\"\r\n     <span style=\"color:blue;\">Call<\/span> Microsoft365_MailVersenden(strTo, strSubject, strBody)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Aufruf des Mailversands<\/span><\/b><\/p>\n<p>Wenn wir die Prozedur nun so aufrufen, erhalten wie den Fehler mit der Nummer 400.<\/p>\n<p>Das Problem ist, wie oben bereits angef&uuml;hrt, dass das JSON hier nicht korrekt formatiert ist. In diesem Fall liegt es an den enthaltenen Zeilenumbr&uuml;chen in der Variablen <b>strBody<\/b>. JSON kann mit Zeilenumbr&uuml;chen nicht viel anfangen. Sie m&uuml;ssen hier durch <b>\\n <\/b>ersetzt werden.<\/p>\n<p>Das erledigen wir, indem wir vor dem Zusammenstellen von <b>strJSON <\/b>noch die Zeilenumbr&uuml;che in <b>strBody <\/b>durch <b>\\n <\/b>ersetzen:<\/p>\n<pre>strBody = <span style=\"color:blue;\">Replace<\/span>(strBody, <span style=\"color:blue;\">vbCrLf<\/span>, \"\\n\")<\/pre>\n<p>Beim n&auml;chsten Aufruf erhalten wir die Meldung, dass die Mail erfolgreich versendet wurde. Wir k&ouml;nnen immer wieder mal im Posteingang pr&uuml;fen, ob die verschickten E-Mails auch tats&auml;chlich angekommen sind.<\/p>\n<p>Allerdings enthalten die neuesten Versuche immer noch nicht die Daten, die wir nun mit dem JSON-Dokument &uuml;bersendet haben. Der Grund ist einfach: Wir haben in unserem <b>Microsoft 365 Email<\/b>-Modul immer noch die statischen Elemente.<\/p>\n<p>Diese wollen wir nun ersetzen. Dazu klicken wir erst auf das <b>Microsoft 365 EMail<\/b>-Modul und dann beispielsweise auf das Feld <b>Subject<\/b>.<\/p>\n<p>Und siehe da: Es erscheint ein Popup mit Vorschl&auml;gen zum F&uuml;llen dieses Feldes und dort finden wir auch die Elemente <b>to<\/b>, <b>subject <\/b>und <b>body <\/b>vor (siehe Bild 18).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_024.png\" alt=\"Zuweisen der Parameter\" width=\"649,627\" height=\"397,6503\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Zuweisen der Parameter<\/span><\/b><\/p>\n<p>Also ziehen wir hier das Element <b>subject <\/b>hinein, in <b>Body Content <\/b>f&uuml;gen wir <b>body <\/b>hinzu und in <b>To Recipients <\/b>den Parameter <b>to<\/b> (siehe Bild 19).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_025.png\" alt=\"Zuweisen weiterer Parameter\" width=\"424,6267\" height=\"666,7465\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: Zuweisen weiterer Parameter<\/span><\/b><\/p>\n<p>Hier sehen wir allerdings, dass wir auch noch den Namen des Empf&auml;ngers angeben k&ouml;nnen. Also speichern wir den Zwischenstand zun&auml;chst und erweitern dann unsere Zeile zum Zusammenstellen des JSON-Dokuments wie folgt:<\/p>\n<pre>strJSON = \"{\"\"to\"\":\"\"\" & strTo & \"\"\", \"\"toName\"\":\"\"\" & strToName & \"\"\",\"\"subject\"\":\"\"\" & strSubject & \"\"\",\"\"body\"\":\"\"\" & strBody & \"\"\"}\"<\/pre>\n<p>Dies ist eine L&ouml;sung f&uuml;r nur einen Adressaten &#8211; wir k&ouml;nnten theoretisch auch noch mehrere angeben. Das wollen wir im Rahmen dieses Artikels allerdings nicht tun.<\/p>\n<h2>JSON-Struktur in Make aktualisieren<\/h2>\n<p>Damit m&uuml;ssen wir die Struktur, die Make verarbeitet, allerdings einmal aktualisieren. Dazu klicken wir einmal auf das Modul <b>Webhooks|Custom webhook <\/b>und klicken dort auf die Schaltfl&auml;che <b>Redetermine data structure<\/b>. Das Modul zeigt seine Eigenschaften anschlie&szlig;end wie in Bild 20 an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_026.png\" alt=\"Aktualisieren der Datenstruktur\" width=\"424,6267\" height=\"369,4804\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 20: Aktualisieren der Datenstruktur<\/span><\/b><\/p>\n<p>Nun m&uuml;ssen wir noch einmal auf <b>Run once <\/b>klicken und dann den VBA-Aufruf erneut starten.<\/p>\n<p>&Ouml;ffnen wir anschlie&szlig;end wieder das <b>Microsoft 365 Email<\/b>-Element, k&ouml;nnen wir hier nun auch das Element <b>toName <\/b>einf&uuml;gen (siehe Bild 21).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_027.png\" alt=\"Die fertig konfigurierte E-Mail\" width=\"424,6267\" height=\"723,235\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 21: Die fertig konfigurierte E-Mail<\/span><\/b><\/p>\n<h2>Zeilenumbruch optimieren<\/h2>\n<p>Wenn wir uns eine der Beispielmails ansehen, finden wir schnell das n&auml;chste Problem: Offensichtlich werden die mit <b>\\n <\/b>angegebenen Zeilenumbr&uuml;che nicht als Zeilenumbr&uuml;che dargestellt.<\/p>\n<p>Das ist kein Wunder: Das <b>Microsoft 365 Email<\/b>-Modul versendet standardm&auml;&szlig;ig E-Mails im HTML-Format. Aber auch das ist kein Problem. Wir &auml;ndern einfach die entsprechende Zeile in unserer Funktion wie folgt:<\/p>\n<pre>strBody = <span style=\"color:blue;\">Replace<\/span>(strBody, <span style=\"color:blue;\">vbCrLf<\/span>, \"&lt;br&gt;\")<\/pre>\n<p>Damit gelingen nun auch die Zeilenumbr&uuml;che.<\/p>\n<p>Alternativ k&ouml;nnen wir auch einstellen, ob wir per HTML oder Plain Text versenden wollen. Im <b>Microsoft 365 Email<\/b>-Modul k&ouml;nnen wir dies bereits &uuml;ber die Eigenschaft <b>Body Content Type <\/b>einstellen.<\/p>\n<p>Um dieses per Parameter einzustellen, m&uuml;ssen wir hier die Option <b>Map <\/b>aktivieren (siehe Bild 22). Auch die Eigenschaft <b>Importance <\/b>m&uuml;ssen wir zun&auml;chst f&uuml;r das Mapping aktivieren. Mehr dazu im Anschluss.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_464_028.png\" alt=\"Aktivieren der Einstellbarkeit von Body Content Type\" width=\"424,6267\" height=\"334,4725\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 22: Aktivieren der Einstellbarkeit von Body Content Type<\/span><\/b><\/p>\n<h2>Weitere Einstellungen vornehmen<\/h2>\n<p>Schlie&szlig;lich wollen wir noch weitere Einstellungen vornehmen und auch noch Attachments an die E-Mails anh&auml;ngen. Letzteres ist etwas aufwendiger. Also beginnen wir mit den einfacheren Aufgaben: der Priorit&auml;t, den CC- und BCC-Empf&auml;ngern und der Reply-Adresse.<\/p>\n<h2>Professionelle JSON-Struktur<\/h2>\n<p>Was wir bisher gemacht haben, war funktional: Wir haben Parameter gef&uuml;llt, diese in einem JSON-Konstrukt untergebracht und die Elemente daraus den Eigenschaften des <b>Microsoft 365 Email<\/b>-Moduls zugeordnet.<\/p>\n<p>Um wirklich richtig mit dieser Automation arbeiten zu k&ouml;nnen, wollen wir die Daten nun jedoch genau so &uuml;bergeben, wie das <b>Microsoft 365 Email<\/b>-Modul diese erwartet. Der Aufbau sieht dabei beispielsweise wie folgt aus:<\/p>\n<pre>{\r\n   \"subject\": \"Beispielbetreff einer Mail\",\r\n   \"body\": {\r\n     \"content\": \"Lieber Andr\\u00E9,&lt;br&gt;&lt;br&gt;hier kommt eine Testmail.&lt;br&gt;&lt;br&gt;Viele Gr\\u00FC\\u00DFe&lt;br&gt;Klaus\",\r\n     \"contentType\": \"html\"\r\n   },\r\n   \"toRecipients\": [\r\n     {\r\n       \"address\": \"andre@minhorst.com\",\r\n       \"name\": \"Andr\\u00E9 Minhorst\"\r\n     }\r\n   ],\r\n   \"ccRecipients\": [\r\n     {\r\n       \"address\": \"andre@minhorst.com\",\r\n       \"name\": \"Andr\\u00E9 Minhorst CC\"\r\n     }\r\n   ],\r\n   \"bccRecipients\": [\r\n     {\r\n       \"address\": \"andre@minhorst.com\",\r\n       \"name\": \"Andr\\u00E9 Minhorst CC\"\r\n     }\r\n   ],\r\n   \"replyTo\": [\r\n     {\r\n       \"address\": \"andre@minhorst.com\",\r\n       \"name\": \"Andr\\u00E9 Minhorst\"\r\n     }\r\n   ],\r\n   \"attachments\": [\r\n     {\r\n       \"filename\": \"test.pdf\",\r\n       \"data\": \"JVBERi0xLjYNJeLjz9MNCjE2IDAgb2JqDTw8L0xpbmVhcml6ZWQgMS9MIDE2NDI4L08gMTgvRSAxMTI0NC9OIDEvVCAxNjEyNC9IIFsgNDU3IDE1M2JqDXN0YXJ0eHJlZg0KMTE2DQolJUVPRg0K...\"\r\n     }\r\n   ],\r\n   \"importance\": \"High\"\r\n}<\/pre>\n<p>Dabei wird direkt ber&uuml;cksichtigt, dass wir auch eine Liste von E-Mail-Empf&auml;ngern &uuml;bergeben k&ouml;nnen und nicht nur einen Empf&auml;nger. F&uuml;r mehrere Empf&auml;nger w&uuml;rden wir entsprechend Elemente zum &uuml;bergeordneten Element <b>toRecipients <\/b>zuordnen.<\/p>\n<h2>Funktion zum Zusammenstellen und Senden des JSON-Dokuments<\/h2>\n<p>Dies k&ouml;nnen wir nun in einer Funktion abbilden. Diese hei&szlig;t <b>Microsoft365_MailVersenden<\/b> und erwartet die bereits bekannten Informationen zur E-Mail als Parameter. Den ersten Teil sehen wir in Listing 3.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Microsoft365_MailVersenden(strTo<span style=\"color:blue;\"> As String<\/span>, strToName<span style=\"color:blue;\"> As String<\/span>, strSubject<span style=\"color:blue;\"> As String<\/span>, strBody<span style=\"color:blue;\"> As String<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> strImportance<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strCC<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strCCName<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strBCC<span style=\"color:blue;\"> As <\/span>_\r\n         String, <span style=\"color:blue;\">Optional<\/span> strBCCName<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strReply<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strReplyName<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> _\r\n         strBodyFormat<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strAttachmentPath<span style=\"color:blue;\"> As String<\/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>dicJSON<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>dicBody<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>colToRecipients<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Dim <\/span>dicToRecipients<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>colCCRecipients<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Dim <\/span>dicCCRecipients<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>colBCCRecipients<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Dim <\/span>dicBCCRecipients<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>colReplyToRecipients<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Dim <\/span>dicReplyToRecipients<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>colAttachments<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Dim <\/span>dicAttachment<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>arrBytes()<span style=\"color:blue;\"> As Byte<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBase64<span style=\"color:blue;\"> As String<\/span>\r\n     \r\n     strWebhookURL = \"https:\/\/hook.eu2.make.com\/5yauwb5ehk63mudiohao3xf4mkc7lwe2\"\r\n     strBody = <span style=\"color:blue;\">Replace<\/span>(strBody, <span style=\"color:blue;\">vbCrLf<\/span>, \"&lt;br&gt;\")\r\n     \r\n     dicJSON.Add \"subject\", strSubject\r\n     dicJSON.Add \"body\", dicBody\r\n     dicBody.Add \"content\", strBody\r\n     dicBody.Add \"contentType\", strBodyFormat\r\n     \r\n     dicJSON.Add \"toRecipients\", colToRecipients\r\n     colToRecipients.Add dicToRecipients\r\n     dicToRecipients.Add \"address\", strTo\r\n     dicToRecipients.Add \"name\", strToName\r\n     ...<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Funktion f&uuml;r den Mailversand, Teil 1<\/span><\/b><\/p>\n<p>Wir verwenden hier die Methoden aus dem Artikel <b>JSON-Dokumente per Objektmodell zusammenstellen <\/b>(<b>www.vbentwickler.de\/412<\/b>), um das JSON-Dokument zusammenzustellen.<\/p>\n<p>Hier deklarieren wir zun&auml;chst einige <b>Dictionary<\/b>&#8211; und <b>Collection<\/b>-Elemente.<\/p>\n<p>Wir instanzieren diese auch direkt, indem wir dem Typ das Schl&uuml;sselwort <b>New <\/b>voranstellen. F&uuml;r die Elemente der JSON-Datei mit den geschweiften Klammern ben&ouml;tigen wir <b>Dictionary<\/b>-Elemente, f&uuml;r die mit den eckigen Klammern <b>Collection<\/b>-Auflistungen.<\/p>\n<p>Das Hauptelement enth&auml;lt direkt eine geschweifte Klammer, also verwenden wir ein <b>Dictionary<\/b>-Objekt zur Aufnahme der enthaltenen Elemente wie <b>subject<\/b>, <b>body <\/b>und so weiter:<\/p>\n<pre>{\r\n   \"subject\": \"Beispielbetreff einer Mail\",\r\n   \"body\": {\r\n   ...<\/pre>\n<p>Diesem weisen wir mit der <b>Add<\/b>-Methode ein Name-Wert-Paar aus <b>subject <\/b>und dem Inhalt des Parameters <b>strSubject <\/b>zu. Das Gleiche erledigen wir f&uuml;r <b>body<\/b>, <b>content <\/b>und <b>contentType<\/b>.<\/p>\n<p>Dann folgt die Auflistung der Empf&auml;nger, die in eckige Klammern eingeschlossen ist:<\/p>\n<pre>  \"toRecipients\": [<\/pre>\n<p>Also f&uuml;gen wir <b>dicJSON <\/b>nun das <b>Collection<\/b>-Objekt <b>colToRecipients <\/b>hinzu. Diesem f&uuml;gen wir wiederum das <b>Dictionary<\/b>-Objekt <b>dicToRecipients <\/b>hinzu, das wiederum in den Name-Wert-Paaren <b>address <\/b>und <b>name <\/b>die Werte der Parameter <b>strTo <\/b>und <b>strToName <\/b>erh&auml;lt.<\/p>\n<p>Danach pr&uuml;ft die Funktion, ob Werte f&uuml;r <b>strCC <\/b>und <b>strCCName <\/b>&uuml;bergeben wurden (ab hier siehe Listing 4).<\/p>\n<pre>     ...\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> (<span style=\"color:blue;\">Len<\/span>(strCC) = 0 Or <span style=\"color:blue;\">Len<\/span>(strCCName)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         dicJSON.Add \"ccRecipients\", colCCRecipients\r\n         colCCRecipients.Add dicCCRecipients\r\n         dicCCRecipients.Add \"address\", strCC\r\n         dicCCRecipients.Add \"name\", strCCName\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> (<span style=\"color:blue;\">Len<\/span>(strCC) = 0 Or <span style=\"color:blue;\">Len<\/span>(strCCName)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         dicJSON.Add \"bccRecipients\", colBCCRecipients\r\n         colBCCRecipients.Add dicBCCRecipients\r\n         dicBCCRecipients.Add \"address\", strCC\r\n         dicBCCRecipients.Add \"name\", strCCName\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> (<span style=\"color:blue;\">Len<\/span>(strReply) = 0 Or <span style=\"color:blue;\">Len<\/span>(strReplyName)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         dicJSON.Add \"replyTo\", colReplyToRecipients\r\n         colReplyToRecipients.Add dicReplyToRecipients\r\n         dicReplyToRecipients.Add \"address\", strReply\r\n         dicReplyToRecipients.Add \"name\", strReplyName\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> <span style=\"color:blue;\">Len<\/span>(strAttachmentPath) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         dicJSON.Add \"attachments\", colAttachments\r\n         colAttachments.Add dicAttachment\r\n         dicAttachment.Add \"filename\", \"test.pdf\"\r\n         arrBytes = ReadFileAsBytes(strAttachmentPath)\r\n         strBase64 = EncodeBase64(arrBytes)\r\n         dicAttachment.Add \"data\", strBase64\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     \r\n     dicJSON.Add \"importance\", strImportance\r\n     strJSON = ConvertToJson(dicJSON)\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     objXMLHTTP.Send strJSON\r\n     Select Case objXMLHTTP.status\r\n         <span style=\"color:blue;\">Case <\/span>201\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Erfolgreich gesendet.\" & objXMLHTTP.statusText\r\n         <span style=\"color:blue;\">Case <\/span>200\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Automation l&auml;uft nicht.\"\r\n         <span style=\"color:blue;\">Case <\/span>400\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"JSON ung&uuml;ltig.\"\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Fehler beim Senden: \" & objXMLHTTP.status & \" - \" & objXMLHTTP.statusText\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Funktion f&uuml;r den Mailversand, Teil 2<\/span><\/b><\/p>\n<p>Diese m&uuml;ssen beide vorhanden sein. Dann f&uuml;gt sie auch f&uuml;r diese Informationen einen entsprechenden Abschnitt im JSON-Dokument bereit.<\/p>\n<p>Das Gleiche geschieht anschlie&szlig;end auch noch f&uuml;r den <b>BCC<\/b>-Empf&auml;nger. und f&uuml;r den <b>ReplyTo<\/b>-Abschnitt des JSON-Dokuments.<\/p>\n<p>Danach f&uuml;gt die Funktion die Elemente f&uuml;r die <b>Attachments <\/b>hinzu. Auch davon kann es mehrere geben, daher enth&auml;lt das JSON-Dokument wieder eckige Klammern f&uuml;r die darin enthaltenen und in geschweiften Klammern eingebetteten <b>Attachment<\/b>-Informationen:<\/p>\n<pre>\"attachments\": [<\/pre>\n<p>Die Funktion pr&uuml;ft zuerst, ob ein Attachment hinzugef&uuml;gt werden soll. Falls ja, f&uuml;gt es entsprechend ein <b>Collection<\/b>-Element zu <b>dicJSON <\/b>hinzu und f&uuml;llt dieses dann mit einem <b>Dictionary<\/b>-Element mit den einzelnen Name-Wert-Paaren f&uuml;r die Eigenschaften <b>filename <\/b>und <b>data<\/b>.<\/p>\n<p>Zum F&uuml;llen des <b>data<\/b>-Objekts sind ein paar weitere Schritte n&ouml;tig, die wir gleich vorstellen. Zusammengefasst: Die Datei wird in ein <b>Byte<\/b>-Array konvertiert und dieses wird als <b>Base64<\/b>-kodierte Zeichenkette &uuml;bergeben.<\/p>\n<p>Schlie&szlig;lich h&auml;ngen wir noch das <b>importance<\/b>-Element an, rufen die Anweisungen zum Senden der Anfrage an den Webhook auf und werten das Ergebnis aus.<\/p>\n<h2>Einlesen von Dateien als Byte-Array<\/h2>\n<p>Offen ist noch die Aufgabe, als Attachment zu verwendende Dateien einzulesen und diese in ein Format zu bringen, das wir innerhalb des JSON-Dokuments an den Webhook &uuml;bergeben k&ouml;nnen.<\/p>\n<p>Dazu nutzen wir zwei Funktionen. Die erste hei&szlig;t <b>ReadFileAsBytes <\/b>und erwartet den Namen der einzulesenden Datei als Parameter (siehe Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>ReadFileAsBytes(strFilePath<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Byte<\/span>()\r\n     <span style=\"color:blue;\">Dim <\/span>arrBytes()<span style=\"color:blue;\"> As Byte<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intFile<span style=\"color:blue;\"> As Integer<\/span>\r\n     intFile = FreeFile\r\n     Open strFilePath For Binary<span style=\"color:blue;\"> As <\/span>#intFile\r\n     ReDim arrBytes(0 To LOF(intFile) - 1)\r\n     <span style=\"color:blue;\">If <\/span>LOF(intFile) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         Get #intFile, , arrBytes\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Close #intFile\r\n     ReadFileAsBytes = arrBytes\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Einlesen einer Datei in ein Byte-Array<\/span><\/b><\/p>\n<p>Die Funktion legt eine Dateinummer f&uuml;r den Zugriff fest und &ouml;ffnet die einzulesende Datei mit der <b>Open<\/b>-Anweisung. Dann dimensioniert sie ein Array entsprechend der Gr&ouml;&szlig;e der Datei und liest die Datei in das Array ein. Dann schlie&szlig;t sie die Datei und gibt das Byte-Array aus <b>arrBytes <\/b>als Funktionsergebnis zur&uuml;ck.<\/p>\n<h2>Kodieren eines Byte-Arrays in eine Base64-Zeichenkette<\/h2>\n<p>Dieses Array geben wir gleich weiter an die Funktion <b>EncodeBase64<\/b> (siehe Listing 6). Diese erstellt ein <b>DOMDocument60<\/b>-Objekt und erstellt darin ein Element namens <b>b64<\/b>. Der Datentyp dieses Elements wird auf <b>bin.base64 <\/b>festgelegt. Als Wert schreibt sie einfach den Inhalt des &uuml;bergebenen <b>Byte<\/b>-Arrays in die Eigenschaft <b>nodeTypedValue<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>EncodeBase64(arrBytes()<span style=\"color:blue;\"> As Byte<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objXML<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument60\r\n     <span style=\"color:blue;\">Dim <\/span>objElement<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMElement\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objXML = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument60\r\n     <span style=\"color:blue;\">Set<\/span> objElement = objXML.createElement(\"b64\")\r\n     \r\n     objElement.DataType = \"bin.base64\"\r\n     objElement.nodeTypedValue = arrBytes\r\n     \r\n     EncodeBase64 = <span style=\"color:blue;\">Replace<\/span>(objElement.Text, <span style=\"color:blue;\">vbLf<\/span>, \"\")\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Umwandeln eines Byte-Arrays in eine Base64-Zeichenkette<\/span><\/b><\/p>\n<p>Wenn wir nun den Wert der Eigenschaft <b>Text <\/b>dieses Elements auslesen, erhalten wir die mit Base64 kodierte Zeichenfolge.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Wir haben in diesem Artikel gezeigt, wie Du die Daten f&uuml;r eine E-Mail in einem JSON-Dokument zusammenstellst und dieses durch einen Webhook-Aufruf an den Automationsdienst Make &uuml;bergibst. Dieser enth&auml;lt f&uuml;r diesen Webhook eine Automation, welche die &uuml;bergebenen Daten in eine neue E-Mail eintr&auml;gt und diese schlie&szlig;lich versendet.<\/p>\n<p>Dabei k&ouml;nnen wir hier nur jeweils einen <b>To<\/b>-, <b>CC<\/b>&#8211; und <b>BCC<\/b>-Empf&auml;nger &uuml;bergeben.<\/p>\n<p>In einem weiteren Teil dieser Artikelreihe stellen wir daher eine Klasse vor, die nicht nur das Zusammenstellen von E-Mails noch professioneller gestaltet, sondern auch noch die M&ouml;glichkeit bietet, mehrere Empf&auml;nger f&uuml;r die verschiedenen Kategorien zusammenzustellen. Du findest diesen Artikel unter dem Namen <b>Microsoft 365 E-Mails mit Make per Klasse senden <\/b>(<b>www.vbentwickler.de\/465<\/b>).<\/p>\n<p>Mit den in diesem Artikel vorgestellten Techniken kann man das Versenden von E-Mails leicht auf andere Dienstleister wie zum Beispiel Google Mail anpassen. Hier ist zu beachten, dass dazu ein kostenpflichtiger Google Workspace-Konto n&ouml;tig ist. Mit einer einfachen GMail-Adresse funktioniert dies nicht.<\/p>\n<p>Es ist auch leicht m&ouml;glich, Mails einfach &uuml;ber SMTP zu versenden. Dazu ben&ouml;tigt man in Make statt des Elements zum Versenden von Mails mit Microsoft 365 einfach das Element <b>Send an Email <\/b>aus der Sammlung <b>Email<\/b>.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Outlook365MitMakeAlsOutlookAlternative.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/DAFA50D4-7219-4432-B808-4DD898CB48B4\/vbe_464.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Am liebsten w&auml;re den meisten Microsoft-Anwendern vermutlich, wenn sie einfach ihre vorhandenen VBA-Automationen auf Basis von Microsoft Outlook verwenden k&ouml;nnten. Allerdings zeigt Microsoft aktuell kein Zeichen, dass das klassische Outlook f&uuml;r Desktop mit seiner VBA-Programmierbarkeit  &uuml;ber das Jahr 2029 hinaus unterst&uuml;tzt werden wird. Die neue Outlook-Version ist allerdings noch nicht so weit, dass wir damit so arbeiten k&ouml;nnen, wie es mit der klassischen Version m&ouml;glich ist. Genau genommen wird das, wenn man sich die Pl&auml;ne von Microsoft ansieht, auch zumindest per VBA nicht mehr m&ouml;glich sein. Um zumindest das Versenden von E-Mails von VBA aus zu realisieren, ben&ouml;tigen wir also eine Alternative. In diesem Artikel schauen wir uns an, wie wir Outlook.com &uuml;ber den Automatisierungdienst Make dazu bringen, E-Mails zu versenden &#8211; mit allen Funktionen, die wir von Outlook gewohnt sind.<\/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,44000021,44000012,44000023,44000028],"tags":[],"yst_prominent_words":[],"class_list":["post-55000464","post","type-post","status-publish","format-standard","hentry","category-66022025","category-662025","category-Entity_Framework","category-Interaktiv","category-PowerApps","category-Word_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000464","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=55000464"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000464\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000464"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000464"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000464"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000464"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}