In Lektion 2.8.5 („Mails verschicken, bestätigt“) hat die Kladde ihre erste Mail über Microsoft Graph gebaut: ein GraphMailSender mit einem HttpClient, einem
TokenCredential und dem JSON von Hand. Das hat funktioniert, aber es war Handarbeit: Adresse zusammensetzen, Token holen, Kopfzeile setzen, Records für jede
Form des JSON. Das Graph-SDK nimmt Ihnen genau diese Arbeit ab. Diese Lektion stellt den Versand um, ergänzt, was ein Büro rund um Mail noch braucht (Anhänge,
Entwurf, Postfach lesen), und hält dabei fest, was an der Lösung aus K2 richtig war und deshalb bleibt.
Ein Wort vorweg zur Ehrlichkeit dieses Kurses: Kein Befehl und kein Code dieser Lektion wurde gegen einen Microsoft-365-Mandanten ausgeführt. Jede Aussage über Adressen, Parameter, Grenzen und Antwortcodes stammt aus Microsoft Learn, gelesen für diese Lektion; Antworten des Dienstes werden beschrieben, nicht vorgeführt. Wo Learn eine Frage offen lässt, steht es als „nicht gelesen“ oder „offen“ im Text. Jede Übung, die einen Mandanten braucht, sagt das und hat einen Teil, der ohne ihn läuft.
| Teil | Was entsteht |
|---|---|
| Entscheidung | SDK statt HttpClient: was bleibt (Port, Outbox, Zuordnung der Antworten), was fällt (Token, Adresse, JSON von Hand) |
| Senden | sendMail mit dem SDK, saveToSentItems, Kopfzeile mit der Kennung, Anhänge, Entwurf |
| Lesen | Postfach lesen: Ordner, $filter, $orderby, $search, nur die Felder, die die Kladde braucht |
| Rechte und Daten | Mail.Send und Mail.Read als Anwendung, Einschränkung auf ein Postfach, Datenschutz |
| Test | eine eigene Schnittstelle als Naht: der Kern sieht nie den GraphServiceClient |
Wo die Kladde steht
Aus K2 haben Sie, und diese Lektion setzt es voraus:
- den Port
IMailSendermitOutgoingMail(Guid Id, string To, string Subject, string Text)und dem ErgebnisDeliveryOutcome(Delivered,NotDelivered,Unclear), Lektion 2.8.5; - die Outbox und ihren Zusteller (Lektion 2.8.4, „Das Outbox-Muster“) mit der Regel „unklar wird nie blind wiederholt“ (Lektion 2.8.3, „Wiederholen, ohne doppelt zu senden“);
- einen
TokenCredentialin der Dienstesammlung: in K2 ein Client-Geheimnis aus den User Secrets, mit K3 (Lektion 3.3.1, verwaltete Identität) ohne Geheimnis; - das Testmuster mit einem nachgemachten Handler (Lektion 2.8.1, „HttpClientFactory und eine fremde Schnittstelle“).
Neu kommt ein Projekt Kladde.Graph dazu. Es hängt von Kladde.Core ab und von den Paketen Microsoft.Graph und Azure.Identity; Kladde.Web verweist darauf. Der
Kern (Kladde.Core) kennt weder das SDK noch Graph, das ist die Regel dieses ganzen Moduls: Die Kladde besitzt ihre Schnittstellen, das SDK steht dahinter.