{"id":55001532,"date":"2025-02-01T00:00:00","date_gmt":"2025-01-08T11:23:39","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1532"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Mails_senden_mit_der_Microsoft_Graph_API","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/","title":{"rendered":"Mails senden mit der Microsoft Graph API"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/48224d56a8eb47c7843df11aa88024e1\" width=\"1\" height=\"1\" alt=\"\"><b>Im Beitrag &#8222;Outlook.com mit Access und VBA: Vorbereitungen&#8220; haben wir gezeigt, wie wir die Voraussetzungen f&uuml;r den Zugriff auf unser Outlook-Konto mit der Rest-API von Microsoft erschaffen. Dabei haben wir eine Anwendung bei Microsoft registriert und die notwendigen Daten wie die Application-ID, die Tenant-ID und die SecretID ermittelt, die wir f&uuml;r den Zugriff auf die Rest-API ben&ouml;tigen. Au&szlig;erdem haben wir dort die ben&ouml;tigten Berechtigungen eingestellt, hier erst einmal f&uuml;r das Senden von E-Mails. Was wir nun ben&ouml;tigen, sind zwei Dinge: Erstens ein Token, das wir f&uuml;r die Authentifizierung bei der Rest-API ben&ouml;tigen, zweitens den VBA-Code f&uuml;r die Ausf&uuml;hrung der eigentlichen Rest-API-Aufrufe. Damit erstellen wir eine erste Prozedur, mit der wir E-Mails &uuml;ber unser Outlook.com-Konto versenden k&ouml;nnen. Darauf aufbauend werden wir in weiteren Beitr&auml;gen zeigen, wie wir weitere Funktionen implementieren k&ouml;nnen.<\/b><\/p>\n<p>Die Ergebnisse des Beitrags <b>Outlook.com mit Access und VBA: Vorbereitungen <\/b>(<b>www.access-im-unternehmen.de\/1531<\/b>) sehen wie folgt aus:<\/p>\n<ul>\n<li>Wir haben eine neue App registriert.<\/li>\n<li>Wir haben f&uuml;r die Anwendung die Anwendungs-ID (<b>ApplicationID<\/b>), die Verzeichnis-ID (<b>TenantID<\/b>) und den geheimen Client-Schl&uuml;ssel (<b>SecretID<\/b>) ermittelt und in VBA-Konstanten gespeichert.<\/li>\n<li>Wir haben die Berechtigungen f&uuml;r die neue App so eingestellt, dass wir damit E-Mails versenden k&ouml;nnen (<b>Mail.Send<\/b>).<\/li>\n<\/ul>\n<p>Damit steigen wir nun in die Programmierung des Zugriffs auf die Microsoft Graph API f&uuml;r den Zugriff auf unser Outlook-Konto ein.<\/p>\n<p>Dazu f&uuml;hren wir folgende Schritte durch:<\/p>\n<ul>\n<li>Wir f&uuml;gen die notwendigen Verweise hinzu.<\/li>\n<li>Wir f&uuml;gen zwei Module hinzu, die Funktionen f&uuml;r den Umgang mit JSON-Dokumenten liefern.<\/li>\n<li>Wir erstellen eine Basisfunktion zum Durchf&uuml;hren von Rest-API-Aufrufen.<\/li>\n<li>Wir erstellen eine Funktion, mit der wir den Authentifizierungstoken f&uuml;r den Zugriff auf die Rest-API holen k&ouml;nnen.<\/li>\n<li>Wir erstellen eine Funktion, mit der wir eine E-Mail versenden k&ouml;nnen.<\/li>\n<\/ul>\n<h2>Verweise hinzuf&uuml;gen<\/h2>\n<p>Wir ben&ouml;tigen die folgenden beiden Verweise:<\/p>\n<ul>\n<li><b>Microsoft Scripting Runtime<\/b><\/li>\n<li><b>Microsoft XML, v6.0<\/b><\/li>\n<\/ul>\n<p>Der <b>Verweise<\/b>-Dialog sieht nach dem Hinzuf&uuml;gen dieser Verweise wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1532_033.png\" alt=\"Verweise, die wir f&uuml;r den Zugriff auf die Rest-API ben&ouml;tigen\" width=\"499,5589\" height=\"393,8207\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Verweise, die wir f&uuml;r den Zugriff auf die Rest-API ben&ouml;tigen<\/span><\/b><\/p>\n<h2>Module hinzuf&uuml;gen<\/h2>\n<p>Wenn Sie die Beispieldatenbank neu aufbauen wollen, f&uuml;gen Sie nun aus unserer Datenbank die beiden Module <b>mdlJSON <\/b>und <b>mdlJSONDOM <\/b>hinzu.<\/p>\n<p>Das erste enth&auml;lt Methoden, um JSON-Dokumente in ein Objektmodell zu &uuml;berf&uuml;hren und um JSON-Dokumente wieder aus diesem Objektmodell auszulesen.<\/p>\n<p>Das zweite bietet die M&ouml;glichkeit, die Anweisungen auszugeben, die f&uuml;r den Zugriff aller Elemente dieses Objektmodells n&ouml;tig sind. Die genaue Funktionsweise zeigen wir gleich im Praxiseinsatz.<\/p>\n<h2>Token f&uuml;r die Authentifizierung holen<\/h2>\n<p>Es gibt verschieden aufwendige Zugriffsarten f&uuml;r Rest-APIs.<\/p>\n<p>Manche begn&uuml;gen sich damit, dass man ein API-Kennwort auf der Webseite des Anbieters holt und dieses in seinen Aufruf einbettet.<\/p>\n<p>Andere erfordern es, dass man mit den Daten wie der Anwendungs-ID und einem geheimen Schl&uuml;ssel erst noch ein Authentifizierungstoken holt, mit dem man dann den eigentlichen Aufruf durchf&uuml;hren kann. Dies ist hier der Fall, da wir im Kontext der Anwendung auf die Methoden wie <b>Mail.Send<\/b> zugreifen.<\/p>\n<p>Einen Schritt weiter gehen wir, wenn wir eine Anwendung f&uuml;r den Zugriff auf eine Rest-API bauen, die im Kontext eines Benutzers verwendet werden soll. Dann m&uuml;ssten wir zum Holen des Authentifizierungstokens erst noch eine Webseite anzeigen, auf der sich der Benutzer authentifiziert, bevor wir das Token erhalten. Auch dies ist bei der Rest-API m&ouml;glich, die wir hier ansteuern wollen.<\/p>\n<p>F&uuml;r unsere Zwecke reicht allerdings die Methode aus, mit der wir auch das Token &uuml;ber die Rest-API holen.<\/p>\n<p>Das erledigen wir mit der Funktion aus Listing 1. Die Funktion hat zwei Parameter:<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>GetAccessToken(strToken<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>objXMLHTTP<span style=\"color:blue;\"> As <\/span>MSXML2.XMLHTTP60\r\n     <span style=\"color:blue;\">Dim <\/span>objJSON<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strData<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     \r\n     strURL = \"https:\/\/login.microsoftonline.com\/\" & cStrTenantID & \"\/oauth2\/v2.0\/token\"\r\n     \r\n     strData = \"grant_type=client_credentials\" & _\r\n            \"&client_id=1\" & cStrApplicationID & _\r\n            \"&client_secret=\" & cStrSecretValue & _\r\n            \"&scope=https:\/\/graph.microsoft.com\/.default\"\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = CreateObject(\"MSXML2.XMLHTTP\")\r\n     objXMLHTTP.Open \"POST\", strURL, <span style=\"color:blue;\">False<\/span>\r\n     objXMLHTTP.setRequestHeader \"Content-Type\", \"application\/x-www-form-urlencoded\"\r\n     objXMLHTTP.Send strData\r\n     \r\n     Select Case objXMLHTTP.status\r\n         <span style=\"color:blue;\">Case <\/span>200\r\n             strJSON = objXMLHTTP.responseText\r\n             <span style=\"color:blue;\">Set<\/span> objJSON = ParseJson(strJSON)\r\n             GetAccessToken = <span style=\"color:blue;\">True<\/span>\r\n             strToken = objJSON(\"access_token\")\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             strJSON = objXMLHTTP.responseText\r\n             <span style=\"color:blue;\">Set<\/span> objJSON = ParseJson(strJSON)\r\n             strResponse = objJSON.Item(\"error_description\")\r\n             <span style=\"color:blue;\">Debug.Print<\/span> GetJSONDOM(strJSON, <span style=\"color:blue;\">True<\/span>)\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 1: Funktion zum Holen des Access-Tokens<\/span><\/b><\/p>\n<ul>\n<li><b>strToken<\/b>: Wird bei erfolgreichem Aufruf mit dem Token gef&uuml;llt.<\/li>\n<li><b>strResponse<\/b>: Wird im Fehlerfall mit der Fehlermeldung gef&uuml;llt.<\/li>\n<\/ul>\n<p>Das Ergebnis der Funktion selbst ist ein <b>Boolean<\/b>-Wert. Ist dieser <b>True<\/b>, war der Abruf des Tokens erfolgreich, anderenfalls liefert die Funktion den Wert <b>False <\/b>zur&uuml;ck.<\/p>\n<p>Die Funktion deklariert zun&auml;chst eine Objektvariable des Typs <b>XMLHTTP60<\/b>. Diese erm&ouml;glicht den Zugriff auf die Rest-API. In <b>objJSON <\/b>speichern wir das Objektmodell der Antwort im JSON-Format. <b>strURL <\/b>nimmt die Adresse des Endpunktes der Rest-API auf und <b>strData <\/b>die zu &uuml;bergebenden Parameter. In <b>strJSON <\/b>speichern wir schlie&szlig;lich das Ergebnis des Aufrufs.<\/p>\n<p>Die Funktion tr&auml;gt als Erstes die URL f&uuml;r den Endpunkt der Rest-API in die Variable <b>strURL <\/b>ein. Diese besteht aus der Zeichenkette <b>https:\/\/login.microsoftonline.com\/<\/b>, der Tenant-ID sowie der Zeichenkette <b>\/oauth2\/v2.0\/token<\/b>.<\/p>\n<p>Insgesamt sieht die URL beispielsweise wie folgt aus:<\/p>\n<pre>https:\/\/login.microsoftonline.com\/dcc87x1c-44xb-43x8-9x0d-xa1cxxxxxxxx\/oauth2\/v2.0\/token<\/pre>\n<p>Danach folgt die Variable <b>strData<\/b>, in der wir die &uuml;brigen f&uuml;r die Authentifizierung ben&ouml;tigten Informationen einarbeiten.<\/p>\n<p>Der darin gespeicherte Ausdruck sieht anschlie&szlig;end wie folgt aus:<\/p>\n<pre>grant_type=client_credentials&client_id=15bddxdx5-xbf3-x248-bxaa-fd41x6xb18xd&client_secret=6Ax8Q~ZxDxItTxAlycqxPcY6kxZnpfxzitTxca2e&scope=https:\/\/graph.microsoft.com\/.default<\/pre>\n<p>Damit erstellen wir nun eine Instanz von <b>MSXML2.XMLHTTP <\/b>und referenzieren diese mit der Variablen <b>objXMLHTTP<\/b>.<\/p>\n<p>Wir rufen die <b>Open<\/b>-Methode dieses Objekts auf und &uuml;bergeben drei Parameter:<\/p>\n<ul>\n<li><b>bstrMethod<\/b>: Methode des Zugriffs, in diesem Fall <b>POST<\/b><\/li>\n<li><b>bstrURL<\/b>: URL, hier aus der Variablen <b>strURL<\/b><\/li>\n<li><b>varAsync<\/b>: Gibt an, ob der Aufruf synchron oder asynchron erfolgen soll, hier <b>False <\/b>f&uuml;r einen synchronen Aufruf.<\/li>\n<\/ul>\n<p>Mit der <b>setRequestHeader<\/b>-Eigenschaft legen wir den Wert f&uuml;r das Attribut <b>Content-Type <\/b>fest, hier auf <b>application\/x-www-form-urlencoded<\/b>.<\/p>\n<p>Schlie&szlig;lich senden wir die Anfrage mit der <b>Send<\/b>-Methode und dem Parameter <b>strData <\/b>ab.<\/p>\n<p>Durch die Angabe, dass wir einen synchronen Aufruf starten wollen, wird der Code erst fortgesetzt, wenn der Aufruf  beendet ist und das <b>XMLHTTP<\/b>-Objekt das Ergebnis enth&auml;lt.<\/p>\n<p>Wir k&ouml;nnen dann anhand der Eigenschaft <b>Status <\/b>ermitteln, ob der Aufruf erfolgreich war oder ob ein Fehler aufgetreten ist. Liefert <b>Status <\/b>den Wert <b>200 <\/b>zur&uuml;ck, war der Aufruf erfolgreich.<\/p>\n<p>In diesem Fall erhalten wir mit <b>objXMLHTTP.responseText <\/b>die folgende Antwort (hier in gek&uuml;rzter Form), die wir anschlie&szlig;end in die Variable <b>strJSON <\/b>schreiben:<\/p>\n<pre>{\"token_type\":\"Bearer\",\"expires_in\":3599,\"ext_expires_in\":3599,\"access_token\":\"eyJ0e...5_7xA\"}<\/pre>\n<p>Wir erstellen daraus mit der Funktion <b>ParseJson <\/b>ein Objektmodell, das wir mit der Variablen <b>objJSON <\/b>referenzieren und stellen als R&uuml;ckgabewert der Funktion den Wert <b>True <\/b>ein.<\/p>\n<p>Au&szlig;erdem tragen wir f&uuml;r den R&uuml;ckgabeparameter <b>strToken <\/b>das Ergebnis des Ausdrucks <b>objJSON(&#8222;access_token&#8220;)<\/b> ein.<\/p>\n<p>Woher wissen wir, dass wir diesen Ausdruck aufrufen m&uuml;ssen, um das Token auszulesen? <\/p>\n<p>Dazu k&ouml;nnen wir die folgende Zeile zwischenschalten:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> GetJSONDOM(strJSON, <span style=\"color:blue;\">True<\/span>)<\/pre>\n<p>Dies liefert das folgende Ergebnis im Direktbereich des VBA-Editors:<\/p>\n<pre>objJSON.Item(\"token_type\"):Bearer\r\nobjJSON.Item(\"expires_in\"):3599\r\nobjJSON.Item(\"ext_expires_in\"):3599\r\nobjJSON.Item(\"access_token\"):eyJ0eXAiOi...jmubh-6KQ<\/pre>\n<p><b>GetJSONDOM <\/b>hat die Aufgabe, den Inhalt des Objektmodells aus <b>objJSON <\/b>dahingehend zu analysieren, dass es die Aufrufe ausgibt, die n&ouml;tig sind, um die entsprechenden Inhalte abzurufen. Durch das Einstellen des zweiten Parameters <b>bolValues <\/b>auf den Wert <b>True <\/b>werden wie oben angezeigt auch die Werte ausgegeben.<\/p>\n<p>Wenn wir nun gezielt den Wert des Tokens auslesen wollen, m&uuml;ssen wir also auf <b>objJSON.Item(&#8222;access_token&#8220;) <\/b>zugreifen. Wichtig ist, dass wir zuvor mit <b>Set objJSON = ParseJSON(strJSON) <\/b>das Objektmodell erzeugt haben.<\/p>\n<p>Wenn Status einen anderen Wert als <b>200 <\/b>zur&uuml;ckgibt, beispielsweise <b>400 <\/b>oder <b>401<\/b>, ist offensichtlich ein Problem aufgetreten. In diesem Fall untersuchen wir die Antwort ebenfalls und schreiben den Wert aus <b>objJSON.Item(&#8222;error_description&#8220;) <\/b>als R&uuml;ckgabewert in die Variable <b>strResponse<\/b>.<\/p>\n<p>Zum Testen dieser Funktion k&ouml;nnen wir die folgende Prozedur nutzen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_GetAccessToken()\r\n     <span style=\"color:blue;\">Dim <\/span>strToken<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>GetAccessToken(strToken, strResponse) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Token erfolgreich geholt:\"\r\n         <span style=\"color:blue;\">Debug.Print<\/span> strToken\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Token nicht geholt:\"\r\n         <span style=\"color:blue;\">Debug.Print<\/span> strResponse\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese ruft die Funktion <b>GetAccessToken <\/b>mit den Parametern <b>strToken <\/b>und <b>strResponse <\/b>auf, die jeweils leer sind, und gibt die Ergebnisse aus.<\/p>\n<h2>E-Mail via Microsoft Graph API versenden<\/h2>\n<p>Damit k&ouml;nnen wir uns der eigentlichen Aufgabe widmen: Einer Prozedur, mit der wir per VBA eine E-Mail versenden und dabei die Microsoft Graph API nutzen.<\/p>\n<p>Diese Prozedur finden wir in Listing 2.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>SendEmail()\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>strUser<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strToken<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;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     \r\n     <span style=\"color:blue;\">If <\/span>GetAccessToken(strToken, strResponse) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n     \r\n         ''strURL = \"https:\/\/graph.microsoft.com\/v1.0\/me\/sendMail\"\r\n         strUser = \"andre@andreminhorstverlag.onmicrosoft.com\"\r\n         strURL = \"https:\/\/graph.microsoft.com\/v1.0\/users\/\" & strUser & \"\/sendMail\"\r\n         \r\n         strBody = strBody & \"{\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"  \"\"message\"\": {\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"    \"\"subject\"\": \"\"Test E-Mail\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"    \"\"body\"\": {\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"      \"\"contentType\"\": \"\"Text\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"      \"\"content\"\": \"\"Dies ist eine Test-E-Mail &uuml;ber Microsoft Graph.\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"    },\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"    \"\"toRecipients\"\": [\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"      {\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"        \"\"emailAddress\"\": {\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"          \"\"address\"\": \"\"andre@minhorst.com\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"        }\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"      }\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"    ]\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"  },\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"  \"\"saveToSentItems\"\": \"\"true\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strBody = strBody & \"}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         \r\n         <span style=\"color:blue;\">Set<\/span> objXMLHTTP = CreateObject(\"MSXML2.XMLHTTP\")\r\n         objXMLHTTP.Open \"POST\", strURL, <span style=\"color:blue;\">False<\/span>\r\n         objXMLHTTP.setRequestHeader \"Authorization\", \"Bearer \" & strToken\r\n         objXMLHTTP.setRequestHeader \"Content-Type\", \"application\/json\"\r\n         objXMLHTTP.Send strBody\r\n         \r\n         Select Case objXMLHTTP.status\r\n             <span style=\"color:blue;\">Case <\/span>202\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"E-Mail erfolgreich gesendet.\"\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Fehler beim Senden der E-Mail: \" & objXMLHTTP.status & \" - \" & objXMLHTTP.responseText\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Senden einer E-Mail<\/span><\/b><\/p>\n<p>Die Prozedur deklariert wieder ein <b>XMLHTTP60<\/b>-Objekt sowie einige <b>String<\/b>-Variablen.<\/p>\n<p>Sie ruft die Funktion <b>GetAccessToken <\/b>auf, um das Authentifizierungstoken zu holen. Gelingt dies, tr&auml;gt sie die E-Mail-Adresse, die als Absenderadresse verwendet werden soll, in die Variable <b>strUser <\/b>ein.<\/p>\n<p>Wir verwenden hier die Adresse, unter der auch das Microsoftkonto betrieben wird beziehungsweise die Microsoft f&uuml;r uns angelegt hat.<\/p>\n<p>Diese Adresse f&uuml;gen wir in die URL ein, die wir der Variablen <b>strURL <\/b>hinzuf&uuml;gen und die beispielsweise wie folgt aussieht:<\/p>\n<pre>https:\/\/graph.microsoft.com\/v1.0\/users\/andre@andreminhorstverlag.onmicrosoft.com\/sendMail<\/pre>\n<p>Dann stellen wir in der Variablen <b>strBody <\/b>die Eigenschaften und Inhalte der E-Mail zusammen. Der Inhalt sieht in diesem Fall danach wie folgt aus:<\/p>\n<pre>{\r\n   \"message\": {\r\n     \"subject\": \"Test E-Mail\",\r\n     \"body\": {\r\n       \"contentType\": \"Text\",\r\n       \"content\": \"Dies ist eine Test-E-Mail &uuml;ber Microsoft Graph.\"\r\n     },\r\n     \"toRecipients\": [\r\n       {\r\n         \"emailAddress\": {\r\n           \"address\": \"andre@minhorst.com\"\r\n         }\r\n       }\r\n     ]\r\n   },\r\n   \"saveToSentItems\": \"true\"\r\n}<\/pre>\n<p>Hier sehen wir bereits die wichtigsten Elemente einer E-Mail:<\/p>\n<ul>\n<li><b>subject<\/b>: Betreff der E-Mail<\/li>\n<li><b>body<\/b>: Inhalt der E-Mail mit einigen Unterelementen<\/li>\n<li><b>contentType<\/b>: Format des Inhalts, hier <b>Text<\/b>. Alternativ: <b>HTML<\/b>.<\/li>\n<li><b>content<\/b>: Eigentlicher Inhalt der E-Mail<\/li>\n<li><b>toRecipients<\/b>: Auflistung aller <b>To<\/b>-Empf&auml;nger mit den Unterelementen <b>emailAddress <\/b>und <b>address<\/b>.<\/li>\n<li><b>saveToSentItems<\/b>: Gibt an, ob die E-Mail in den gesendeten Objekten gespeichert werden soll.<\/li>\n<\/ul>\n<p>Danach erstellt die Prozedur das <b>XMLHTTP<\/b>-Objekt und referenziert es mit der Variablen <b>objXMLHTTP<\/b>. Es &ouml;ffnet das Objekt mit der <b>Open<\/b>-Methode und &uuml;bergibt die bereits bekannten Parameter.<\/p>\n<p>Sie f&uuml;gt jedoch einen zus&auml;tzlichen <b>RequestHeader <\/b>namens <b>Authorization<\/b> hinzu, der die Zeichenkette <b>Bearer <\/b>und das zuvor ermittelte Token enth&auml;lt.<\/p>\n<p>Schlie&szlig;lich wird die Anfrage mit der <b>Send<\/b>-Methode und dem Inhalt aus <b>strBody <\/b>als Parameter abgesendet.<\/p>\n<p>Das Ergebnis werten wir wieder in einer <b>Select Case<\/b>-Bedingung aus. Diesmal erhalten wir f&uuml;r die erfolgreiche Ausf&uuml;hrung jedoch den Statuswert <b>202 <\/b>zur&uuml;ck, was wir entsprechend ber&uuml;cksichtigen. Im Fehlerfall geben wir den Fehler als Meldung aus.<\/p>\n<p>Hier ist der Versand jedoch erfolgreich und wir finden die E-Mail im Postfach des Empf&auml;ngers wieder (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1532_001.png\" alt=\"Die erfolgreich gesendete E-Mail im neuen Outlook\" width=\"700\" height=\"384,0033\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die erfolgreich gesendete E-Mail im neuen Outlook<\/span><\/b><\/p>\n<h2>N&auml;chste Schritte<\/h2>\n<p>Nachdem wir die erste E-Mail erfolgreich versendet haben, k&ouml;nnen wir die n&auml;chsten Schritte angehen:<\/p>\n<ul>\n<li>Erkunden weiterer Eigenschaften und M&ouml;glichkeiten <\/li>\n<li>Umwandeln der ersten Beispielprozedur mit vorgefertigten Inhalten und Eigenschaften in eine Funktion mit entsprechenden Parametern<\/li>\n<li>Aufruf der Funktion &uuml;ber ein geeignetes Formular<\/li>\n<\/ul>\n<h2>Weitere Eigenschaften und M&ouml;glichkeiten<\/h2>\n<p>W&auml;hrend wir bereits alle notwendigen Elemente rund um das Verwenden der E-Mail vorbereitet haben, gibt es noch einige weitere Informationen, die wir mit einer E-Mail versenden k&ouml;nnen.<\/p>\n<p>Dazu geh&ouml;ren die folgenden:<\/p>\n<ul>\n<li>HTML-Inhalt als Alternative zum Text-Inhalt<\/li>\n<li>Weitere Empf&auml;ngeradressen f&uuml;r <b>To<\/b>, <b>Cc <\/b>und <b>Bcc<\/b>.<\/li>\n<li>Anh&auml;ngen von Anlagen<\/li>\n<li>Einstellen von Eigenschaften wie Priorit&auml;t und Empfangsbest&auml;tigung<\/li>\n<\/ul>\n<p>Wo finden wir diese Informationen? Die erste Informationsquelle sollten die entsprechenden Seiten von Microsoft sein. In diesem Fall schauen wir beispielsweise in der Dokumentation zur Microsoft Graph API nach, wie hier f&uuml;r das <b>mail<\/b>-Element:<\/p>\n<pre>https:\/\/learn.microsoft.com\/en-us\/graph\/api\/resources\/mail-api-overview?view=graph-rest-1.0<\/pre>\n<p>Hier finden wir die verschiedenen Eigenschaften f&uuml;r das <b>mail<\/b>-Element und seine Unterelemente. Dadurch erfahren wir auch, wie das JSON-Dokument f&uuml;r weitere Informationen erweitert werden muss.<\/p>\n<p>Im folgenden Beispiel haben wir bereits einige Erweiterungen vorgenommen. Im ersten Teil finden wir zun&auml;chst statt des Text-Formats einen Body im HTML-Format.<\/p>\n<p>Dazu stellen wir <b>contentType <\/b>auf <b>HTML <\/b>ein und geben f&uuml;r den Inhalt den Text inklusive HTML-Markierungen ein:<\/p>\n<pre>{\r\n   \"message\": {\r\n     \"subject\": \"Betreff der E-Mail (Entwurf)\",\r\n     \"body\": {\r\n       \"contentType\": \"HTML\",\r\n       \"content\": \"&lt;h1&gt;\\u00DCberschrift&lt;\/h1&gt;        &lt;p&gt;Dies ist der Inhalte der E-Mail&lt;\/p&gt;\"\r\n     },<\/pre>\n<p>Die Angabe des Addressaten kennen wir bereits:<\/p>\n<pre>     \"toRecipients\": [ \r\n       { \"emailAddress\": \r\n         { \"address\": \"andre@minhorst.com\" } \r\n       } \r\n     ],<\/pre>\n<p>Einen Empf&auml;nger im <b>Cc:<\/b> geben wir im folgenden Element an:<\/p>\n<pre>     \"ccRecipients\": [ \r\n       { \"emailAddress\": \r\n         { \"address\": \"info@amvshop.de\" } \r\n       }\r\n     ],<\/pre>\n<p>Einen <b>Bcc:<\/b>-Empf&auml;nger, der den &uuml;brigen Empf&auml;ngern nicht angezeigt werden soll, f&uuml;gen wir wie folgt hinzu:<\/p>\n<pre>     \"bccRecipients\": [ \r\n       { \"emailAddress\": \r\n         { \"address\": \"andre01@minhorst.com\" } \r\n       } \r\n     ],<\/pre>\n<p>Die Priorit&auml;t geben wir mit dem Element importance an, welches die Werte <b>low<\/b>, <b>normal <\/b>und <b>high <\/b>annehmen kann:<\/p>\n<pre>     \"importance\": \"high\"\r\n   },\r\n   \"saveToSentItems\": \"true\"\r\n}<\/pre>\n<h2>Attachments hinzuf&uuml;gen<\/h2>\n<p>W&auml;hrend die bisherigen Eigenschaften noch recht einfach zu realisieren waren und nur einige Zeichenketten-Operationen erforderten, ist das Hinzuf&uuml;gen eines Attachments bereits um einiges aufwendiger. Im Objektmodell von Outlook konnten wir dazu einfach die <b>Attachments<\/b>-Auflistung verwenden und den Pfad der hinzuzuf&uuml;genden Datei angeben.<\/p>\n<p>Hier m&uuml;ssen wir zwar eigentlich &#8222;nur&#8220; einige weitere Elemente zum JSON-Dokument hinzuf&uuml;gen. Wir k&ouml;nnen allerdings nicht einfach den Pfad zur hinzuzuf&uuml;genden Datei angeben, sondern wir m&uuml;ssen diese erst in eine Zeichenkette umwandeln und sie dann zum entsprechenden Element im JSON-Dokument hinzuf&uuml;gen.<\/p>\n<h2>Funktion zum Konvertieren einer Datei in eine Base64-Zeichenkette<\/h2>\n<p>Die Funktion, um eine Datei in die entsprechende Zeichenkette umzuwandeln, sehen Sie in Listing 3.<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>EncodeFileToBase64(strPath<span style=\"color:blue;\"> As String<\/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>objNode<span style=\"color:blue;\"> As <\/span>IXMLDOMElement\r\n     <span style=\"color:blue;\">Dim <\/span>objInputStream<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bytData()<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     <span style=\"color:blue;\">Set<\/span> objInputStream = CreateObject(\"ADODB.Stream\")\r\n     objInputStream.Type = 1 '' Bin&auml;rdaten\r\n     objInputStream.Open\r\n     objInputStream.LoadFromFile filePath\r\n     bytData = objInputStream.Read\r\n     objInputStream.Close\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> objNode = objXML.createElement(\"base64\")\r\n     objNode.DataType = \"bin.base64\"\r\n     objNode.nodeTypedValue = bytData\r\n     strBase64 = <span style=\"color:blue;\">Replace<\/span>(objNode.Text, <span style=\"color:blue;\">vbLf<\/span>, \"\")\r\n     \r\n     EncodeFileToBase64 = strBase64\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Funktion zum Erstellen einer Zeichenkette auf Basis einer Datei<\/span><\/b><\/p>\n<p>Die Funktion <b>EncodeFileToBase64<\/b> dient dazu, eine Datei in eine Base64-codierte Zeichenkette zu konvertieren. Diese Codierung ist beispielsweise notwendig, um Dateien in JSON-Dokumenten f&uuml;r Microsoft Graph API-Aufrufe zu &uuml;bertragen.<\/p>\n<p>Zun&auml;chst wird eine <b>ADODB.Stream<\/b>-Instanz erstellt, um die Datei im Bin&auml;rformat zu lesen. Die Methode <b>LoadFromFile <\/b>l&auml;dt den Inhalt der mit dem Parameter <b>strPath <\/b>angegebenen Datei, dessen Bin&auml;rdaten anschlie&szlig;end in ein Byte-Array (<b>bytData<\/b>) &uuml;berf&uuml;hrt werden. Nach dem Lesen wird der Stream geschlossen, um die Ressourcen freizugeben.<\/p>\n<p>Die Base64-Codierung erfolgt mithilfe eines <b>MSXML2.DOMDocument60<\/b>-Objekts. Dabei wird ein XML-Knoten vom Typ <b>base64<\/b> erstellt, dessen Datentyp explizit auf <b>bin.base64<\/b> gesetzt wird. Durch die Zuweisung der Bin&auml;rdaten zu <b>nodeTypedValue <\/b>wird die Base64-Zeichenkette erzeugt, die &uuml;ber die <b>Text<\/b>-Eigenschaft des Knotens abgerufen werden kann. Um m&ouml;gliche Zeilenumbr&uuml;che in der Ausgabe zu vermeiden, entfernt die Funktion diese mithilfe der <b>Replace<\/b>-Funktion.<\/p>\n<p>Die Funktion gibt die resultierende Base64-Zeichenkette als R&uuml;ckgabewert zur&uuml;ck.<\/p>\n<h2>Einbetten der Zeichenkette im JSON-Dokument<\/h2>\n<p>Damit das Attachment korrekt verarbeitet wird, f&uuml;gen wir dieses als weiteres Unterelement des <b>message<\/b>-Elements an. Dazu nutzen wir ein Element namens <b>Attachments<\/b>, dem wir ein oder mehrere Elemente zuweisen k&ouml;nnen. Jedes dieser Elemente hat die folgenden drei Unterelemente:<\/p>\n<ul>\n<li><b>@odata.type<\/b>: Typ des Elements, hier <b>#microsoft.graph.fileattachment<\/b><\/li>\n<li><b>name<\/b>: Dateiname, hier <b>pic001.png<\/b><\/li>\n<li><b>contentBytes<\/b>: Datei in Form einer Base64-Zeichenkette<\/li>\n<\/ul>\n<p>Im folgenden Beispiel haben wir die Zeichenkette stark gek&uuml;rzt:<\/p>\n<pre>{\r\n   \"message\": {\r\n     \"subject\": \"Betreff der E-Mail\",\r\n     \"body\": {\r\n       \"contentType\": \"HTML\",\r\n       \"content\": \"&lt;h1&gt;\\u00DCberschrift&lt;\/h1&gt;&lt;p&gt;Dies ist der Inhalte der E-Mail&lt;\/p&gt;\"\r\n     },\r\n     \"toRecipients\": [ { \"emailAddress\": { \"address\": \"andre@minhorst.com\" } } ],\r\n     \"importance\": \"high\",\r\n     \"attachments\": [\r\n       {\r\n         \"@odata.type\": \"#microsoft.graph.fileattachment\",\r\n         \"name\": \"pic001.png\",\r\n         \"contentBytes\": \"iVBORw0KGgo3oAAALG...TkSuQmCC\"\r\n       }\r\n     ]\r\n   },\r\n   \"saveToSentItems\": \"true\"\r\n}<\/pre>\n<h2>E-Mail &uuml;ber das JSON-Objektmodell zusammenstellen<\/h2>\n<p>Das immer umfangreicher werdende JSON-Dokument k&ouml;nnten wir weiterhin mit einfachen Zeichenketten-Funktionen zusammenstellen.<\/p>\n<p>Dies ist aber recht fehleranf&auml;llig, weil man allzu schnell ein Komma zu viel oder zu wenig schreibt oder eine &ouml;ffnende oder schlie&szlig;ende eckige oder geschweifte Klammer fehlt.<\/p>\n<p>Weiter oben haben wir schon gesehen, dass wir das JSON-Dokument mit dem Ergebnis &uuml;ber ein Objektmodell viel einfacher analysieren und auf die enthaltenen Elemente zugreifen k&ouml;nnen als es mit Zeichenkettenfunktionen m&ouml;glich w&auml;re.<\/p>\n<p>Diesen Weg wollen wir nun in umgekehrter Reihenfolge gehen. Das hei&szlig;t, wir bauen ein Objektmodell aus verschiedenen <b>Dictionary<\/b>&#8211; und <b>Collection<\/b>-Elementen auf und erstellen anschlie&szlig;end mit der Funktion <b>ConvertToJson <\/b>das gew&uuml;nschte JSON-Dokument daraus. Dieses ist dann garantiert frei von den &uuml;blichen Fl&uuml;chtigkeitsfehlern.<\/p>\n<p>Eine Beispielfunktion zum Zusammenstellen eines solchen JSON-Dokuments finden wir in Listing 4.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>CreateEMail()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>dicMail<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary, dicMessage<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary, 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, colCcRecipients<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection, colBccRecipients<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Dim <\/span>dicToRecipient<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary, dicCcRecipient<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary, dicBccRecipient<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>dicToEMailAddress<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary, dicCcEMailAddress<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary, dicBccEMailAddress<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, dicAttachments<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>strFileContent<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     \r\n     dicMail.Add \"message\", dicMessage\r\n     dicMessage.Add \"subject\", \"Betreff der E-Mail (Entwurf)\"\r\n     dicMessage.Add \"body\", dicBody\r\n     dicBody.Add \"contentType\", \"Text\"\r\n     dicBody.Add \"content\", \"Dies ist der Inhalte der E-Mail\"\r\n     \r\n     ''To-Empf&auml;nger\r\n     dicMessage.Add \"toRecipients\", colToRecipients\r\n     colToRecipients.Add dicToRecipient\r\n     dicToRecipient.Add \"emailAddress\", dicToEMailAddress\r\n     dicToEMailAddress.Add \"address\", \"andre@minhorst.com\"\r\n     \r\n     ''Cc-Empf&auml;nger\r\n     dicMessage.Add \"ccRecipients\", colCcRecipients\r\n     colCcRecipients.Add dicCcRecipient\r\n     dicCcRecipient.Add \"emailAddress\", dicCcEMailAddress\r\n     dicCcEMailAddress.Add \"address\", \"info@amvshop.de\"\r\n     \r\n     ''Cc-Empf&auml;nger\r\n     dicMessage.Add \"bccRecipients\", colBccRecipients\r\n     colBccRecipients.Add dicBccRecipient\r\n     dicBccRecipient.Add \"emailAddress\", dicBccEMailAddress\r\n     dicBccEMailAddress.Add \"address\", \"andre01@minhorst.com\"\r\n     \r\n     dicMessage.Add \"importance\", \"high\" ''low, normal, high\r\n     dicMail.Add \"saveToSentItems\", \"true\"\r\n     \r\n     dicMessage.Add \"attachments\", colAttachments\r\n     colAttachments.Add dicAttachments\r\n     dicAttachments.Add \"@odata.type\", \"#microsoft.graph.fileattachment\"\r\n     dicAttachments.Add \"name\", \"pic001.png\"\r\n     strFileContent = EncodeFileToBase64(\"C:\\...\\pic001.png\")\r\n     dicAttachments.Add \"contentBytes\", strFileContent\r\n     \r\n     strJSON = ConvertToJson(dicMail)\r\n     Inzwischenablage strJSON\r\n     CreateEMail = strJSON\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Funktion zum Erstellen des JSON-Dokuments mit dem JSON-Objektmodell<\/span><\/b><\/p>\n<p>Hier deklarieren wir zun&auml;chst einige <b>Dictionary<\/b>&#8211; und <b>Collection<\/b>-Objekte, die wir auch direkt initialisieren.<\/p>\n<p>Dann er&ouml;ffnen wir das Objektmodell, indem wir dem &uuml;bergeordneten <b>Dictionary<\/b>-Objekt <b>dictMail <\/b>ein Unterelement namens <b>message <\/b>mit einem weiteren <b>Dictionary<\/b>-Objekt namens <b>dicMessage <\/b>als Wert hinzuf&uuml;gen.<\/p>\n<p>Dem Objekt <b>dicMessage <\/b>f&uuml;gen wir den Betreff und den Inhalt hinzu, indem wir mit der <b>Add<\/b>-Methode das Element <b>subject <\/b>mit dem entsprechenden Werten hinzuf&uuml;gen.<\/p>\n<p>Den Body f&uuml;gen wir als neues Element hinzu, das den Namen <b>body <\/b>enth&auml;lt und als Wert wieder ein Dictionary, diesmal namens <b>dicBody<\/b>. <b>dicBody <\/b>wiederum enth&auml;lt zwei Unterelemente namens <b>contentType <\/b>und <b>content <\/b>mit den entsprechenden Werten.<\/p>\n<p>Danach folgt der <b>To<\/b>-Empf&auml;nger. F&uuml;r diesen f&uuml;gen wir <b>dicMessage <\/b>einen neuen Eintrag mit dem Namen <b>toRecipients <\/b>und einem <b>Collection<\/b>-Element hinzu. Hier verwenden wir ein <b>Collection<\/b>-Element, weil mehrere gleichartige Elemente untergeordnet werden sollen. Diese sind wiederum <b>Dictionary<\/b>-Elemente, hier mit dem Namen <b>emailAddress <\/b>und einem weiteren Unterelement als Wert, das <b>dicToEMailAdress <\/b>hei&szlig;t und schlie&szlig;lich den Namen <b>address <\/b>und die E-Mail-Adresse als Wert enth&auml;lt.<\/p>\n<p>Auf die gleiche Weise f&uuml;gen wir zwei weitere E-Mail-Adressen unter <b>Cc: <\/b>und <b>Bcc: <\/b>hinzu.<\/p>\n<p>Danach stellen wir mit dem Element <b>importance <\/b>die Priorit&auml;t auf den Wert <b>high <\/b>ein sowie den Wert <b>saveToSentItems<\/b> auf <b>true<\/b>.<\/p>\n<p>Zu guter Letzt folgt noch eine Collection, die wir unter dem Namen <b>attachments <\/b>zum Element <b>dicMessage <\/b>hinzuf&uuml;gen.<\/p>\n<p>Diese erh&auml;lt f&uuml;r jedes Attachment ein Dictionary als Unterelement, dem wir die drei Elemente namens <b>#odata.type<\/b>, <b>name <\/b>und <b>contentBytes <\/b>zuweisen &#8211; samt entsprechender Werte. Der Wert f&uuml;r <b>contentBytes <\/b>ist dabei das Ergebnis der Funktion <b>EncodeFileToBase64 <\/b>f&uuml;r die angegebene Datei.<\/p>\n<p>Schlie&szlig;lich nutzen wir die Funktion <b>ConvertToJson<\/b>, um aus dem Inhalt des <b>Dictionary<\/b>-Objekts <b>dicMail <\/b>das gew&uuml;nschte JSON-Dokument zu generieren, das wir schlie&szlig;lich als Body an die Microsoft Graph API schicken. In Bild 3 sehen wir eine so versendete E-Mail, die neben dem Inhalt im HTML-Format auch noch eine Anlage enth&auml;lt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1532_002.png\" alt=\"Eine mit Anlagen versendete E-Mail\" width=\"699,559\" height=\"482,7776\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Eine mit Anlagen versendete E-Mail<\/span><\/b><\/p>\n<h2>Vorteile gegen&uuml;ber Outlook-Automation und anderen Alternativen wie SMTP <\/h2>\n<p>Mit der hier vorgestellten Vorgehensweise haben wir eine Methode gefunden, die ann&auml;hernd gleichwertig ist zum Fernsteuern von Outlook. Ein wichtiger Unterschied ist, dass wir ein Outlook.com-Konto nutzen m&uuml;ssen, damit es funktioniert. Bei der Automation von Outlook konnten wir mit beliebigen Konten arbeiten, auch mit solchen anderer Anbieter, die wir mit den entsprechenden SMTP-Einstellungen eingebunden haben.<\/p>\n<p>Ein weiterer Unterschied ist, dass wir unser Outlook.com-Konto erst noch f&uuml;r die hier vorgestellte Art des E-Mail-Versands vorbereiten m&uuml;ssen &#8211; siehe Beitrag <b>Outlook.com mit Access und VBA: Vorbereitungen <\/b>(<b>www.access-im-unternehmen.de\/1531<\/b>).<\/p>\n<p>Alternativ k&ouml;nnten wir f&uuml;r den Mailversand auch eine externe Klasse etwa auf Basis von .NET nutzen oder die CDO-Bibliothek.<\/p>\n<p>Der Nachteil dieser M&ouml;glichkeiten ist, dass wir hier nicht im Kontext eines Outlook-Kontos arbeiten und die versendeten E-Mails anschlie&szlig;end nicht im Ordner <b>Gesendete Elemente <\/b>unseres Kontos landen.<\/p>\n<p>Dies ist in vielen F&auml;llen aber aus Gr&uuml;nden der Dokumentation notwendig. In Bild 4 sehen wir, dass die &uuml;ber die Microsoft Graph API gesendeten E-Mails im <b>Gesendete Elemente<\/b>-Ordner unseres Kontos gespeichert werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1532_003.png\" alt=\"Die gesendeten Elemente werden im Ordner Gesendete Elemente angezeigt\" width=\"700\" height=\"573,5007\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die gesendeten Elemente werden im Ordner Gesendete Elemente angezeigt<\/span><\/b><\/p>\n<h2>Funktion zum Versenden von E-Mails parametrisieren<\/h2>\n<p>Damit haben wir die Forschungsarbeiten beendet.<\/p>\n<p>Wir wissen nun, wie wir eine E-Mail &uuml;ber die Microsoft Graph API versenden k&ouml;nnen und davon abgesehen mit den Bordmitteln von VBA auskommen.<\/p>\n<p>Damit k&ouml;nnen wir nun einen Schritt weitergehen und die L&ouml;sung so flexibel gestalten, dass wir Informationen wie die Empf&auml;nger, den Betreff, den Inhalt und die Anlagen zuvor beispielsweise &uuml;ber die Steuerelemente eines Formulars definieren und dann die Funktion mit diesen Werten aufrufen.<\/p>\n<p>Um dies m&ouml;glichst flexibel zu halten, wollen wir dazu eine Klasse programmieren. Diese soll Informationen wie die oben genannten &uuml;ber Eigenschaften aufnehmen und eine Methode namens <b>Send <\/b>anbieten, mit der wir die E-Mail versenden k&ouml;nnen.<\/p>\n<p>Die Programmierung dieser Klasse sehen wir uns in einem weiteren Beitrag namens <b>Mails mit der Microsoft Graph API per Klasse versenden <\/b>(<b>www.access-im-unternehmen.de\/1533<\/b>).<\/p>\n<p>In einem weiteren Beitrag namens <b>Formular f&uuml;r den Mailversand <\/b>(<b>www.access-im-unternehmen.de\/1536<\/b>) schauen wir uns au&szlig;erdem an, wie wir die Klasse von einem Formular aus steuern, das uns au&szlig;erdem das Zusammenstellen der Daten der E-Mail erleichtert.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>OutlookComMitVBASteuern.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/1E5ABEFA-1D03-40EE-8D65-261F15520808\/aiu_1532.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Outlook.com mit Access und VBA: Vorbereitungen&#8220; haben wir gezeigt, wie wir die Voraussetzungen f&uuml;r den Zugriff auf unser Outlook-Konto mit der Rest-API von Microsoft erschaffen. Dabei haben wir eine Anwendung bei Microsoft registriert und die notwendigen Daten wie die Application-ID, die Tenant-ID und die SecretID ermittelt, die wir f&uuml;r den Zugriff auf die Rest-API ben&ouml;tigen. Au&szlig;erdem haben wir dort die ben&ouml;tigten Berechtigungen eingestellt, hier erst einmal f&uuml;r das Senden von E-Mails. Was wir nun ben&ouml;tigen, sind zwei Dinge: Erstens ein Token, das wir f&uuml;r die Authentifizierung bei der Rest-API ben&ouml;tigen, zweitens den VBA-Code f&uuml;r die Ausf&uuml;hrung der eigentlichen Rest-API-Aufrufe. Damit erstellen wir eine erste Prozedur, mit der wir E-Mails &uuml;ber unser Outlook.com-Konto versenden k&ouml;nnen. Darauf aufbauend werden wir in weiteren Beitr&auml;gen zeigen, wie wir weitere Funktionen implementieren k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012025,662025,44000026],"tags":[],"class_list":["post-55001532","post","type-post","status-publish","format-standard","hentry","category-66012025","category-662025","category-Interaktiv"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Mails senden mit der Microsoft Graph API - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mails senden mit der Microsoft Graph API\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Outlook.com mit Access und VBA: Vorbereitungen&quot; haben wir gezeigt, wie wir die Voraussetzungen f&uuml;r den Zugriff auf unser Outlook-Konto mit der Rest-API von Microsoft erschaffen. Dabei haben wir eine Anwendung bei Microsoft registriert und die notwendigen Daten wie die Application-ID, die Tenant-ID und die SecretID ermittelt, die wir f&uuml;r den Zugriff auf die Rest-API ben&ouml;tigen. Au&szlig;erdem haben wir dort die ben&ouml;tigten Berechtigungen eingestellt, hier erst einmal f&uuml;r das Senden von E-Mails. Was wir nun ben&ouml;tigen, sind zwei Dinge: Erstens ein Token, das wir f&uuml;r die Authentifizierung bei der Rest-API ben&ouml;tigen, zweitens den VBA-Code f&uuml;r die Ausf&uuml;hrung der eigentlichen Rest-API-Aufrufe. Damit erstellen wir eine erste Prozedur, mit der wir E-Mails &uuml;ber unser Outlook.com-Konto versenden k&ouml;nnen. Darauf aufbauend werden wir in weiteren Beitr&auml;gen zeigen, wie wir weitere Funktionen implementieren k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-08T11:23:39+00:00\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Mails senden mit der Microsoft Graph API\",\"datePublished\":\"2025-01-08T11:23:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/\"},\"wordCount\":3227,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/48224d56a8eb47c7843df11aa88024e1\",\"articleSection\":[\"1\\\/2025\",\"2025\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/\",\"name\":\"Mails senden mit der Microsoft Graph API - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/48224d56a8eb47c7843df11aa88024e1\",\"datePublished\":\"2025-01-08T11:23:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/48224d56a8eb47c7843df11aa88024e1\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/48224d56a8eb47c7843df11aa88024e1\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_senden_mit_der_Microsoft_Graph_API\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mails senden mit der Microsoft Graph API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Mails senden mit der Microsoft Graph API - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/","og_locale":"de_DE","og_type":"article","og_title":"Mails senden mit der Microsoft Graph API","og_description":"Im Beitrag \"Outlook.com mit Access und VBA: Vorbereitungen\" haben wir gezeigt, wie wir die Voraussetzungen f&uuml;r den Zugriff auf unser Outlook-Konto mit der Rest-API von Microsoft erschaffen. Dabei haben wir eine Anwendung bei Microsoft registriert und die notwendigen Daten wie die Application-ID, die Tenant-ID und die SecretID ermittelt, die wir f&uuml;r den Zugriff auf die Rest-API ben&ouml;tigen. Au&szlig;erdem haben wir dort die ben&ouml;tigten Berechtigungen eingestellt, hier erst einmal f&uuml;r das Senden von E-Mails. Was wir nun ben&ouml;tigen, sind zwei Dinge: Erstens ein Token, das wir f&uuml;r die Authentifizierung bei der Rest-API ben&ouml;tigen, zweitens den VBA-Code f&uuml;r die Ausf&uuml;hrung der eigentlichen Rest-API-Aufrufe. Damit erstellen wir eine erste Prozedur, mit der wir E-Mails &uuml;ber unser Outlook.com-Konto versenden k&ouml;nnen. Darauf aufbauend werden wir in weiteren Beitr&auml;gen zeigen, wie wir weitere Funktionen implementieren k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/","og_site_name":"Access im Unternehmen","article_published_time":"2025-01-08T11:23:39+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Mails senden mit der Microsoft Graph API","datePublished":"2025-01-08T11:23:39+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/"},"wordCount":3227,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/48224d56a8eb47c7843df11aa88024e1","articleSection":["1\/2025","2025","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/","url":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/","name":"Mails senden mit der Microsoft Graph API - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/48224d56a8eb47c7843df11aa88024e1","datePublished":"2025-01-08T11:23:39+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/48224d56a8eb47c7843df11aa88024e1","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/48224d56a8eb47c7843df11aa88024e1"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Mails_senden_mit_der_Microsoft_Graph_API\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Mails senden mit der Microsoft Graph API"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001532","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001532"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001532\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}