> 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

Senden Sie gebrandete HTML-Berichts-E-Mails aus Azure Automation-Runbooks über Microsoft Graph mithilfe von Markdown-Inhalten.

## Übersicht

`Send-RjRbReportEmail` ist der Standard-Helper zum Versenden von Berichts-E-Mails 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 (Header/Footer) hinzu und sendet das Ergebnis über Microsoft Graph `sendMail` Endpunkt.

> **In diesem Release umbenannt.** Die Funktion wurde umbenannt von `Send-RjReportEmail` zu `Send-RjRbReportEmail` für Benennungs-Konsistenz mit dem Rest des Moduls (`*-RjRb*`). Der alte Name `Send-RjReportEmail` wird als abwärtskompatibler Alias exportiert, sodass bestehende Runbooks unverändert weiter funktionieren — neue Runbooks sollten jedoch `Send-RjRbReportEmail`.

Wichtige Merkmale:

* **Markdown rein, HTML raus** — Runbooks erstellen den Berichtstext in Markdown; die Funktion rendert ihn zu thematischem HTML, 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. Dies ist ein Design mit Datenschutz/BCC standardmäßig.
* **Eingebetteter Branding-Header & Footer** — mitgelieferte PNG-Assets werden als CID-Anhänge gesendet und im eingebetteten HTML referenziert. Beide können überschrieben oder vollständig unterdrückt werden.
* **Anpassbare Vorlagenfarben** — die Akzent- und Textfarbe der Vorlage können pro Aufruf überschrieben werden, sodass Berichts-E-Mails dem Corporate Design eines Kunden folgen können.
* **Integrierte Größenprüfung für Anhänge** — ein optional kleinerer Fallback-Anhangssatz wird automatisch gesendet, wenn der reguläre Satz das Größenbudget überschreitet oder dessen Sendeversuch fehlschlägt.
* **Selbstverbindend** — wenn keine Graph-Sitzung aktiv ist, ruft die Funktion transparent `Connect-RjRbGraph` (oder `Connect-MgGraph -Identity` wenn `-UseNativeGraphRequest` gesetzt ist).
* **Robust** — fehlgeschlagene Anhänge-Lesevorgänge, ungültige Bildüberschreibungen, ungültige Farben oder Sende-Fehler pro Empfänger werden gemeldet, beenden aber den gesamten Batch nicht, sofern nicht *alle* Empfänger fehlschlagen.

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 den Aufruf der Funktion aus einem Runbook.

## Voraussetzungen

### Absenderpostfach

Ein lizenziertes Microsoft 365-Postfach (typischerweise ein dediziertes freigegebenes Postfach wie `realmjoin-report@contoso.com`) wird als `From` Adresse benötigt. Die verwaltete Identität des Automation Accounts muss berechtigt sein, über die Graph-Anwendungsberechtigung Mail.Send im Namen dieses Postfachs zu senden (bei Bedarf über RBAC for Applications eingegrenzt, wenn Sie die Identität auf ein einzelnes Postfach beschränken möchten). `Mail.Send` Anwendungsberechtigung erforderlich (über RBAC for Applications eingegrenzt, wenn Sie die Identität auf ein einzelnes Postfach beschränken möchten).

> **Der Absender darf keine Microsoft 365-Gruppe sein.** Die Funktion sendet über den Graph-Endpunkt `/users/{EmailFrom}/sendMail` — eine Microsoft 365-Gruppe ist kein Benutzerobjekt, daher schlägt der Aufruf fehl. Verwenden Sie ein Benutzer- oder freigegebenes Postfach.
>
> Microsoft 365-Gruppenadressen als **Empfänger** werden technisch akzeptiert, aber **nicht empfohlen**: Die Nachricht erreicht möglicherweise nur das Gruppenpostfach (Mitglieder erhalten eine persönliche Kopie nur, wenn sie der Gruppe folgen), die Zustellungsverwaltung der Gruppe kann den Absender ablehnen, und Zustellfehler erscheinen nur als NDR im Absenderpostfach — das Runbook selbst meldet dennoch Erfolg. Bevorzugen Sie einzelne Postfachadressen.

### Graph-Berechtigungen

| Szenario                                | Erforderliche Berechtigung                                  |
| --------------------------------------- | ----------------------------------------------------------- |
| Standard (`Invoke-RjRbRestMethodGraph`) | `Mail.Send` (Anwendung) am Absenderpostfach                 |
| Mit `-UseNativeGraphRequest`            | Gleich — der Aufruf trifft weiterhin `/users/{id}/sendMail` |

### Modulkonnektivität

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 @"
# Wöchentlicher Bericht

Hallo Alice,

hier sind die Zahlen dieser Woche:

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

Dies erzeugt eine vollständig gebrandete RealmJoin-E-Mail mit dem Standard-Header und -Footer, Unterstützung für Hell-/Dunkelmodus und dem Tenant-/Versionsblock im Footer.

## Parameter

### Erforderlich

| Parameter         | Typ      | Beschreibung                                                                                                                                                                                                                                                                                     |
| ----------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `EmailFrom`       | `string` | Benutzerprinzipalname oder Objekt-ID des Absenderpostfachs. Wird als `/users/{id}/sendMail`. Muss ein Benutzer- oder freigegebenes Postfach sein — eine Microsoft 365-Gruppe ist kein Benutzerobjekt und das Senden schlägt fehl.                                                                |
| `EmailTo`         | `string` | Empfängeradresse. **Einzelner String** — mehrere Adressen werden als kommagetrennte Liste übergeben, siehe unten. Adressen von Microsoft 365-Gruppen werden akzeptiert, aber nicht empfohlen — die Zustellung an Mitglieder ist nicht garantiert und Fehler sind für das Runbook nicht sichtbar. |
| `Subject`         | `string` | Betreffzeile. Wird auch in das HTML eingefügt `<title>` Element.                                                                                                                                                                                                                                 |
| `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 das Senden aber nicht ab. Der MIME-Typ wird aus der Dateiendung abgeleitet. |
| `saveToSentItems`   | `bool`     | `$true`  | Wenn `$true` die gesendete Nachricht im *Gesendete Elemente*des Absenderpostfachs gespeichert wird. Setzen Sie auf `$false` für Berichte mit hohem Volumen, um das Postfach nicht zu füllen.                                             |
| `TenantDisplayName` | `string`   | —        | Wird in der Tenant-Info-Box angezeigt, die am Ende des Inhaltsbereichs eingebettet ist.                                                                                                                                                  |
| `ReportVersion`     | `string`   | —        | Wird in der Tenant-Info-Box angezeigt (verwenden Sie semantische Versionsstrings, Build-Nummern oder einen Runbook-Namen plus Datum).                                                                                                    |

### Optional — Branding

| Parameter     | Typ      | Standard                         | Beschreibung                                                                                                                                                                                                                                                                                                                             |
| ------------- | -------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `HeaderImage` | `string` | mitgeliefert `Assets/Header.png` | Lokaler Dateipfad zu einer PNG/JPG/GIF-Datei, die die Standard-Headergrafik ü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 die mitgelieferte Standardversion zurück und erzeugen eine Warnung. |
| `FooterImage` | `string` | mitgeliefert `Assets/Footer.png` | Gleiche Behandlung wie `HeaderImage`. Der Footer wird als ein einzelnes anklickbares Bild gerendert — jeder Branding-Text, jedes Logo oder jede URL muss im PNG enthalten sein.                                                                                                                                                          |
| `FooterLink`  | `string` | `https://www.realmjoin.com`      | URL, die als `href` und `title` des Ankers verwendet wird, der das Footer-Bild umschließt.                                                                                                                                                                                                                                               |
| `NoHeader`    | `switch` | aus                              | Unterdrückt die Headergrafik vollständig. Wenn kombiniert mit `HeaderImage`, wird eine Warnung ausgegeben und die Überschreibung ignoriert.                                                                                                                                                                                              |
| `NoFooter`    | `switch` | aus                              | Unterdrückt die Footergrafik und ihren Link vollständig. Wenn kombiniert 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 gibt eine Warnung aus 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, Listeneinträge und Code. Gleiches Fallback-Verhalten wie `AccentColor`.                                                                                                                                                                                           |

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

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

### Optional — Größenprüfung für Anhänge

*Neu in 0.8.9.* Graph lehnt die gesamte `sendMail` Anfrage ab, sobald die Nachricht etwa 4 MB überschreitet. Statt den Bericht fehlschlagen zu lassen, kann die Funktion auf einen kleineren Anhangssatz zurückfallen. Diese Logik war zuvor als Inline-Runbook-Helper `Send-RjRbGuardedReportEmail` dupliziert und ist nun Teil der Funktion selbst.

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

Die Prüfung 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 Sendeversuch** — wenn das Senden mit dem regulären Satz für *alle* Empfänger fehlschlägt, wird ein einmaliger erneuter Versuch mit dem Fallback-Satz unternommen, bevor die Funktion eine Ausnahme auslöst.

### Optional — Transport

| Parameter               | Typ      | Standard | Beschreibung                                                                                                                                                                                                                                                         |
| ----------------------- | -------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `UseNativeGraphRequest` | `switch` | aus      | Sendet über `Invoke-MgGraphRequest` (erfordert `Microsoft.Graph` Modul und eine `Connect-MgGraph` Sitzung) anstelle von `Invoke-RjRbRestMethodGraph`. Verwenden Sie dies, wenn das Runbook um das native SDK herum aufgebaut ist und nicht um den RealmJoin-Wrapper. |

## Anwendungsbeispiele

### Mehrere Empfänger

`EmailTo` akzeptiert einen einzelnen String mit einer oder mehreren durch Kommas getrennten Adressen. Jede Adresse wird getrimmt, leere Einträge werden entfernt, und **pro Empfänger wird eine einzelne E-Mail 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   "Monatliches Inventar" `
    -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           "Geräteinventar — $(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 dazu, dass sie der Nachricht als echte Anhänge hinzugefügt werden, in einer "Attached Files"-Box am Ende des E-Mail-Textkörpers aufgelistet.

### Benutzerdefiniertes Header-/Footer-Branding

Bringen Sie Ihr eigenes Branding ein, 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          "Gebrandeter Bericht" `
    -MarkdownContent  $reportMd `
    -HeaderImage      $headerPath `
    -FooterImage      $footerPath `
    -FooterLink       "https://intranet.contoso.com/it-reports"
```

Wenn `$headerPath` fehlt oder nicht lesbar ist, ist der Aufruf dennoch erfolgreich — die mitgelieferte RealmJoin-Standardversion 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         "Gebrandeter Bericht" `
    -MarkdownContent $reportMd `
    -AccentColor     "#0052cc" `
    -TextColor       "#1a1a2e"
```

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

### Große Berichte mit einem Fallback-Anhangssatz

Erstellen Sie eine CSV 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                  "Geräteinventar" `
    -MarkdownContent          $reportMd `
    -Attachments              @($csvPath, $xlsxPath) `
    -FallbackAttachments      @($xlsxPath) `
    -FallbackMarkdownContent  ($reportMd + "`n`n> **Hinweis:** $sizeHint")
```

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

### Einfacher Inhalt (ohne Header/Footer)

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

```powershell
Send-RjRbReportEmail `
    -EmailFrom       "realmjoin-report@contoso.com" `
    -EmailTo         "oncall@contoso.com" `
    -Subject         "[ALERT] Lizenzschwellenwert überschritten" `
    -MarkdownContent "## Lizenzschwellenwert überschritten`n`nDetails siehe Dashboard." `
    -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 mit einbeziehen möchten:

```powershell
Connect-MgGraph -Identity -NoWelcome

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

### Den Berichtstext aus einer Datei lesen

Erstellen Sie für größere Berichte den Markdown-Inhalt in einer `.md` -Datei und lesen Sie ihn ein:

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

Send-RjRbReportEmail `
    -EmailFrom       "realmjoin-report@contoso.com" `
    -EmailTo         "alice@contoso.com" `
    -Subject         "Wöchentlicher Bericht" `
    -MarkdownContent $reportMd
```

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

Rufen Sie ein oder mehrere gebrandete Schaltflächen auf, indem Sie `{button}` an einen Markdown-Link anhängen. Schaltflächen, die in derselben Zeile platziert werden, werden zu einer einzigen Reihe gruppiert:

```powershell
$reportMd = @"
# Zugriffsanfrage

Eine neue Anforderung für den Gerätezugriff 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         "Aktion erforderlich: Anforderung für Gerätezugriff" `
    -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, leichten Markdown-→-HTML-Konverter ausgeliefert. **Es wird kein externes Markdown-Modul benötigt.** Unterstützte Syntax:

| Markdown                                      | Hinweise                                                                                                                                                                                                                                                                                                                                                              |
| --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `# … ######` Überschriften                    | Alle sechs Ebenen. Leerzeichen danach `#` ist optional. `h1` erhält eine Unterstreichung; der Abstand ist für Outlook optimiert.                                                                                                                                                                                                                                      |
| `**bold**`, `*italic*`, `~~strike~~`          | Nur inline (darf sich nicht über mehrere Zeilen erstrecken).                                                                                                                                                                                                                                                                                                          |
| `` `inline code` ``                           | Gerendert als `<code>` mit hellgrauem Hintergrund.                                                                                                                                                                                                                                                                                                                    |
| lang ... eingerahmte Codeblöcke               | Das Sprach-Tag bleibt erhalten als `class="language-…"`. Toleriert außerdem fehlerhafte Abgrenzungen mit einfachem Backtick.                                                                                                                                                                                                                                          |
| `[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 gerendert. Mehrere `{button}` Links in der **gleichen Zeile** werden nebeneinander in einer Zeile gerendert (Breite gleichmäßig aufgeteilt). Abgerundete Ecken werden in modernen Clients (New Outlook, OWA, mobil) angezeigt; Outlook Classic (Word-Engine) rendert eckige Ecken. |
| `![alt](url)` Bilder                          | Eingefügt als `<img>` (keine Inline-Anhang-Magie — die URL muss vom Mailclient erreichbar sein).                                                                                                                                                                                                                                                                      |
| `- Element` / `1. Element` Listen             | Verschachtelte Listen werden durch Einrückung mit 2 Leerzeichen pro Ebene unterstützt. Das Mischen von geordneten und ungeordneten Listen schließt die vorherige Liste.                                                                                                                                                                                               |
| Mehrzeilige Listeneinträge                    | Eine eingerückte, nicht leere Zeile direkt unter einem `<li>` wird in dasselbe Element übernommen mit einem `<br>` weichen Zeilenumbruch — jedes Element muss nicht in einer Zeile bleiben.                                                                                                                                                                           |
| `- [ ]` / `- [x]` Aufgabenlisten              | Gerendert als `☐` / `☑` Unicode-Symbole (grün, wenn markiert). `<input type="checkbox">` wird absichtlich vermieden, da Outlook Classic Formularelemente entfernt. Großes `[X]` gilt ebenfalls als markiert.                                                                                                                                                          |
| `> Blockzitat`                                | Gerendert mit farbigem linken Rand und schattiertem Hintergrund.                                                                                                                                                                                                                                                                                                      |
| `> [!NOTE\|TIP\|IMPORTANT\|WARNING\|CAUTION]` | Hinweise im GitHub-Stil. Die erste Zeile des Blockzitats ist allein der Marker, die übrigen `>`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.                                                                                                                                                                                                                                                        |
| `\\` 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änger-Analyse

`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 Parameter EmailTo gefunden.` bevor ein Graph-Aufruf ausgeführt wird.

### Fehler pro Empfänger

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

* Wenn **mindestens ein** Sendevorgang erfolgreich ist, andere jedoch fehlschlagen, wird eine Warnung mit den fehlgeschlagenen Adressen ausgegeben; die Funktion kehrt normal zurück.
* Wenn **alle** Sendevorgänge fehlschlagen, wirft die Funktion `Senden der E-Mail an alle Empfänger fehlgeschlagen: …` sodass das Runbook deutlich fehlschlägt.

### Anhangsfehler

* 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 beim Überschreiben von Bildern

Beide `HeaderImage` und `FooterImage` fallen bei jedem Fehler auf die mitgelieferten Standardwerte zurück (fehlende Datei, IO-Fehler oder eine Datei, die kein gültiges Bild ist). Eine Warnung beschreibt den Fehler und nennt den verwendeten Standardwert.

Seit 0.8.9 wird das Bildformat aus der **Dateisignatur** (Magic Bytes) statt aus der Dateierweiterung. Eine Datei mit dem Namen `.png` aber tatsächlich eine HTML-Fehlerseite enthält — ein häufiger Fall, wenn ein Download stillschweigend ein Fehlerdokument zurückgibt — wird jetzt mit einer Warnung abgelehnt, statt einen defekten Inline-Anhang zu erzeugen. Umgekehrt wird ein gültiges PNG mit irreführender Erweiterung akzeptiert und korrekt typisiert.

### Ungültige Farben

`AccentColor` und `TextColor` werden geprüft gegen `^#[0-9A-Fa-f]{6}$`. Ein nicht passender Wert erzeugt eine Warnung mit Nennung des Parameters, und der Versand läuft mit der Standardfarbe weiter. Farben sind niemals ein Grund dafür, dass ein Bericht fehlschlägt.

### Gesamtgrößenlimit

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

Wenn `FallbackAttachments` bereitgestellt wird, behandelt die oben im Parameterabschnitt beschriebene Schutzfunktion für Anhangsgrößen übergroße Nutzdaten automatisch. Ohne festgelegten Fallback schlägt eine übergroße Anfrage im Graph-Aufruf fehl; erwägen Sie:

* Die Bereitstellung eines `FallbackAttachments` Satzes (z. B. der Excel-Arbeitsmappe ohne die rohen CSV-Dateien).
* Große Daten stattdessen über den Storage Account-Kanal hochladen — siehe [Runbook-Berichtseinstellungen](/de/automatisierung/runbooks/runbook-report-settings.md#storage-account-delivery).
* Auf extern gehostete Anhänge verlinken, statt sie einzubetten.
* Tabellarische Daten komprimieren (`Compress-Archive`) vor dem Anhängen.

## Integration mit Runbook-Report-Einstellungen

Reporting-Runbooks kodieren weder die Absenderadresse noch das Branding fest ein: Sie deklarieren verborgene 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 Runbook- `param()` Block über `Use-RJInterface -Type Setting`, und die Parameter werden markiert `"Hide": true` im `.INPUTS RunbookCustomization` -Block, damit sie das Portalformular nicht überladen:

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

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

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

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

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

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

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

# Branding-Bilder einmal pro Lauf herunterladen und validieren; 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 Regeln zum Herunterladen, Validieren und Bereinigen.

## Ausgaben

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

## Verwandte exportierte Hilfsfunktionen

Die Bausteine hinter `Send-RjRbReportEmail` werden jetzt ebenfalls aus dem Modul exportiert, sodass Runbooks das HTML zusammensetzen oder in der Vorschau 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 sofort anwendbare Parameter um: lädt und validiert die Bilder und reicht Farben sowie den Footer-Link durch.                                                                          |
| `ConvertFrom-RjRbMarkdownToHtml`                                                                 | Eigenständiger Markdown → HTML-Konverter (dieselbe leichte Engine, die intern verwendet wird, einschließlich der `{button}` Syntax). `-AccentColor`/`-TextColor`.                                                                               |
| `Get-RjRbReportEmailBody`                                                                        | Setzt den vollständigen gebrandeten HTML-Textkörper (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 in seine Inline-CID-Quelle auf. Validiert anhand der Dateisignatur und wirft bei allem, was kein PNG, JPEG oder GIF ist.                                                                                     |

Abgesehen von `Get-RjRbBrandingMailParams`, sind diese hauptsächlich für fortgeschrittene Test-Szenarien gedacht; der normale Weg ist, `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 Absenderpostfachs, Service-Desk-Informationen, Branding 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
