{"id":55001533,"date":"2025-02-01T00:00:00","date_gmt":"2025-02-10T17:52:03","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1533"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Mails_mit_Microsoft_Graph_API_per_Klasse_versenden","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/","title":{"rendered":"Mails mit Microsoft Graph API per Klasse versenden"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/94d79e33b81f4a3facbddd9555c92342\" width=\"1\" height=\"1\" alt=\"\"><b>In den vorherigen Beitr&auml;gen haben wir uns bereits verschiedene Themen rund um die Versendung von E-Mails mit der Microsoft Graph API angeschaut. Dabei haben wir uns angesehen, wie wir einen Outlook-Account erstellen, wie wir daf&uuml;r sorgen, dass wir per Microsoft Graph API auf diesen zugreifen, und wir damit E-Mails versenden. Die erarbeiteten Techniken werden wir in diesem Beitrag noch auf ein neues Level heben: Wir erstellen eine Klasse, die alle notwendigen Eigenschaften und Methoden enth&auml;lt, um die Daten einer E-Mail hinzuzuf&uuml;gen und die E-Mail schlie&szlig;lich zu versenden.<\/b><\/p>\n<p>Bevor Sie die L&ouml;sung aus diesem Beitrag einsetzen, sollten Sie die folgenden Beitr&auml;ge durchgearbeitet haben:<\/p>\n<ul>\n<li><b>Outlook.com mit Access und VBA: Vorbereitungen <\/b>(<b>www.access-im-unternehmen.de\/1531<\/b>)<\/li>\n<li><b>Konto bei Outlook.com anlegen und nutzen <\/b>(<b>www.access-im-unternehmen.de\/1534<\/b>)<\/li>\n<li><b>Mails senden mit der Microsoft Graph API <\/b>(<b>www.access-im-unternehmen.de\/1532<\/b>)<\/li>\n<\/ul>\n<p>Die hier vorgestellte Klasse bedienen wir hier mit einer kleinen Testprozedur. Ein etwas umfangreicheres Beispiel finden Sie im Beitrag <b>Formular f&uuml;r den Mailversand<\/b> (<b>www.access-im-unternehmen.de\/1536<\/b>).<\/p>\n<p>Hier stellen wir ein Formular vor, in das wir alle notwendigen Daten eintragen und mit dem wir den Mailversand starten k&ouml;nnen.<\/p>\n<h2>Ben&ouml;tige Elemente<\/h2>\n<p>Wenn Sie die L&ouml;sung in eine eigenen Anwendung &uuml;bertragen wollen, sind einige Vorbereitungen erforderlich.<\/p>\n<p>Zun&auml;chst einmal ben&ouml;tigen wir Verweise auf die beiden folgenden Bibliotheken:<\/p>\n<ul>\n<li><b>Microsoft Scripting Runtime<\/b> (wegen der Benutzung des <b>Dictionary<\/b>-Objekts)<\/li>\n<li><b>Microsoft XML, v6.0 <\/b>(f&uuml;r die Verwendung der Klasse <b>XMLHTTP60<\/b>, die wir f&uuml;r den Zugriff auf die Microsoft Graph API und weitere Funktionen ben&ouml;tigen)<\/li>\n<\/ul>\n<p>Au&szlig;erdem werden die folgenden beiden Module ben&ouml;tigt:<\/p>\n<ul>\n<li><b>mdlJSON<\/b>: Enth&auml;lt Funktionen zum Parsen und Erstellen von JSON-Dokumenten.<\/li>\n<li><b>mdlJSONDOM<\/b>: Enth&auml;lt Funktionen zum Analysieren von Objektmodellen auf Basis von JSON-Dokumenten.<\/li>\n<li><b>mdlZwischenablage<\/b>: Enth&auml;lt Funktionen, um Inhalte aus Stringvariablen in die Zwischenablage zu kopieren. Ist hilfreich, wenn man gr&ouml;&szlig;ere JSON-Dokumente analysieren m&ouml;chte.<\/li>\n<\/ul>\n<p>Den Rest finden Sie im Klassenmodul <b>clsMail <\/b>und im Modul <b>mdlSampleClass <\/b>mit dem Code zum Verwenden des Klassenmoduls.<\/p>\n<h2>Erstellen des Klassenmoduls<\/h2>\n<p>Das Klassenmodul erstellen wir im VBA-Editor, indem wir den Men&uuml;befehl <b>Einf&uuml;gen|Klassenmodul <\/b>aufrufen. Das neu erstellte Klassenmodul speichern wir direkt unter dem Namen <b>clsMail<\/b>.<\/p>\n<h2>Variablen mit Property Get- und Set-Methoden<\/h2>\n<p>Die Klasse enth&auml;lt einige private Variablen, die wir &uuml;ber entsprechende <b>Get<\/b>&#8211; und <b>Set<\/b>-Prozeduren f&uuml;llen wollen.<\/p>\n<p>Hier sind zun&auml;chst die privaten Membervariablen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_Subject<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_TextContent<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_HTMLContent<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_ToRecipients<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Private <\/span>m_CcRecipients<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Private <\/span>m_BccRecipients<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Private <\/span>m_Attachments<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Private <\/span>m_Username<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_Importance<span style=\"color:blue;\"> As <\/span>eImportance\r\n<span style=\"color:blue;\">Private <\/span>m_ContentType<span style=\"color:blue;\"> As <\/span>eContentType\r\n<span style=\"color:blue;\">Private <\/span>m_ApplicationID<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_SecretID<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_TenantID<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>F&uuml;r die Variable <b>m_Importance <\/b>haben wir eine Enumeration mit den verf&uuml;gbaren Werten angelegt. Diese sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Enum eImportance\r\n     eLow = -1\r\n     eNormal = 0\r\n     eHigh = 1\r\nEnd Enum<\/pre>\n<p>Auch f&uuml;r die Variable <b>ContentType<\/b>, die angibt, ob wir den Inhalt der E-Mail als Text- oder HTML-Inhalt &uuml;bergeben wollen, haben wir eine Enumeration hinzugef&uuml;gt:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Enum eContentType\r\n     eText = 0\r\n     eHTML = 1\r\nEnd Enum<\/pre>\n<h2>Eigenschaften der Klasse<\/h2>\n<p>F&uuml;r die einzelnen Variablen gibt es jeweils eine <b>Property Let<\/b>&#8211; und eine <b>Property Get<\/b>-Prozedur.<\/p>\n<p>Diese erm&ouml;glichen es, dass wir der Klasse nach dem Initialisieren die gew&uuml;nschten Werte zuweisen k&ouml;nnen. Die <b>Property Let<\/b>-Prozedur f&uuml;r die Variable <b>m_ApplicationID <\/b>hei&szlig;t <b>ApplicationID <\/b>und erwartet ihren Wert als <b>String<\/b>-Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>ApplicationID(str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_ApplicationID = str\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Auch wenn es vermutlich nicht so oft vorkommen wird, haben wir auch noch die passende <b>Property Get<\/b>-Prozedur hinzugef&uuml;gt, mit der wir den aktuellen Wert dieser Variablen auslesen k&ouml;nnen:<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>ApplicationID()<span style=\"color:blue;\"> As String<\/span>\r\n     ApplicationID = m_ApplicationID\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Die Eigenschaft <b>ApplicationID <\/b>nimmt eine von drei Informationen entgegen, die wir f&uuml;r die Authentifizierung ben&ouml;tigen beziehungsweise um das Authentifizierungstoken zu holen. Hier sind die weiteren Eigenschaften, die wir verwenden:<\/p>\n<ul>\n<li><b>SecretID<\/b>: Geheimer Client-Schl&uuml;ssel<\/li>\n<li><b>TenantID<\/b>: Verzeichnis-ID<\/li>\n<li><b>ContentType<\/b>: Gibt an, ob Text- oder HTML-Inhalt genutzt werden soll.<\/li>\n<li><b>Importance<\/b>: Priorit&auml;t der E-Mail, angegeben durch einen Wert der Enumeration <b>eImportance<\/b><\/li>\n<li><b>Username<\/b>: Name des Benutzerkontos, &uuml;ber das die E-Mail versendet werden soll<\/li>\n<li><b>Attachments<\/b>: Collection zum Erfassen der Pfade zu den einzuf&uuml;genden Anlagen<\/li>\n<li><b>ToRecipients<\/b>: Collection zum Erfassen der <b>To<\/b>-Empf&auml;nger<\/li>\n<li><b>CcRecipients<\/b>: Collection zum Erfassen der <b>Cc<\/b>-Empf&auml;nger<\/li>\n<li><b>BccRecipients<\/b>: Collection zum Erfassen der <b>Bcc<\/b>-Empf&auml;nger<\/li>\n<li><b>Subject<\/b>: Betreff der E-Mail<\/li>\n<li><b>TextContent<\/b>: Inhalt der E-Mail im Textformat<\/li>\n<li><b>HTMLContent<\/b>: Inhalt der E-Mail im HTML-Format<\/li>\n<\/ul>\n<p>Nachfolgend die <b>Property Let<\/b>&#8211; beziehungsweise <b>Property Set<\/b>-Prozeduren (die <b>Property Get<\/b>-Prozeduren haben wir hier nicht abgebildet, da sie nicht genutzt werden):<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>SecretID(str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_SecretID = str\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>TenantID(str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_TenantID = str\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>ContentType(obj<span style=\"color:blue;\"> As <\/span>eContentType)\r\n     m_ContentType = obj\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>Importance(obj<span style=\"color:blue;\"> As <\/span>eImportance)\r\n     m_Importance = obj\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>Username(str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Username = str\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Attachments(col<span style=\"color:blue;\"> As <\/span>Collection)\r\n     <span style=\"color:blue;\">Set<\/span> m_Attachments = col\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>ToRecipients(col<span style=\"color:blue;\"> As <\/span>Collection)\r\n     <span style=\"color:blue;\">Set<\/span> m_ToRecipients = col\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>CcRecipients(col<span style=\"color:blue;\"> As <\/span>Collection)\r\n     <span style=\"color:blue;\">Set<\/span> m_CcRecipients = col\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>BccRecipients(col<span style=\"color:blue;\"> As <\/span>Collection)\r\n     <span style=\"color:blue;\">Set<\/span> m_BccRecipients = col\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>Subject(str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Subject = str\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>TextContent(str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_TextContent = str\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>HTMLContent(str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_HTMLContent = str\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<h2>Verwenden der Eigenschaften der Klasse<\/h2>\n<p>An dieser Stelle wollen wir bereits einen Beispielaufruf der Klasse zeigen. Immerhin haben wir nun bereits alle M&ouml;glichkeiten der Eingabe von Daten programmiert, die wir ben&ouml;tigen.<\/p>\n<p>Die folgende Prozedur erstellt ein Objekt auf Basis der Klasse <b>clsMail <\/b>und referenziert es mit der Variablen <b>objMail<\/b>. Danach weisen wir die gew&uuml;nschten Informationen zu. Die drei Eigenschaften <b>ApplicationID<\/b>, <b>SecretID <\/b>und <b>TenantID <\/b>speisen wir aus drei entsprechenden Konstanten.<\/p>\n<p>Sofern der Code nicht kompiliert wird (<b>.accde<\/b>), k&ouml;nnte man diese sensiblen Informationen auch an anderer Stelle speichern. Zu Beispielzwecken belassen wir diese jedoch in den Konstanten, die wir au&szlig;erhalb der Klasse in einem anderen Modul wie folgt definieren:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const cStrApplicationID<span style=\"color:blue;\"> As String<\/span> = \"5bdd...b18cd\"\r\n<span style=\"color:blue;\">Public <\/span>Const cStrSecretValue<span style=\"color:blue;\"> As String<\/span> = \"6Ar8...ca2e\"\r\n<span style=\"color:blue;\">Public <\/span>Const cStrTenantID<span style=\"color:blue;\"> As String<\/span> = \"dcc8...4771\"<\/pre>\n<p>Die &uuml;brigen Daten &uuml;bergeben wir wie folgt, wobei wir hier eine E-Mail im HTML-Format erstellen, die nur an einen Empf&auml;nger geschickt wird:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_Class_HTML()\r\n     <span style=\"color:blue;\">Dim <\/span>objMail<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> clsMail\r\n     objMail.ApplicationID = cStrApplicationID\r\n     objMail.SecretID = cStrSecretValue\r\n     objMail.TenantID = cStrTenantID\r\n     objMail.Username = _\r\n         \"andre@andreminhorstverlag.onmicrosoft.com\"\r\n     objMail.ToRecipients.Add \"andre@minhorst.com\"\r\n     objMail.Subject = \"Mein Betreff\"\r\n     objMail.ContentType = eHTML\r\n     objMail.HTMLContent = _\r\n         \"&lt;h1&gt;Meine &Uuml;berschrift&lt;\/h1&gt;&lt;p&gt;Mein Text&lt;\/p&gt;\"\r\n     objMail.Importance = eHigh\r\n     objMail.Send\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Lediglich die Methode <b>Send <\/b>haben wir noch nicht vorgestellt, und au&szlig;erdem m&uuml;ssen wir die Collections noch initialisieren, bevor wir diese mit Daten f&uuml;llen k&ouml;nnen.<\/p>\n<h2>Initialisieren der Collections beim Erstellen der Klasse<\/h2>\n<p>Die Variablen f&uuml;r die Collections, in denen wir die <b>To<\/b>-, <b>Cc<\/b>&#8211; und <b>Bcc<\/b>-Empf&auml;nger und die Pfade zu den einzuf&uuml;genden Anlagen speichern, sollen direkt beim Erstellen der Klasse initialisiert werden.<\/p>\n<p>Dazu legen wir die Ereignisprozedur <b>Class_Initialize <\/b>an, die wir mit den folgenden Befehlen f&uuml;llen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Class_Initialize()\r\n     <span style=\"color:blue;\">Set<\/span> m_ToRecipients = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> m_CcRecipients = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> m_BccRecipients = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> m_Attachments = <span style=\"color:blue;\">New<\/span> Collection\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Senden der E-Mail<\/h2>\n<p>Danach sind wir jedoch bereit, den Sendevorgang zu starten. Dazu rufen wir die Funktion <b>Send <\/b>auf, die wir in Listing 1 finden.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Send()<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>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         strURL = \"https:\/\/graph.microsoft.com\/v1.0\/users\/\" & m_Username & \"\/sendMail\"\r\n         strBody = CreateEMail\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                 Send = <span style=\"color:blue;\">True<\/span>\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;\">Debug.Print<\/span> 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 Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Hauptprozedur zum Senden der E-Mail<\/span><\/b><\/p>\n<p>Die Funktion haben wir bereits im Beitrag <b>Mails senden mit der Microsoft Graph API <\/b>(<b>www.access-im-unternehmen.de\/1532<\/b>) in &auml;hnlicher Form vorgestellt, daher hier eine komprimierte Beschreibung.<\/p>\n<p>Dort war die Funktion allerdings noch eine Prozedur. Hier haben wir uns f&uuml;r eine Funktion entschieden, weil wir einen Wert zur&uuml;ckliefern m&ouml;chten, der angibt, ob die E-Mail erfolgreich versendet werden konnte.<\/p>\n<p>Die Funktion <b>Send <\/b>ruft als Erstes die ebenfalls im obigen Beitrag vorgestellte Funktion <b>GetAccessToken <\/b>auf. Diese liefert im Erfolgsfall das Authentifizierungstoken mit dem Parameter <b>strToken <\/b>zur&uuml;ck.<\/p>\n<p>Nur dann stellen wir die URL f&uuml;r das Versenden der E-Mail zusammen und rufen die Funktion <b>CreateEMail <\/b>auf, mit der wir die als Eigenschaften der Klasse &uuml;bermittelten Informationen als Body unserer Anfrage an die Microsoft Graph API zusammenstellen &#8211; mehr dazu weiter unten -, und speichern diesen in der Variablen <b>strBody<\/b>.<\/p>\n<p>Dann erfolgen die bereits im oben genannten Beitrag beschriebenen Schritte, in denen wir die Anfrage mit der E-Mail an die Microsoft Graph API senden.<\/p>\n<p>Im Erfolgsfall liefert die Funktion dann den Wert <b>True<\/b> an die aufrufende Routine zur&uuml;ck.<\/p>\n<h2>Die Funktion GetAccessToken<\/h2>\n<p>Auch diese Funktion haben wir bereits im Beitrag <b>Mails senden mit der Microsoft Graph API <\/b>(<b>www.access-im-unternehmen.de\/1532<\/b>) vorgestellt, und auch hier haben wir einige &Auml;nderungen vorgenommen, damit sie innerhalb unserer Klasse optimal verwendet werden kann (siehe Listing 2).<\/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\/\" & m_TenantID & \"\/oauth2\/v2.0\/token\"\r\n     strData = \"grant_type=client_credentials\" & _\r\n            \"&client_id=\" & m_ApplicationID & _\r\n            \"&client_secret=\" & m_SecretID & _\r\n            \"&scope=https:\/\/graph.microsoft.com\/.default\"\r\n            <span style=\"color:blue;\">Debug.Print<\/span> strData\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;\">Debug.Print<\/span> strJSON\r\n             <span style=\"color:blue;\">Set<\/span> objJSON = ParseJson(strJSON)\r\n             <span style=\"color:blue;\">Debug.Print<\/span> GetJSONDOM(strJSON, <span style=\"color:blue;\">True<\/span>)\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 2: Die Funktion GetAccessToken holt das Token f&uuml;r den Zugriff auf die Microsoft Graph API.<\/span><\/b><\/p>\n<p>Die wesentlichen &Auml;nderungen liegen darin, bestehen darin, dass nicht mehr, wie im genannten Artikel beschrieben, direkt auf die Konstanten f&uuml;r die <b>ApplicationID<\/b>, <b>SecretID <\/b>und <b>TenantID <\/b>zugreifen, sondern auf die daf&uuml;r angelegten privaten Variablen, die beim Aufruf &uuml;ber die entsprechenden Eigenschaften gef&uuml;llt werden.<\/p>\n<p>Das hei&szlig;t, dass wir beim Zusammenstellen der URL direkt auf <b>m_TenantID <\/b>zugreifen und beim Zusammenstellen der weiteren Daten in <b>strData <\/b>auf <b>m_ApplicationID <\/b>und <b>m_SecretID<\/b>.<\/p>\n<h2>Zusammenstellen der E-Mail<\/h2>\n<p>Den gr&ouml;&szlig;ten Teil der Arbeit erledigt die Funktion <b>CreateEMail<\/b>, die eine Zeichenkette als Ergebnis zur&uuml;ckliefert (siehe Listing 3). Sie deklariert zun&auml;chst einige <b>Dictionary<\/b>&#8211; und <b>Collection<\/b>-Elemente, die im Folgenden zum Zusammenstellen eines Objektmodells dienen, das im weiteren Verlauf zum Erstellen des JSON-Dokuments mit den strukturierten E-Mail-Informationen verwendet wird.<\/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\r\n     <span style=\"color:blue;\">Dim <\/span>colBccRecipients<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection, dicToRecipient<span style=\"color:blue;\"> As <\/span>Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>dicCcRecipient<span style=\"color:blue;\"> As <\/span>Dictionary, dicBccRecipient<span style=\"color:blue;\"> As <\/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\r\n     <span style=\"color:blue;\">Dim <\/span>dicBccEMailAddress<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Dictionary, colAttachments<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Dim <\/span>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>, strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     \r\n     dicMail.Add \"message\", dicMessage\r\n     dicMessage.Add \"subject\", m_Subject\r\n     dicMessage.Add \"body\", dicBody\r\n     Select Case m_ContentType\r\n         <span style=\"color:blue;\">Case <\/span>eText\r\n             dicBody.Add \"contentType\", \"Text\"\r\n             dicBody.Add \"content\", m_TextContent\r\n         <span style=\"color:blue;\">Case <\/span>eHTML\r\n             dicBody.Add \"contentType\", \"HTML\"\r\n             dicBody.Add \"content\", m_HTMLContent\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     \r\n     <span style=\"color:blue;\">Dim <\/span>lng<span style=\"color:blue;\"> As Long<\/span>\r\n     dicMessage.Add \"toRecipients\", colToRecipients\r\n     For lng = 1 To m_ToRecipients.Count\r\n         <span style=\"color:blue;\">Set<\/span> dicToRecipient = <span style=\"color:blue;\">New<\/span> Dictionary\r\n         colToRecipients.Add dicToRecipient\r\n         <span style=\"color:blue;\">Set<\/span> dicToEMailAddress = <span style=\"color:blue;\">New<\/span> Dictionary\r\n         dicToRecipient.Add \"emailAddress\", dicToEMailAddress\r\n         dicToEMailAddress.Add \"address\", m_ToRecipients.Item(lng)\r\n     <span style=\"color:blue;\">Next<\/span> lng\r\n     \r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> m_CcRecipients.Count = 0<span style=\"color:blue;\"> Then<\/span>\r\n         dicMessage.Add \"ccRecipients\", colCcRecipients\r\n         For lng = 1 To m_CcRecipients.Count\r\n             <span style=\"color:blue;\">Set<\/span> dicCcRecipient = <span style=\"color:blue;\">New<\/span> Dictionary\r\n             colCcRecipients.Add dicCcRecipient\r\n             <span style=\"color:blue;\">Set<\/span> dicCcEMailAddress = <span style=\"color:blue;\">New<\/span> Dictionary\r\n             dicCcRecipient.Add \"emailAddress\", dicCcEMailAddress\r\n             dicCcEMailAddress.Add \"address\", \"info@amvshop.de\"\r\n         <span style=\"color:blue;\">Next<\/span> lng\r\n     <span style=\"color:blue;\">End If<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Die Funktion CreateEMail stellt die eigentliche E-Mail zusammen (Teil 1).<\/span><\/b><\/p>\n<p>Diese <b>Collection<\/b>-Objekte haben &uuml;brigens rein gar nichts mit den <b>Collection<\/b>-Objekten zu tun, die wir zum Speichern der Anlagen und der verschiedenen Empf&auml;nger als Elemente der Klasse <b>clsMail <\/b>definiert haben.<\/p>\n<p>Das <b>Dictionary<\/b>-Element <b>dicMail <\/b>ist das Hauptelement des Objektmodells. Diesem f&uuml;gen wir direkt das Element namens <b>message <\/b>mit dem Dictionary <b>dicMessage <\/b>als Element hinzu.<\/p>\n<p><b>dicMessage <\/b>erh&auml;lt als erstes Element ein Name-Wert-Paar mit dem Namen <b>subject <\/b>und dem Inhalt von <b>m_Subject <\/b>als Wert. Weiter geht es direkt mit dem Mailbody, den wir als weiteres <b>Dictionary<\/b>-Element namens <b>dicBody <\/b>unter dem Namen <b>body <\/b>zu <b>dicMessage <\/b>hinzuf&uuml;gen.<\/p>\n<p>Danach folgt eine <b>Select Case<\/b>-Bedingung, die pr&uuml;ft, ob wir es mit einer E-Mail im Text- oder im HTML-Format zu tun haben. Je nach dem gew&auml;hlten Format, das wir aus <b>m_ContentType <\/b>lesen k&ouml;nnen, w&auml;hlen wir einen der folgenden beiden <b>Case<\/b>-Zweige. Der erste f&uuml;llt das Unterelement <b>contentType <\/b>mit dem Wert <b>Text <\/b>und das Unterelement <b>content <\/b>mit dem Inhalt aus <b>m_Textcontent<\/b>.<\/p>\n<p>Anderenfalls f&uuml;llt die Funktion <b>contentType <\/b>mit <b>HTML <\/b>und <b>content <\/b>mit dem Inhalt aus <b>m_HTMLContent<\/b>.<\/p>\n<p>Danach folgen die <b>To<\/b>-Empf&auml;nger, also die eigentlichen Empf&auml;nger der E-Mail. Um diese hinzuzuf&uuml;gen, durchlaufen wir eine Schleife, die mit dem Wert <b>1 <\/b>f&uuml;r die Laufvariable <b>lng <\/b>beginnt und bis zu dem Wert l&auml;uft, welcher der Anzahl der Empf&auml;nger aus der Collection <b>m_ToRecipients <\/b>entspricht.<\/p>\n<p>Zuvor f&uuml;gen wir bereits die Collection <b>colToRecipients <\/b>zu <b>dicMessage <\/b>hinzu. Diese Collection f&uuml;llen wir allerdings erst innerhalb der <b>For&#8230;Next<\/b>-Schleife.<\/p>\n<p>Hier erstellen wir jeweils ein neues <b>Dictionary<\/b>-Objekt in der Variablen <b>dicToRecipient<\/b>. Dieses f&uuml;gen wir der Collection <b>colToRecipients <\/b>hinzu. Dem Dictionary <b>dicToRecipient <\/b>f&uuml;gen wir wiederum ein neues Dictionary namens <b>dicToEMailAddress <\/b>hinzu, das im ersten Element den Namen <b>emailAddress <\/b>und als Wert die entsprechende E-Mail aus der Collection <b>m_ToRecipients <\/b>erfasst.<\/p>\n<p>Auf die gleiche Weise verfahren wir mit den <b>Cc<\/b>&#8211; und den <b>Bcc<\/b>-Empf&auml;ngern (siehe Listing 4).<\/p>\n<pre>     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> m_BccRecipients.Count = 0<span style=\"color:blue;\"> Then<\/span>\r\n         dicMessage.Add \"bccRecipients\", colBccRecipients\r\n         For lng = 1 To m_BccRecipients.Count\r\n             <span style=\"color:blue;\">Set<\/span> dicBccRecipient = <span style=\"color:blue;\">New<\/span> Dictionary\r\n             colBccRecipients.Add dicBccRecipient\r\n             <span style=\"color:blue;\">Set<\/span> dicBccEMailAddress = <span style=\"color:blue;\">New<\/span> Dictionary\r\n             dicBccRecipient.Add \"emailAddress\", dicBccEMailAddress\r\n             dicBccEMailAddress.Add \"address\", \"andre01@minhorst.com\"\r\n         <span style=\"color:blue;\">Next<\/span> lng\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Select Case m_Importance\r\n         <span style=\"color:blue;\">Case <\/span>-1\r\n             dicMessage.Add \"importance\", \"low\"\r\n         <span style=\"color:blue;\">Case <\/span>1\r\n             dicMessage.Add \"importance\", \"high\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     dicMail.Add \"saveToSentItems\", \"true\"\r\n     \r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> m_Attachments.Count = 0<span style=\"color:blue;\"> Then<\/span>\r\n         dicMessage.Add \"attachments\", colAttachments\r\n         For lng = 1 To m_Attachments.Count\r\n             <span style=\"color:blue;\">Set<\/span> dicAttachments = <span style=\"color:blue;\">New<\/span> Dictionary\r\n             colAttachments.Add dicAttachments\r\n             dicAttachments.Add \"@odata.type\", \"#microsoft.graph.fileattachment\"\r\n             dicAttachments.Add \"name\", GetFilename(m_Attachments.Item(lng))\r\n             strFileContent = EncodeFileToBase64(m_Attachments.Item(lng))\r\n             dicAttachments.Add \"contentBytes\", strFileContent\r\n         <span style=\"color:blue;\">Next<\/span> lng\r\n     <span style=\"color:blue;\">End If<\/span>\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: Die Funktion CreateEMail stellt die eigentliche E-Mail zusammen (Teil 2).<\/span><\/b><\/p>\n<p>Der einzige Unterschied ist, dass wir hier noch pr&uuml;fen, ob es &uuml;berhaupt Elemente in den Collections <b>m_CcRecipients <\/b>und <b>m_BccRecipients <\/b>gibt und die Elemente nur in diesem Fall anlegen.<\/p>\n<p>Danach k&uuml;mmern wir uns um die Priorit&auml;t. Hier pr&uuml;fen wir den Wert der Variablen <b>m_Importance <\/b>in einer <b>Select Case<\/b>-Bedingung. Lautet der Wert <b>-1<\/b>, f&uuml;gen wir <b>dicMessage <\/b>ein Element hinzu, das den Namen <b>importance <\/b>und den Wert <b>low <\/b>enth&auml;lt.<\/p>\n<p>Im Falle des Wertes <b>1 <\/b>legen wir das Name-Wert-Paar <b>importance <\/b>und <b>high <\/b>fest.<\/p>\n<p>Danach sorgen wir mit dem Element <b>saveToSentItems <\/b>mit dem Wert <b>true <\/b>daf&uuml;r, dass die Nachricht nach dem Senden im Ordner der gesendeten Elemente gespeichert wird.<\/p>\n<p>Schlie&szlig;lich folgen noch eventuell vorhandene Anlagen.  Auch hier pr&uuml;fen wir zuvor in einer <b>If&#8230;Then<\/b>-Bedingung, ob <b>m_Attachments <\/b>&uuml;berhaupt Elemente enth&auml;lt. Falls ja, f&uuml;gen wir <b>dicMessage <\/b>ein <b>Collection<\/b>-Element namens <b>colAttachments <\/b>hinzu.<\/p>\n<p>Dann durchlaufen wir in einer <b>For&#8230;Next<\/b>-Schleife alle Elemente dieser Collection. Innerhalb der Schleife erstellen wir ein neues <b>Dictionary<\/b>-Element namens <b>dicAttachments <\/b>und f&uuml;gen es der Collection <b>colAttachments <\/b>hinzu.<\/p>\n<p>Dann f&uuml;llen wir <b>dicAttachments <\/b>mit einem Element, dass den Namen <b>@odata.type <\/b>und den Wert <b>#microsoft.graph.fileattachment <\/b>enth&auml;lt. Anschlie&szlig;end k&uuml;mmern wir uns um den Dateinamen, den wir als Wert f&uuml;r das Element  <b>name <\/b>hinterlegen. Den Dateinamen holen wir uns mit der folgenden Hilfsfunktion:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetFilename(strPath<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilename<span style=\"color:blue;\"> As String<\/span>\r\n     strFilename = <span style=\"color:blue;\">Mid<\/span>(strPath, <span style=\"color:blue;\">InStrRev<\/span>(strPath, \"\\\") + 1)\r\n     GetFilename = strFilename\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Danach rufen wir die Funktion <b>EncodeFileToBase64 <\/b>auf und &uuml;bergeben den Pfad der als Anlage hinzuzuf&uuml;genden Datei.<\/p>\n<p>Diese liefert eine Zeichenkette zur&uuml;ck, welche den Dateiinhalt enth&auml;lt, und die wir in die Variable <b>strFileContent <\/b>eintragen. Dies landet schlie&szlig;lich mit dem Element namens <b>contentBytes<\/b> im Dictionary <b>dicAttachments<\/b>.<\/p>\n<p>Das so erzeugte Objektmodell tragen wir nun noch in die Variable <b>strJSON <\/b>ein, die wir als Ergebnis der Funktion <b>CreateMail <\/b>zur&uuml;ckliefern.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Damit haben wir eine Klasse erstellt, die wir mit der oben aufgef&uuml;hrten einfachen Prozedur erstellen, mit den Maildaten f&uuml;llen und zum Versenden der E-Mail nutzen k&ouml;nnen.<\/p>\n<p>In einem weiteren Betrag namens <b>Formular f&uuml;r den Mailversand <\/b>(<b>www.access-im-unternehmen.de\/1536<\/b>) zeigen wir, wie man diese Klasse von einem Formular aus initialisieren und f&uuml;r den Versand von E-Mails nutzen kann.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>OutlookComMitVBASteuern.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/A3ADB3E7-98C7-4F33-934C-B280EFF9518B\/aiu_1533.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In den vorherigen Beitr&auml;gen haben wir uns bereits verschiedene Themen rund um die Versendung von E-Mails mit der Microsoft Graph API angeschaut. Dabei haben wir uns angesehen, wie wir einen Outlook-Account erstellen, wie wir daf&uuml;r sorgen, dass wir per Microsoft Graph API auf diesen zugreifen, und wir damit E-Mails versenden. Die erarbeiteten Techniken werden wir in diesem Beitrag noch auf ein neues Level heben: Wir erstellen eine Klasse, die alle notwendigen Eigenschaften und Methoden enth&auml;lt, um die Daten einer E-Mail hinzuzuf&uuml;gen und die E-Mail schlie&szlig;lich zu versenden.<\/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-55001533","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.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Mails mit Microsoft Graph API per Klasse versenden - 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_mit_Microsoft_Graph_API_per_Klasse_versenden\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mails mit Microsoft Graph API per Klasse versenden\" \/>\n<meta property=\"og:description\" content=\"In den vorherigen Beitr&auml;gen haben wir uns bereits verschiedene Themen rund um die Versendung von E-Mails mit der Microsoft Graph API angeschaut. Dabei haben wir uns angesehen, wie wir einen Outlook-Account erstellen, wie wir daf&uuml;r sorgen, dass wir per Microsoft Graph API auf diesen zugreifen, und wir damit E-Mails versenden. Die erarbeiteten Techniken werden wir in diesem Beitrag noch auf ein neues Level heben: Wir erstellen eine Klasse, die alle notwendigen Eigenschaften und Methoden enth&auml;lt, um die Daten einer E-Mail hinzuzuf&uuml;gen und die E-Mail schlie&szlig;lich zu versenden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-10T17:52:03+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=\"15\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_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Mails mit Microsoft Graph API per Klasse versenden\",\"datePublished\":\"2025-02-10T17:52:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/\"},\"wordCount\":2113,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/94d79e33b81f4a3facbddd9555c92342\",\"articleSection\":[\"1\\\/2025\",\"2025\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/\",\"name\":\"Mails mit Microsoft Graph API per Klasse versenden - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/94d79e33b81f4a3facbddd9555c92342\",\"datePublished\":\"2025-02-10T17:52:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/94d79e33b81f4a3facbddd9555c92342\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/94d79e33b81f4a3facbddd9555c92342\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mails mit Microsoft Graph API per Klasse versenden\"}]},{\"@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 mit Microsoft Graph API per Klasse versenden - 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_mit_Microsoft_Graph_API_per_Klasse_versenden\/","og_locale":"de_DE","og_type":"article","og_title":"Mails mit Microsoft Graph API per Klasse versenden","og_description":"In den vorherigen Beitr&auml;gen haben wir uns bereits verschiedene Themen rund um die Versendung von E-Mails mit der Microsoft Graph API angeschaut. Dabei haben wir uns angesehen, wie wir einen Outlook-Account erstellen, wie wir daf&uuml;r sorgen, dass wir per Microsoft Graph API auf diesen zugreifen, und wir damit E-Mails versenden. Die erarbeiteten Techniken werden wir in diesem Beitrag noch auf ein neues Level heben: Wir erstellen eine Klasse, die alle notwendigen Eigenschaften und Methoden enth&auml;lt, um die Daten einer E-Mail hinzuzuf&uuml;gen und die E-Mail schlie&szlig;lich zu versenden.","og_url":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/","og_site_name":"Access im Unternehmen","article_published_time":"2025-02-10T17:52:03+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Mails mit Microsoft Graph API per Klasse versenden","datePublished":"2025-02-10T17:52:03+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/"},"wordCount":2113,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/94d79e33b81f4a3facbddd9555c92342","articleSection":["1\/2025","2025","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/","url":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/","name":"Mails mit Microsoft Graph API per Klasse versenden - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/94d79e33b81f4a3facbddd9555c92342","datePublished":"2025-02-10T17:52:03+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/94d79e33b81f4a3facbddd9555c92342","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/94d79e33b81f4a3facbddd9555c92342"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Mails_mit_Microsoft_Graph_API_per_Klasse_versenden\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Mails mit Microsoft Graph API per Klasse versenden"}]},{"@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\/55001533","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=55001533"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001533\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}