Send-RjReportEmail

Gebrandete HTML-Berichtsmails aus Azure Automation-Runbooks über Microsoft Graph mithilfe von Markdown-Inhalten senden.

Überblick

Send-RjReportEmail ist der Standard-Helfer für das Versenden von Berichten per E-Mail aus RealmJoin-Reporting-Runbooks. Er nimmt Markdown-Inhalt entgegen, wandelt ihn in eine RealmJoin-gebrandete responsive HTML-E-Mail um, fügt optionale Dateien und eingebettete Branding-Grafiken (Kopf-/Fußzeile) hinzu und sendet das Ergebnis über Microsoft Graph sendMail Endpunkt.

Wesentliche Merkmale:

  • Markdown rein, HTML raus — Runbooks verfassen den Berichtstext in Markdown; die Funktion rendert ihn zu HTML im passenden Design, das in Outlook Classic, New Outlook, Outlook Web, mobilen Clients und im Dunkelmodus funktioniert.

  • Eine E-Mail pro Empfänger — wenn mehrere Empfänger angegeben werden, sendet die Funktion an jede Adresse eine separate Nachricht statt einer einzigen Mail an mehrere Empfänger. Das ist ein datenschutzorientiertes Design mit standardmäßigem BCC.

  • Eingebettete gebrandete Kopf- und Fußzeile — mitgelieferte PNG-Assets werden als CID-Anhänge gesendet und vom eingebetteten HTML referenziert. Beide können vollständig überschrieben oder unterdrückt werden.

  • Selbstverbindend — wenn keine Graph-Sitzung aktiv ist, ruft die Funktion transparent Connect-RjRbGraph (oder Connect-MgGraph -Identity wenn -UseNativeGraphRequest gesetzt ist).

  • Robust — fehlgeschlagene Lesevorgänge von Anhängen, fehlende Bildüberschreibungen oder sendMail-Fehler pro Empfänger werden gemeldet, brechen den gesamten Batch jedoch nicht ab, es sei denn alle Empfänger schlagen fehl.

Zentral verwaltete E-Mail-Einstellungen (Absenderadresse, Service-Desk-Informationen) sind in Runbook Report Settings — dieses Dokument konzentriert sich auf den Aufruf der Funktion aus einem Runbook heraus.

Voraussetzungen

Absenderpostfach

Ein lizenziertes Microsoft 365-Postfach (typischerweise ein dediziertes freigegebenes Postfach wie [email protected]) ist als die Von Adresse erforderlich. Der verwalteten Identität des Automation Account muss erlaubt sein, im Namen dieses Postfachs über Microsoft Graph zu senden, mittels der Mail.Send Anwendungsberechtigung (über RBAC for Applications begrenzt, wenn Sie die Identität auf ein einzelnes Postfach beschränken möchten).

Graph-Berechtigungen

Szenario
Erforderliche Berechtigung

Standard (Invoke-RjRbRestMethodGraph)

Mail.Send (Application) auf dem Absenderpostfach

Mit -UseNativeGraphRequest

Dasselbe — der Aufruf geht weiterhin an /users/{id}/sendMail

Modulverbindung

Standardmäßig verwendet die Funktion Invoke-RjRbRestMethodGraph aus diesem Modul. Wenn keine Verbindung aktiv ist, verbindet sie sich automatisch über Connect-RjRbGraph. Wenn -UseNativeGraphRequest gesetzt ist, prüft die Funktion stattdessen Get-MgContext und ruft Connect-MgGraph -Identity -NoWelcome bei Bedarf auf.

Schnellstart

Der minimale Aufruf benötigt nur den Absender, den Empfänger, einen Betreff und den Markdown-Text:

Dies erzeugt eine vollständig gebrandete RealmJoin-E-Mail mit der Standard-Kopf- und Fußzeile, Unterstützung für Hell-/Dunkelmodus und dem Tenant-/Versionsblock in der Fußzeile.

Parameter

Erforderlich

Parameter
Typ
Beschreibung

EmailFrom

Zeichenfolge

UPN oder Objekt-ID des Absenderpostfachs. Wird verwendet als /users/{id}/sendMail.

EmailTo

Zeichenfolge

Empfängeradresse. Einzelner String — mehrere Adressen werden als kommagetrennte Liste übergeben, siehe unten.

Betreff

Zeichenfolge

Betreffzeile. Wird auch in das HTML eingefügt <title> Element.

MarkdownContent

Zeichenfolge

Berichtstext in Markdown. Siehe Markdown-Unterstützung für die unterstützte Syntax.

Optional — Inhalt

Parameter
Typ
Standard
Beschreibung

Anhänge

String[]

@()

Lokale Dateipfade zum Anhängen. Fehlende Dateien werden protokolliert und übersprungen, nicht lesbare Dateien lösen eine Warnung aus, brechen den Versand jedoch nicht ab. Der MIME-Typ wird aus der Dateiendung abgeleitet.

saveToSentItems

bool

$true

Wenn $true die gesendete Nachricht im Gesendete Elemente. Auf $false für Berichte mit hohem Volumen, um das Postfach nicht zu füllen.

TenantDisplayName

Zeichenfolge

Wird in der Tenant-Info-Box angezeigt, die am Ende des Inhaltsbereichs eingebettet ist.

ReportVersion

Zeichenfolge

Wird in der Tenant-Info-Box angezeigt (verwenden Sie semantische Versionszeichenfolgen, Build-Nummern oder einen Runbook-Namen + Datum).

Optional — Branding

Parameter
Typ
Standard
Beschreibung

HeaderImage

Zeichenfolge

mitgeliefert Assets/Header.png

Lokaler Dateipfad zu einer PNG/JPG/GIF-Datei, die die Standard-Kopfgrafik überschreibt. Das Runbook muss jede URL/jedes Blob im Vorfeld in eine lokale Datei auflösen (z. B. über Get-AzStorageBlobContent). Fehlende/nicht lesbare Überschreibungen fallen auf den mitgelieferten Standard zurück und erzeugen eine Warnung.

FooterImage

Zeichenfolge

mitgeliefert Assets/Footer.png

Gleiche Behandlung wie HeaderImage. Die Fußzeile wird als einzelnes anklickbares Bild gerendert — jeder Branding-Text, jedes Logo oder jede URL muss in das PNG eingebettet sein.

FooterLink

Zeichenfolge

https://www.realmjoin.com

URL, die als href und title des Links verwendet wird, der das Fußzeilenbild umschließt.

NoHeader

Schalter

aus

Unterdrückt die Kopfgrafik vollständig. Wenn kombiniert mit HeaderImage, wird eine Warnung ausgegeben und die Überschreibung ignoriert.

NoFooter

Schalter

aus

Unterdrückt die Fußgrafik und ihren Link vollständig. Wenn kombiniert mit FooterImage oder einer benutzerdefinierten FooterLink, wird eine Warnung ausgegeben und diese Werte werden ignoriert.

Empfohlene Bildabmessungen: 750 × 200 px PNG. Dies entspricht der Breite des E-Mail-Containers und den mitgelieferten Standardwerten. Deutlich andere Seitenverhältnisse können auf schmalen Ansichten verzerrt wirken. Jede Grafik sollte deutlich unter 3 MB bleiben — Graph begrenzt die Gesamt- sendMail anforderung auf 4 MB, und es wird eine Warnung ausgegeben, wenn eines der Bilder 3 MB überschreitet.

Optional — Transport

Parameter
Typ
Standard
Beschreibung

UseNativeGraphRequest

Schalter

aus

Sendet über Invoke-MgGraphRequest (erfordert Microsoft.Graph Modul und eine Connect-MgGraph -Sitzung) statt Invoke-RjRbRestMethodGraph. Verwenden Sie dies, wenn das Runbook auf dem nativen SDK statt auf dem RealmJoin-Wrapper basiert.

Anwendungsbeispiele

Mehrere Empfänger

EmailTo akzeptiert einen einzelnen String mit einer oder mehreren kommagetrennten Adressen. Jede Adresse wird getrimmt, leere Einträge werden entfernt, und für jeden Empfänger wird eine einzelne E-Mail gesendet — die Empfänger sehen einander nicht.

Mit Anhängen und Tenant-Metadaten

Die angehängten Dateien werden zusätzlich dazu, dass sie als echte Anhänge zur Nachricht hinzugefügt werden, in einer Box „Angehängte Dateien“ am Ende des E-Mail-Texts aufgeführt.

Benutzerdefiniertes Branding für Kopf- und Fußzeile

Bringen Sie Ihr eigenes Branding ein, indem Sie die Assets zunächst in einen lokalen Pfad herunterladen und dann die resultierenden Pfade übergeben. Die Funktion ruft URLs nicht selbst ab.

Wenn $headerPath fehlt oder nicht lesbar ist, ist der Aufruf dennoch erfolgreich — der mitgelieferte RealmJoin-Standard wird verwendet und eine Warnung protokolliert.

Einfacher Inhalt (ohne Kopf-/Fußzeile)

Für Benachrichtigungen im Alarmstil, die nicht wie eine Marketing-E-Mail aussehen sollen:

Verwendung des nativen Microsoft.Graph SDK

Wenn das Runbook bereits über Connect-MgGraph (verwaltete Identität) authentifiziert ist und Sie den RealmJoin-Wrapper nicht mit einbeziehen möchten:

Berichtstext aus einer Datei lesen

Für größere Berichte erzeugen Sie den Markdown-Text in einer .md Datei und lesen Sie ihn ein:

Markdown-Unterstützung

Die Funktion enthält einen integrierten, leichtgewichtigen Markdown→HTML-Konverter. Kein externes Markdown-Modul ist erforderlich. Unterstützte Syntax:

Markdown
Hinweise

# … ###### Überschriften

Alle sechs Ebenen. Leerzeichen nach # ist optional. h1 erhält eine Unterstreichung; der Abstand ist auf Outlook abgestimmt.

**fett**, *kursiv*, ~~durchgestrichen~~

Nur inline (darf sich nicht über mehrere Zeilen erstrecken).

`Inline-Code`

Wird dargestellt als <code> mit hellgrauem Hintergrund.

lang ... abgegrenzte Codeblöcke

Das Sprach-Tag bleibt erhalten als class="language-…". Toleriert außerdem fehlerhafte Einfassungen mit einem einzelnen Backtick.

[Text](url) Links

Öffnet in neuem Tab mit noopener noreferrer.

![alt](url) Bilder

Eingefügt als <img> (kein Inline-Anhang-Zauber — die URL muss vom E-Mail-Client erreichbar sein).

- Element / 1. Element Listen

Verschachtelte Listen werden durch Einrückung von 2 Leerzeichen pro Ebene unterstützt. Das Mischen von sortierten und unsortierten Listen schließt die vorherige Liste.

Mehrzeilige Listeneinträge

Eine eingerückte, nicht leere Zeile direkt unter einem <li> wird in denselben Eintrag übernommen mit einem <br> weichen Zeilenumbruch — es ist nicht nötig, jeden Eintrag in einer Zeile zu halten.

- [ ] / - [x] Aufgabenlisten

Wird dargestellt als / Unicode-Zeichen (grün, wenn markiert). <input type="checkbox"> wird absichtlich vermieden, da Outlook Classic Formularsteuerelemente entfernt. Großes [X] gilt ebenfalls als markiert.

> Zitatblock

Mit farbigem linken Rand und schattiertem Hintergrund dargestellt.

> [!NOTE|TIP|IMPORTANT|WARNING|CAUTION]

GitHub-ähnliche Hinweise. Die erste Zeile des Zitatblocks ist der Marker (allein stehend), die verbleibenden >mit - beginnenden Zeilen bilden den Inhalt. Jeder Typ erhält seine eigene Akzentfarbe, sein eigenes Symbol und seine eigene Titelleiste.

---, ***, ___

Horizontale Linie.

|col|col| Tabellen

Standard-Pipe-Tabellen mit :---, :---:, ---: Ausrichtungsangaben. Kopfzeile + Trennzeichen erforderlich.

\\ Escaping

\*, | usw. werden berücksichtigt, sodass wörtliche Markdown-Zeichen ausgegeben werden können.

Nicht unterstützte Elemente sind Fußnoten, Definitionslisten und HTML-Durchreichung — halten Sie sich bei Markdown an die obige Tabelle.

Verhalten und Fehlerbehandlung

Empfängerparsing

EmailTo wird an Kommas getrennt, jeder Eintrag wird getrimmt, und leere Einträge werden entfernt. Wenn die resultierende Liste leer ist, wirft die Funktion Keine gültigen E-Mail-Empfänger im EmailTo-Parameter gefunden. bevor ein Graph-Aufruf erfolgt.

Fehler pro Empfänger

Jeder Empfänger wird unabhängig versendet. Die Funktion verfolgt Erfolge und Fehler:

  • Wenn mindestens ein Versand erfolgreich ist, andere jedoch fehlschlagen, wird eine Warnung mit den fehlgeschlagenen Adressen ausgegeben; die Funktion kehrt normal zurück.

  • Wenn alle Versendevorgänge fehlschlagen, wirft die Funktion Fehlgeschlagen, E-Mail an alle Empfänger zu senden: … sodass das Runbook deutlich fehlschlägt.

Fehler bei Anhängen

  • Fehlende Dateien (Pfad existiert nicht) — ausführlich protokolliert, still übersprungen.

  • Vorhandene, aber nicht lesbare Dateien (gesperrt, Zugriff verweigert) — Warnung ausgegeben, übersprungen, der Rest des Aufrufs wird fortgesetzt.

  • Die Box „Angehängte Dateien“ am Ende der E-Mail listet nur Anhänge auf, die erfolgreich gelesen wurden.

Fehler beim Überschreiben von Bildern

Beide HeaderImage und FooterImage fallen bei jedem Fehler (fehlende Datei, nicht unterstützte Erweiterung, IO-Fehler) auf die mitgelieferten Standards zurück. Eine Warnung beschreibt den Fehler und nennt den verwendeten Standard.

Gesamtgrößenlimit

Graph begrenzt sendMail Anfragen insgesamt auf ca. 4 MB (HTML-Text + alle Anhänge, base64-kodiert). Die Funktion gibt eine Warnung aus, wenn eines der Branding-Bilder 3 MB überschreitet. Wenn die Gesamtlast dennoch 4 MB überschreitet, schlägt der Graph-Aufruf selbst fehl; erwägen Sie:

  • große Daten stattdessen in den Storage Account-Kanal hochzuladen — siehe Runbook Report Settings.

  • Verknüpfen Sie extern gehostete Anhänge, statt sie einzubetten.

  • Tabellarische Daten komprimieren (Compress-Archive) vor dem Anhängen.

Integration mit Runbook Report Settings

Reporting-Runbooks ermitteln die Absenderadresse typischerweise aus dem zentralen RealmJoin-Anpassungs-JSON, statt sie fest zu codieren. Die relevanten Einstellungen sind dokumentiert in Runbook Report Settings. Ein typisches Auflösungsschema in einem Runbook sieht so aus:

Ausgaben

Die Funktion gibt bei Erfolg nichts zurück. Der gesamte Fortschritt wird geschrieben über Write-RjRbLog -Verbose (sichtbar, wenn das Runbook mit -Verbose oder $VerbosePreference = 'Continue'). Warnungen werden zwangsweise über $WarningPreference = 'Continue' geleitet, unabhängig von Überschreibungen auf Aufruferseite, sodass sie zuverlässig im Azure Automation-Jobstream erscheinen.

Siehe auch

  • Runbook Report Settings — zentrale Konfiguration des Absenderpostfachs, der Service-Desk-Informationen und des Storage Account-Zustellkanals.

  • Microsoft Graph: E-Mail senden — zugrunde liegende API.

Zuletzt aktualisiert

War das hilfreich?