> For the complete documentation index, see [llms.txt](https://docs.realmjoin.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.realmjoin.com/de/dev-reference/report-functions/send-rjrbreportemail.md).

# Send-RjRbReportEmail

## Überblick

`Send-RjRbReportEmail` ist der Standard-Helfer zum Versenden von Berichts-E-Mails aus RealmJoin-Reporting-Runbooks. Er nimmt Markdown-Inhalt entgegen, wandelt ihn in eine responsive HTML-E-Mail im RealmJoin-Branding um, fügt optionale Dateien und eingebettete Branding-Grafiken (Header/Footer) hinzu und sendet das Ergebnis über Microsoft Graph `sendMail` Endpunkt.

> **In dieser Version umbenannt.** Die Funktion wurde umbenannt von `Send-RjReportEmail` zu `Send-RjRbReportEmail` für eine konsistente Benennung mit dem Rest des Moduls (`*-RjRb*`). Der alte Name `Send-RjReportEmail` wird als abwärtskompatibler Alias exportiert, sodass vorhandene Runbooks unverändert weiter funktionieren — neue Runbooks sollten jedoch aufrufen `Send-RjRbReportEmail`.

Wesentliche Merkmale:

* **Markdown rein, HTML raus** — Runbooks verfassen den Berichtstext in Markdown; die Funktion rendert ihn zu thematischem HTML, das in Outlook Classic, New Outlook, Outlook Web, mobilen Clients und im Dark Mode 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 E-Mail an mehrere Empfänger. Dies ist ein Datenschutz-/BCC-by-default-Design.
* **Eingebetteter Branding-Header und -Footer** — gebündelte PNG-Assets werden als CID-Anhänge gesendet und vom eingebetteten HTML referenziert. Beide können überschrieben oder vollständig unterdrückt werden.
* **Anpassbare Vorlagenfarben** — die Akzent- und Textfarbe der Vorlage kann pro Aufruf überschrieben werden, sodass Bericht-E-Mails dem Corporate Design eines Kunden folgen können.
* **Integrierter Größenwächter für Anhänge** — ein optionaler kleinerer Fallback-Anhangssatz wird automatisch gesendet, wenn der reguläre Satz das Größenbudget überschreitet oder sein Sendeversuch fehlschlägt.
* **Automatische Verbindung** — wenn keine Graph-Sitzung aktiv ist, ruft die Funktion transparent `Connect-RjRbGraph` (oder `Connect-MgGraph -Identity` wenn `-UseNativeGraphRequest` gesetzt ist).
* **Robust** — fehlgeschlagene Lesevorgänge für Anhänge, ungültige Bild-Überschreibungen, ungültige Farben oder sendMail-Fehler pro Empfänger werden gemeldet, brechen aber nicht den gesamten Batch ab, es sei denn, *alle* Empfänger schlagen fehl.

Zentralisierte E-Mail-Einstellungen (Absenderadresse, Service-Desk-Informationen) sind in [Runbook-Berichtseinstellungen](/de/automatisierung/runbooks/runbook-report-settings.md) dokumentiert — dieses Dokument konzentriert sich auf das Aufrufen der Funktion aus einem Runbook.

## Voraussetzungen

### Absenderpostfach

Als From-Adresse ist ein lizenziertes Microsoft 365-Postfach (typischerweise ein dediziertes freigegebenes Postfach wie `realmjoin-report@contoso.com`) erforderlich. Der verwalteten Identität des Automation-Kontos muss erlaubt sein, im Namen dieses Postfachs über die Graph-Mail.Send-Anwendungsberechtigung zu senden `From` Adresse. Die verwaltete Identität des Automation-Kontos muss per Graph `Mail.Send` Anwendungsberechtigung senden dürfen (eingeschränkt über RBAC für Anwendungen, wenn Sie die Identität auf ein einzelnes Postfach beschränken möchten).

### Graph-Berechtigungen

| Szenario                                | Erforderliche Berechtigung                                     |
| --------------------------------------- | -------------------------------------------------------------- |
| Standard (`Invoke-RjRbRestMethodGraph`) | `Mail.Send` (Anwendung) im Absenderpostfach                    |
| Mit `-UseNativeGraphRequest`            | Gleich — der Aufruf verwendet weiterhin `/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 minimal funktionsfähige Aufruf benötigt nur den Absender, den Empfänger, einen Betreff und den Markdown-Text:

```powershell
Send-RjRbReportEmail `
    -EmailFrom "realmjoin-report@contoso.com" `
    -EmailTo   "alice@contoso.com" `
    -Subject   "Weekly Report" `
    -MarkdownContent @"
# Wochenbericht

Hallo Alice,

hier sind die Zahlen dieser Woche:

- Neu registrierte Geräte: **42**
- Lizenzkonformität: **98%**
"@
```

Dies erzeugt eine vollständig gebrandete RealmJoin-E-Mail mit dem standardmäßigen Header und Footer, Unterstützung für Light-/Dark-Mode und dem Tenant-/Versionsblock im Footer.

## Parameter

### Erforderlich

| Parameter         | Typ      | Beschreibung                                                                                                       |
| ----------------- | -------- | ------------------------------------------------------------------------------------------------------------------ |
| `EmailFrom`       | `string` | Benutzerprinzipalname oder Objekt-ID des Absenderpostfachs. Wird verwendet als `/users/{id}/sendMail`.             |
| `EmailTo`         | `string` | Empfängeradresse. **Einzelner String** — mehrere Adressen werden als kommaseparierte Liste übergeben, siehe unten. |
| `Subject`         | `string` | Betreffzeile. Wird außerdem in das HTML `<title>` -Element eingefügt.                                              |
| `MarkdownContent` | `string` | Berichtstext in Markdown. Siehe [Markdown-Unterstützung](#markdown-support) für die unterstützte Syntax.           |

### Optional — Inhalt

| Parameter           | Typ        | Standard | Beschreibung                                                                                                                                                                                                                              |
| ------------------- | ---------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Anhänge`           | `string[]` | `@()`    | Lokale Dateipfade, die angehängt werden sollen. Fehlende Dateien werden protokolliert und übersprungen, nicht lesbare Dateien erzeugen eine Warnung, brechen den Versand aber nicht ab. Der MIME-Typ wird aus der Dateiendung abgeleitet. |
| `saveToSentItems`   | `bool`     | `$true`  | Wenn `$true` die gesendete Nachricht im Ordner *Sent Items*des Absenderpostfachs gespeichert wird. Auf `$false` für Berichte mit hohem Volumen setzen, um das Postfach nicht zu füllen.                                                   |
| `TenantDisplayName` | `string`   | —        | Wird in der am Ende des Inhaltsbereichs eingebetteten Tenant-Info-Box angezeigt.                                                                                                                                                          |
| `ReportVersion`     | `string`   | —        | 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` | `string`   | gebündelt `Assets/Header.png` | Lokaler Dateipfad zu einer PNG/JPG/GIF-Datei, die die standardmäßige Header-Grafik überschreibt. **Das Runbook muss jede URL/jeden Blob vorher in eine lokale Datei auflösen** (z. B. über `Get-AzStorageBlobContent`). Fehlende/nicht lesbare Überschreibungen greifen auf den gebündelten Standard zurück und erzeugen eine Warnung. |
| `FooterImage` | `string`   | gebündelt `Assets/Footer.png` | Gleiches Vorgehen wie bei `HeaderImage`. Der Footer wird als ein einzelnes anklickbares Bild gerendert — jeder Branding-Text, jedes Logo oder jede URL muss in die PNG eingebettet sein.                                                                                                                                               |
| `FooterLink`  | `string`   | `https://www.realmjoin.com`   | URL verwendet als `href` und `title` des Ankers, der das Footer-Bild umschließt.                                                                                                                                                                                                                                                       |
| `NoHeader`    | `Schalter` | aus                           | Unterdrückt die Header-Grafik vollständig. Wenn mit `HeaderImage`, wird eine Warnung ausgegeben und die Überschreibung ignoriert.                                                                                                                                                                                                      |
| `NoFooter`    | `Schalter` | aus                           | Unterdrückt die Footer-Grafik und ihren Link vollständig. Wenn mit `FooterImage` oder einem benutzerdefinierten `FooterLink`, wird eine Warnung ausgegeben und diese Werte werden ignoriert.                                                                                                                                           |
| `AccentColor` | `string`   | `#f8842c`                     | *Neu in 0.8.9.* 6-stelliger Hex-Farbwert für Tabellenkopfzeilen, Aktionsschaltflächen und die Akzentrahmen der Info-Boxen. Ein leerer oder fehlerhafter Wert erzeugt eine Warnung und fällt auf den Standard zurück.                                                                                                                   |
| `TextColor`   | `string`   | `#011e33`                     | *Neu in 0.8.9.* 6-stelliger Hex-Farbwert für Fließtext, Überschriften, Listenelemente und Code. Gleiches Fallback-Verhalten wie bei `AccentColor`.                                                                                                                                                                                     |

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

**Farben:** ohne `AccentColor`/`TextColor` das generierte HTML ist bytegenau identisch mit früheren Modulversionen — die Standardwerte sind das RealmJoin-Orange und Navy. Statusfarben (grün/rot/bernstein) und neutrale Grautöne werden absichtlich nicht parametriert, da sie Bedeutung transportieren. Überprüfen Sie benutzerdefinierte Farben sowohl im Light- als auch im Dark Mode: Die Inhaltskarte bleibt im Dark Mode weiß, sodass eine sehr helle Textfarbe unlesbar wird.

### Optional — Größenwächter für Anhänge

*Neu in 0.8.9.* Graph weist die gesamte `sendMail` Anfrage zurück, sobald die Nachricht \~4 MB überschreitet. Statt den Bericht fehlschlagen zu lassen, kann die Funktion auf einen kleineren Anhangsatz zurückfallen. Diese Logik war zuvor als eingebetteter Runbook-Helfer `Send-RjRbGuardedReportEmail` dupliziert und ist jetzt Teil der Funktion selbst.

| Parameter                 | Typ        | Standard                   | Beschreibung                                                                                                                                                                                                                                                                                   |
| ------------------------- | ---------- | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `FallbackAttachments`     | `string[]` | —                          | Kleinerer Anhangsatz, der verwendet wird, wenn der reguläre Satz `MaxAttachmentBytes`überschreitet oder wenn der Versand mit dem regulären Satz für jeden Empfänger fehlschlägt. Ohne diesen Parameter gibt es keinen Fallback und ein fehlgeschlagener Versand löst sofort eine Ausnahme aus. |
| `FallbackMarkdownContent` | `string`   | Wert von `MarkdownContent` | Verwendeter Textkörper, wenn der Fallback-Satz gesendet wird — verwenden Sie ihn, um zu erklären, welche Dateien ausgelassen wurden und wie sie zu erhalten sind.                                                                                                                              |
| `MaxAttachmentBytes`      | `lang`     | `2,5 MB`                   | Rohes Größenbudget für den regulären Anhangsatz. Bleibt nach Base64-Kodierung (+33 %), HTML-Textkörper und eingebetteten Branding-Bildern sicher unter dem \~4-MB-Graph-Limit. Wird nur ausgewertet, wenn `FallbackAttachments` angegeben ist.                                                 |

Der Wächter läuft in zwei Stufen:

1. **Vor dem Senden** — wenn der reguläre Satz das Budget überschreitet, wird der Fallback-Satz direkt gesendet und eine Meldung nennt beide Größen.
2. **Nach einem fehlgeschlagenen Versand** — wenn der Versand mit dem regulären Satz für *alle* Empfänger fehlschlägt, wird vor dem Auslösen der Ausnahme ein erneuter Versuch mit dem Fallback-Satz unternommen.

### 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 kommaseparierten Adressen. Jede Adresse wird getrimmt, leere Einträge werden entfernt, und an jeden Empfänger wird eine einzelne E-Mail gesendet **eine einzelne E-Mail pro Empfänger wird gesendet** — die Empfänger sehen einander nicht.

```powershell
Send-RjRbReportEmail `
    -EmailFrom "realmjoin-report@contoso.com" `
    -EmailTo   "alice@contoso.com, bob@contoso.com, team-lead@contoso.com" `
    -Subject   "Monthly Inventory" `
    -MarkdownContent $reportMd
```

### Mit Anhängen und Tenant-Metadaten

```powershell
$csvPath = Join-Path $env:TEMP 'devices.csv'
$exportData | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8

Send-RjRbReportEmail `
    -EmailFrom         "realmjoin-report@contoso.com" `
    -EmailTo           "it-reports@contoso.com" `
    -Subject           "Device Inventory — $(Get-Date -Format 'yyyy-MM-dd')" `
    -MarkdownContent   $reportMd `
    -Attachments       @($csvPath, "$env:TEMP\summary.xlsx") `
    -TenantDisplayName "Contoso Ltd" `
    -ReportVersion     "DeviceInventory v1.4.2"
```

Die angehängten Dateien werden zusätzlich zu ihren echten Anhängen in einer Box „Angehängte Dateien“ am unteren Rand des E-Mail-Textkörpers aufgelistet.

### Benutzerdefiniertes Header-/Footer-Branding

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

```powershell
# Branding-Assets aus Azure Blob Storage in den Temp-Ordner des Runbooks auflösen
$headerPath = Join-Path $env:TEMP 'contoso-header.png'
$footerPath = Join-Path $env:TEMP 'contoso-footer.png'

Get-AzStorageBlobContent -Container 'branding' -Blob 'header.png' -Destination $headerPath -Force | Out-Null
Get-AzStorageBlobContent -Container 'branding' -Blob 'footer.png' -Destination $footerPath -Force | Out-Null

Send-RjRbReportEmail `
    -EmailFrom        "realmjoin-report@contoso.com" `
    -EmailTo          "alice@contoso.com" `
    -Subject          "Branded Report" `
    -MarkdownContent  $reportMd `
    -HeaderImage      $headerPath `
    -FooterImage      $footerPath `
    -FooterLink       "https://intranet.contoso.com/it-reports"
```

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

### Benutzerdefinierte Vorlagenfarben

Passen Sie die E-Mail an das Corporate Design eines Kunden an. Beide Parameter sind unabhängig — wenn nur die Akzentfarbe überschrieben wird, bleibt die Standard-Textfarbe erhalten:

```powershell
Send-RjRbReportEmail `
    -EmailFrom       "realmjoin-report@contoso.com" `
    -EmailTo         "alice@contoso.com" `
    -Subject         "Branded Report" `
    -MarkdownContent $reportMd `
    -AccentColor     "#0052cc" `
    -TextColor       "#1a1a2e"
```

Ein ungültiger Wert (zum Beispiel `blue` oder `#05c`) führt nicht dazu, dass der Versand fehlschlägt: Eine Warnung nennt den Parameter und die Standardfarbe wird verwendet.

### Große Berichte mit Fallback-Anhangssatz

Erstellen Sie eine CSV-Datei und eine Excel-Arbeitsmappe, fallen Sie aber auf die Arbeitsmappe allein zurück, wenn das Paar das Größenbudget überschreitet:

```powershell
$sizeHint = "Der CSV-Export wurde weggelassen, weil die Anhänge das E-Mail-Größenlimit überschritten haben. Die Excel-Arbeitsmappe enthält die vollständigen Daten."

Send-RjRbReportEmail `
    -EmailFrom                "realmjoin-report@contoso.com" `
    -EmailTo                  "it-reports@contoso.com" `
    -Subject                  "Device Inventory" `
    -MarkdownContent          $reportMd `
    -Attachments              @($csvPath, $xlsxPath) `
    -FallbackAttachments      @($xlsxPath) `
    -FallbackMarkdownContent  ($reportMd + "`n`n> **Hinweis:** $sizeHint")
```

Runbooks, die vom eingebetteten Helfer migrieren `Send-RjRbGuardedReportEmail` können diese Funktion entfernen und den Aufruf umbenennen in `Send-RjRbReportEmail` — die Parameternamen (`Anhänge`, `FallbackAttachments`, `FallbackMarkdownContent`, `MaxAttachmentBytes`) bleiben unverändert.

### Reiner Inhalt (kein Header/Footer)

Für Warnmeldungen, die nicht wie Marketing-E-Mails aussehen sollen:

```powershell
Send-RjRbReportEmail `
    -EmailFrom       "realmjoin-report@contoso.com" `
    -EmailTo         "oncall@contoso.com" `
    -Subject         "[ALERT] License threshold exceeded" `
    -MarkdownContent "## License threshold exceeded`n`nSee dashboard for details." `
    -NoHeader `
    -NoFooter
```

### Verwendung des nativen Microsoft.Graph-SDK

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

```powershell
Connect-MgGraph -Identity -NoWelcome

Send-RjRbReportEmail `
    -EmailFrom             "realmjoin-report@contoso.com" `
    -EmailTo               "alice@contoso.com" `
    -Subject               "Native Graph send" `
    -MarkdownContent       $reportMd `
    -UseNativeGraphRequest
```

### Den Berichtstext aus einer Datei lesen

Für größere Berichte erzeugen Sie das Markdown in eine `.md` Datei und lesen Sie es ein:

```powershell
$reportMd = Get-Content -Path .\generated-report.md -Raw

Send-RjRbReportEmail `
    -EmailFrom       "realmjoin-report@contoso.com" `
    -EmailTo         "alice@contoso.com" `
    -Subject         "Weekly Report" `
    -MarkdownContent $reportMd
```

### Aktionsschaltflächen (Call-to-Action)

Rendern Sie eine oder mehrere gebrandete Schaltflächen, indem Sie `{button}` an einen Markdown-Link anhängen. Buttons auf derselben Zeile werden zu einer einzigen Reihe gruppiert:

```powershell
$reportMd = @"
# Zugriffsanfrage

Eine neue Gerätezugriffsanfrage wartet auf Ihre Entscheidung.

[Genehmigen](https://portal.contoso.com/approve/123){button} [Ablehnen](https://portal.contoso.com/reject/123){button}
"@

Send-RjRbReportEmail `
    -EmailFrom       "realmjoin-report@contoso.com" `
    -EmailTo         "approver@contoso.com" `
    -Subject         "Action required: device access request" `
    -MarkdownContent $reportMd
```

Jede Schaltfläche ist ein normaler Hyperlink, der als CTA gestaltet ist — sicher in allen Clients, mit abgerundeten Ecken in modernen Clients und eckigen Ecken in Outlook Classic.

## Markdown-Unterstützung

Die Funktion wird mit einem integrierten leichtgewichtigen Markdown-→HTML-Konverter ausgeliefert. **Es wird kein externes Markdown-Modul benötigt.** Unterstützte Syntax:

| Markdown                                      | Hinweise                                                                                                                                                                                                                                                                                                                                                                   |
| --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `# … ######` Überschriften                    | Alle sechs Ebenen. Leerzeichen nach `#` ist optional. `h1` erhält eine Unterstreichung; der Abstand ist für Outlook optimiert.                                                                                                                                                                                                                                             |
| `**fett**`, `*kursiv*`, `~~durchgestrichen~~` | Nur inline (darf sich nicht über mehrere Zeilen erstrecken).                                                                                                                                                                                                                                                                                                               |
| `` `inline code` ``                           | Dargestellt als `<code>` mit hellgrauem Hintergrund.                                                                                                                                                                                                                                                                                                                       |
| lang ... eingerahmte Codeblöcke               | Das Sprach-Tag bleibt erhalten als `class="language-…"`. Außerdem werden fehlerhafte Umrahmungen mit einzelnen Backticks toleriert.                                                                                                                                                                                                                                        |
| `[text](url)` Links                           | In neuem Tab öffnen mit `noopener noreferrer`.                                                                                                                                                                                                                                                                                                                             |
| `[label](url){button}` Link-Schaltflächen     | Wird als orangefarbene Marken-Call-to-Action-Schaltfläche statt als einfacher Link dargestellt. Mehrere `{button}` Links auf der **gleichen Zeile** werden nebeneinander in einer Zeile dargestellt (Breite gleichmäßig aufgeteilt). Abgerundete Ecken werden in modernen Clients angezeigt (New Outlook, OWA, mobil); Outlook Classic (Word-Engine) rendert eckige Ecken. |
| `![alt](url)` Bilder                          | Eingefügt als `<img>` (keine Magie für Inline-Anhänge — die URL muss vom Mail-Client erreichbar sein).                                                                                                                                                                                                                                                                     |
| `- Element` / `1. Element` Listen             | Verschachtelte Listen werden über eine Einrückung von 2 Leerzeichen pro Ebene unterstützt. Das Mischen geordneter und ungeordneter Listen schließt die vorherige Liste.                                                                                                                                                                                                    |
| Mehrzeilige Listeneinträge                    | Eine eingerückte, nicht leere Zeile direkt unter einem `<li>` wird mit einem `<br>` weichen Umbruch in denselben Eintrag übernommen — es ist nicht nötig, jeden Eintrag in einer Zeile zu halten.                                                                                                                                                                          |
| `- [ ]` / `- [x]` Aufgabenlisten              | Dargestellt als `☐` / `☑` Unicode-Glyphen (grün, wenn angehakt). `<input type="checkbox">` wird absichtlich vermieden, weil Outlook Classic Formularsteuerelemente entfernt. Großes `[X]` zählt ebenfalls als markiert.                                                                                                                                                    |
| `> blockquote`                                | Mit farbigem linken Rand und schattiertem Hintergrund dargestellt.                                                                                                                                                                                                                                                                                                         |
| `> [!NOTE\|TIP\|IMPORTANT\|WARNING\|CAUTION]` | GitHub-artige Hinweise. Die erste Zeile des Blockquotes ist allein der Marker, die übrigen `>`mit - beginnenden Zeilen bilden den Text. Jeder Typ erhält seine eigene Akzentfarbe, sein eigenes Symbol und seine eigene Titelleiste.                                                                                                                                       |
| `---`, `***`, `___`                           | Horizontale Trennlinie.                                                                                                                                                                                                                                                                                                                                                    |
| `\|col\|col\|` Tabellen                       | Standard-Pipe-Tabellen mit `:---`, `:---:`, `---:` Ausrichtungsspezifikatoren. Kopfzeile + Trennzeile erforderlich.                                                                                                                                                                                                                                                        |
| `\\` Maskierung                               | `\*`, `\|` usw. werden berücksichtigt, sodass wörtliche Markdown-Zeichen ausgegeben werden können.                                                                                                                                                                                                                                                                         |

Nicht unterstützte Elemente sind Fußnoten, Definitionslisten und HTML-Durchreichung — beschränken Sie das Markdown auf die obige Tabelle.

## Verhalten & Fehlerbehandlung

### Empfängeranalyse

`EmailTo` wird durch Kommas getrennt, jeder Eintrag wird getrimmt und leere Einträge werden verworfen. Wenn die resultierende Liste leer ist, wirft die Funktion `Im Parameter EmailTo wurden keine gültigen E-Mail-Empfänger gefunden.` bevor ein Graph-Aufruf erfolgt.

### Fehler pro Empfänger

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

* Wenn **mindestens ein** Versand erfolgreich ist, andere jedoch fehlschlagen, wird eine Warnung ausgegeben, die die fehlgeschlagenen Adressen auflistet; die Funktion kehrt normal zurück.
* Wenn **alle** alle Sendungen fehlschlagen, wirft die Funktion `E-Mail konnte nicht an alle Empfänger gesendet werden: …` sodass der Runbook-Lauf laut fehlschlägt.

### Fehler bei Anhängen

* Fehlende Dateien (Pfad existiert nicht) — ausführlich protokolliert, still übersprungen.
* Vorhandene, aber nicht lesbare Dateien (gesperrt, Berechtigung verweigert) — Warnung ausgegeben, übersprungen, der Rest des Aufrufs wird fortgesetzt.
* Das Feld "Attached Files" am unteren Rand der E-Mail listet nur Anhänge auf, die erfolgreich gelesen wurden.

### Fehler bei Bildüberschreibungen

Beide `HeaderImage` und `FooterImage` weichen bei jedem Fehler auf die mitgelieferten Standardwerte aus (fehlende Datei, E/A-Fehler oder eine Datei, die kein gültiges Bild ist). Eine Warnung beschreibt den Fehler und nennt, welcher Standardwert verwendet wurde.

Seit 0.8.9 wird das Bildformat anhand der **Dateisignatur** (Magic Bytes) statt anhand der Dateierweiterung bestimmt. Eine Datei mit dem Namen `.png` aber tatsächlich mit einer HTML-Fehlerseite — ein häufiger Fall, wenn ein Download stillschweigend ein Fehlerdokument zurückgibt — wird jetzt mit einer Warnung abgewiesen, statt einen beschädigten Inline-Anhang zu erzeugen. Umgekehrt wird ein gültiges PNG, das unter einer irreführenden Erweiterung gespeichert wurde, akzeptiert und korrekt typisiert.

### Ungültige Farben

`AccentColor` und `TextColor` werden gegen `^#[0-9A-Fa-f]{6}$`validiert. Ein Wert, der nicht übereinstimmt, erzeugt eine Warnung mit dem Parameternamen, und der Versand läuft mit der Standardfarbe weiter. Farben sind niemals ein Grund, warum ein Report fehlschlägt.

### Gesamtgrößenlimit

Graph begrenzt `sendMail` Anfragen auf insgesamt ca. 4 MB (HTML-Body + alle Anhänge, base64-kodiert). Die Funktion gibt eine Warnung aus, wenn eines der beiden Branding-Bilder 3 MB überschreitet.

Wenn `FallbackAttachments` angegeben wird, behandelt die im Parameterabschnitt oben beschriebene Größenprüfung Übergrößen automatisch. Ohne gesetztes Fallback schlägt eine übergroße Anfrage beim Graph-Aufruf fehl; erwägen Sie:

* Bereitstellen eines `FallbackAttachments` Sets (z. B. die Excel-Arbeitsmappe ohne die Roh-CSV-Dateien).
* große Daten stattdessen in den Storage Account-Kanal hochzuladen — siehe [Runbook-Berichtseinstellungen](/de/automatisierung/runbooks/runbook-report-settings.md#storage-account-delivery).
* Verlinken Sie auf extern gehostete Anhänge, statt sie einzubetten.
* Tabellarische Daten komprimieren (`Compress-Archive`) vor dem Anhängen.

## Integration mit Runbook-Berichtseinstellungen

Reporting-Runbooks hardcoden die Absenderadresse oder das Branding nicht: Sie deklarieren versteckte Parameter, die das RealmJoin-Portal aus dem zentralen Anpassungs-JSON vorbefüllt. Die verfügbaren Einstellungen sind dokumentiert in [Runbook-Berichtseinstellungen](/de/automatisierung/runbooks/runbook-report-settings.md).

Die Bindung erfolgt im `param()` -Block über `Use-RJInterface -Type Setting`, und die Parameter werden als `"Hide": true` in der `.INPUTS RunbookCustomization` Block gekennzeichnet, damit sie das Portalformular nicht überladen:

```powershell
param(
    [ValidateScript( { Use-RJInterface -Type Setting -Attribute "RJReport.EmailSender" -Value $_ } )]
    [string]$EmailFrom,

    [ValidateScript( { Use-RJInterface -Type Setting -Attribute "RJReport.Branding.HeaderImageUrl" -Value $_ } )]
    [string]$BrandingHeaderImageUrl,

    [ValidateScript( { Use-RJInterface -Type Setting -Attribute "RJReport.Branding.FooterImageUrl" -Value $_ } )]
    [string]$BrandingFooterImageUrl,

    [ValidateScript( { Use-RJInterface -Type Setting -Attribute "RJReport.Branding.FooterLink" -Value $_ } )]
    [string]$BrandingFooterLink,

    [ValidateScript( { Use-RJInterface -Type Setting -Attribute "RJReport.Branding.AccentColor" -Value $_ } )]
    [string]$BrandingAccentColor,

    [ValidateScript( { Use-RJInterface -Type Setting -Attribute "RJReport.Branding.TextColor" -Value $_ } )]
    [string]$BrandingTextColor
)

if (-not $EmailFrom) {
    throw "Kein EmailSender konfiguriert. Siehe https://docs.realmjoin.com/automation/runbooks/runbook-report-settings für Einrichtungsanweisungen."
}

# Laden und validieren Sie die Branding-Bilder einmal pro Lauf; gibt nur die Schlüssel zurück
# die erfolgreich aufgelöst wurden, sodass nicht gesetzte Einstellungen auf die Standardwerte zurückfallen.
$brandingMailParams = Get-RjRbBrandingMailParams `
    -HeaderImageUrl $BrandingHeaderImageUrl `
    -FooterImageUrl $BrandingFooterImageUrl `
    -FooterLink     $BrandingFooterLink `
    -AccentColor    $BrandingAccentColor `
    -TextColor      $BrandingTextColor

Send-RjRbReportEmail `
    -EmailFrom         $EmailFrom `
    -EmailTo           $RecipientParameter `
    -Subject           $Subject `
    -MarkdownContent   $reportMd `
    -TenantDisplayName $TenantDisplayName `
    -ReportVersion     "MyReport v1.0" `
    @brandingMailParams
```

Siehe [Get-RjRbBrandingMailParams](/de/dev-reference/report-functions/get-rjrbbrandingmailparams.md) für die Download-, Validierungs- und Bereinigungsregeln.

## Ausgaben

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

## Verwandte exportierte Hilfsfunktionen

Die Bausteine hinter `Send-RjRbReportEmail` sind jetzt ebenfalls aus dem Modul exportiert, sodass Runbooks das HTML zusammensetzen oder vorab anzeigen können, ohne es zu senden:

| Funktion                                                                                         | Zweck                                                                                                                                                                                                                                     |
| ------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`Get-RjRbBrandingMailParams`](/de/dev-reference/report-functions/get-rjrbbrandingmailparams.md) | Wandelt die `RJReport.Branding.*` Tenant-Einstellungen in direkt per Splatting verwendbare Parameter um: lädt und validiert die Bilder, reicht Farben und Footer-Link durch.                                                              |
| `ConvertFrom-RjRbMarkdownToHtml`                                                                 | Eigenständiger Markdown → HTML-Konverter (derselbe leichtgewichtige Motor, der intern verwendet wird, einschließlich der `{button}` Syntax). Akzeptiert `-AccentColor`/`-TextColor`.                                                      |
| `Get-RjRbReportEmailBody`                                                                        | Setzt den vollständigen gebrandeten HTML-Body (Header/Footer, Tenant-Info-Box, Anhangsliste) aus HTML oder Markdown zusammen — nützlich, um die E-Mail vor dem Senden darzustellen und zu prüfen. Akzeptiert `-AccentColor`/`-TextColor`. |
| `Resolve-RjRbImageSource`                                                                        | Löst einen Header-/Footer-Bildpfad zu seiner Inline-CID-Quelle auf. Validiert anhand der Dateisignatur und wirft bei allem, was kein PNG, JPEG oder GIF ist.                                                                              |

Abgesehen von `Get-RjRbBrandingMailParams`, diese sind hauptsächlich für fortgeschrittene/Test-Szenarien gedacht; der normale Weg ist, sie zu `Send-RjRbReportEmail` direkt aufzurufen.

## Siehe auch

* [Get-RjRbBrandingMailParams](/de/dev-reference/report-functions/get-rjrbbrandingmailparams.md) — Auflösen der Tenant-Branding-Einstellungen innerhalb eines Runbooks.
* [Runbook-Berichtseinstellungen](/de/automatisierung/runbooks/runbook-report-settings.md) — zentrale Konfiguration des Absendermailboxes, der Service-Desk-Infos, des Brandings und des Storage Account-Zustellkanals.
* Microsoft Graph: [E-Mail senden](https://learn.microsoft.com/en-us/graph/api/user-sendmail) — zugrunde liegende API.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.realmjoin.com/de/dev-reference/report-functions/send-rjrbreportemail.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
