> 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/es/dev-reference/report-functions/send-rjrbreportemail.md).

# Send-RjRbReportEmail

Enviar correos electrónicos de informes HTML con marca desde runbooks de Azure Automation a través de Microsoft Graph usando contenido Markdown.

## Descripción general

`Send-RjRbReportEmail` es el asistente estándar para entregar correos electrónicos de informes desde los runbooks de informes de RealmJoin. Toma contenido Markdown, lo convierte en un correo electrónico HTML responsivo con la marca de RealmJoin, adjunta archivos opcionales y gráficos de marca insertados (encabezado/pie de página), y envía el resultado a través de Microsoft Graph `sendMail` extremo.

> **Renombrado en esta versión.** La función se renombró de `Send-RjReportEmail` a `Send-RjRbReportEmail` para mantener la coherencia de nomenclatura con el resto del módulo (`*-RjRb*`). El nombre anterior `Send-RjReportEmail` se exporta como un alias compatible con versiones anteriores, por lo que los runbooks existentes siguen funcionando sin cambios — pero los nuevos runbooks deben llamar a `Send-RjRbReportEmail`.

Características clave:

* **Markdown de entrada, HTML de salida** — los runbooks componen el cuerpo del informe en Markdown; la función lo renderiza a HTML temático que funciona en Outlook Classic, New Outlook, Outlook Web, clientes móviles y modo oscuro.
* **Un correo por destinatario** — cuando se proporcionan varios destinatarios, la función envía un mensaje individual a cada dirección en lugar de un único correo con varios destinatarios. Este es un diseño centrado en la privacidad/BCC por defecto.
* **Encabezado y pie de página con marca integrados** — los recursos PNG incluidos se envían como adjuntos CID y se referencian desde el HTML incrustado. Ambos pueden reemplazarse o suprimirse por completo.
* **Colores de plantilla personalizables** — el color de acento y el color del texto de la plantilla pueden reemplazarse en cada llamada, de modo que los correos de informes puedan seguir el diseño corporativo de un cliente.
* **Control de tamaño de adjuntos integrado** — se envía automáticamente un conjunto alternativo de adjuntos más pequeño cuando el conjunto normal supera el presupuesto de tamaño o cuando falla su intento de envío.
* **Autoconexión** — si no hay una sesión de Graph activa, la función llama de forma transparente a `Connect-RjRbGraph` (o `Connect-MgGraph -Identity` cuando `-UseNativeGraphRequest` está establecido).
* **Resistente** — las lecturas de adjuntos fallidas, los reemplazos de imagen no válidos, los colores no válidos o los fallos de sendMail por destinatario se notifican, pero no abortan todo el lote salvo que *todos* los destinatarios fallen.

Los ajustes de correo centralizados (dirección del remitente, información del servicio de asistencia) se documentan en [Configuración de informes del runbook](/es/automatizacion/runbooks/runbook-report-settings.md) — este documento se centra en llamar a la función desde un runbook.

## Requisitos previos

### Buzón del remitente

Se requiere un buzón con licencia de Microsoft 365 (normalmente un buzón compartido dedicado, como `realmjoin-report@contoso.com`) como `De` dirección. La identidad administrada de la cuenta de Automation debe tener permiso para enviar en nombre de ese buzón a través del permiso de aplicación de Graph `Mail.Send` (delimitado mediante RBAC for Applications si quieres restringir la identidad a un único buzón).

> **El remitente no debe ser un grupo de Microsoft 365.** La función envía a través del extremo de Graph `/users/{EmailFrom}/sendMail` — un grupo de Microsoft 365 no es un objeto de usuario, por lo que la llamada falla. Usa un usuario o un buzón compartido.
>
> Las direcciones de grupos de Microsoft 365 como **destinatarios** se aceptan técnicamente, pero **no se recomiendan**: el mensaje puede llegar solo al buzón del grupo (los miembros reciben una copia personal solo si siguen al grupo), la gestión de entrega del grupo puede rechazar al remitente y los fallos de entrega solo aparecen como un NDR en el buzón del remitente — el runbook sigue informando éxito. Prefiere direcciones de buzones individuales.

### Permisos de Graph

| Escenario                                     | Permiso requerido                                          |
| --------------------------------------------- | ---------------------------------------------------------- |
| Predeterminado (`Invoke-RjRbRestMethodGraph`) | `Mail.Send` (Aplicación) en el buzón del remitente         |
| Con `-UseNativeGraphRequest`                  | Igual: la llamada sigue apuntando a `/users/{id}/sendMail` |

### Conectividad del módulo

De forma predeterminada, la función usa `Invoke-RjRbRestMethodGraph` de este módulo. Si no hay ninguna conexión activa, se conecta automáticamente mediante `Connect-RjRbGraph`. Cuando `-UseNativeGraphRequest` está establecido, la función en su lugar comprueba `Get-MgContext` y llama a `Connect-MgGraph -Identity -NoWelcome` bajo demanda.

## Inicio rápido

La llamada mínima viable solo requiere el remitente, el destinatario, un asunto y el cuerpo en Markdown:

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

Hola Alice,

aquí están los números de esta semana:

- Nuevos dispositivos inscritos: **42**
- Cumplimiento de licencias: **98%**
"@
```

Esto genera un correo electrónico de RealmJoin completamente personalizado con el encabezado y pie de página predeterminados, compatibilidad con modo claro/oscuro y el bloque Tenant/versión en el pie de página.

## Parámetros

### Requerido

| Parámetro         | Tipo     | Descripción                                                                                                                                                                                                                                                                                           |
| ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `EmailFrom`       | `cadena` | Nombre principal de usuario o id de objeto del buzón del remitente. Se usa como `/users/{id}/sendMail`. Debe ser un usuario o un buzón compartido — un grupo de Microsoft 365 no es un objeto de usuario y el envío falla.                                                                            |
| `EmailTo`         | `cadena` | Dirección del destinatario. **Una sola cadena** — varias direcciones se pasan como una lista separada por comas; véase abajo. Se aceptan direcciones de grupos de Microsoft 365, pero no se recomiendan — la entrega a los miembros no está garantizada y los fallos no son visibles para el runbook. |
| `Subject`         | `cadena` | Línea de asunto. También se inserta en el HTML `<title>` elemento.                                                                                                                                                                                                                                    |
| `MarkdownContent` | `cadena` | Cuerpo del informe en Markdown. Véase [Compatibilidad con Markdown](#markdown-support) para la sintaxis admitida.                                                                                                                                                                                     |

### Opcional — Contenido

| Parámetro           | Tipo       | Predeterminado | Descripción                                                                                                                                                                                                                |
| ------------------- | ---------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Adjuntos`          | `string[]` | `@()`          | Rutas locales de archivos que se adjuntarán. Los archivos que falten se registran y se omiten, los archivos ilegibles emiten una advertencia pero no abortan el envío. El tipo MIME se deriva de la extensión del archivo. |
| `saveToSentItems`   | `bool`     | `$true`        | Si `$true` el mensaje enviado se conserva en el *Elementos enviados*del buzón del remitente. Establécelo en `$false` para informes de gran volumen y evitar llenar el buzón.                                               |
| `TenantDisplayName` | `cadena`   | —              | Se muestra en el cuadro de información del Tenant incrustado al final del área de contenido.                                                                                                                               |
| `ReportVersion`     | `cadena`   | —              | Se muestra en el cuadro de información del Tenant (usa cadenas de versión semántica, números de compilación o un nombre de runbook + fecha).                                                                               |

### Opcional — Marca

| Parámetro     | Tipo          | Predeterminado               | Descripción                                                                                                                                                                                                                                                                                                                              |
| ------------- | ------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `HeaderImage` | `cadena`      | incluido `Assets/Header.png` | Ruta de archivo local a un PNG/JPG/GIF que reemplaza la imagen de encabezado predeterminada. **El runbook debe resolver previamente cualquier URL/blob a un archivo local** (por ejemplo, mediante `Get-AzStorageBlobContent`). Los reemplazos faltantes o ilegibles recurren al valor predeterminado incluido y emiten una advertencia. |
| `FooterImage` | `cadena`      | incluido `Assets/Footer.png` | Mismo tratamiento que `HeaderImage`. El pie de página se renderiza como una sola imagen en la que se puede hacer clic: cualquier texto de marca, logotipo o URL debe ir incrustado en el PNG.                                                                                                                                            |
| `FooterLink`  | `cadena`      | `https://www.realmjoin.com`  | URL utilizada como `href` y `title` del ancla que envuelve la imagen del pie de página.                                                                                                                                                                                                                                                  |
| `NoHeader`    | `interruptor` | desactivado                  | Suprime por completo la imagen de encabezado. Si se combina con `HeaderImage`, se emite una advertencia y el reemplazo se ignora.                                                                                                                                                                                                        |
| `NoFooter`    | `interruptor` | desactivado                  | Suprime por completo la imagen del pie de página y su enlace. Si se combina con `FooterImage` o un `FooterLink`, se emite una advertencia y esos valores se ignoran.                                                                                                                                                                     |
| `AccentColor` | `cadena`      | `#f8842c`                    | *Nuevo en 0.8.9.* Color hexadecimal de 6 dígitos para las filas de encabezado de las tablas, los botones de acción y los bordes de acento de los cuadros de información. Un valor vacío o mal formado emite una advertencia y vuelve al valor predeterminado.                                                                            |
| `TextColor`   | `cadena`      | `#011e33`                    | *Nuevo en 0.8.9.* Color hexadecimal de 6 dígitos para el texto del cuerpo, encabezados, elementos de lista y código. Mismo comportamiento de reserva que `AccentColor`.                                                                                                                                                                  |

**Dimensiones de imagen recomendadas:** PNG de 750 × 200 px. Esto coincide con el ancho del contenedor del correo y los valores predeterminados incluidos. Relaciones de aspecto muy diferentes pueden verse distorsionadas en ventanas estrechas. Cada gráfico debe mantenerse muy por debajo de 3 MB — Graph limita la solicitud total a 4 MB y se emite una advertencia si cualquiera de las imágenes supera los 3 MB. `sendMail` la solicitud a 4 MB y se emite una advertencia si cualquiera de las imágenes supera 3 MB.

**Colores:** sin `AccentColor`/`TextColor` el HTML generado es idéntico byte a byte al de las versiones anteriores del módulo — los valores predeterminados son el naranja y el azul marino de RealmJoin. Los colores de estado (verde/rojo/ámbar) y los grises neutros no se parametrizan intencionalmente porque transmiten significado. Verifica los colores personalizados tanto en modo claro como en modo oscuro: la tarjeta de contenido permanece blanca en modo oscuro, por lo que un color de texto muy claro se vuelve ilegible.

### Opcional — Control de tamaño de adjuntos

*Nuevo en 0.8.9.* Graph rechaza toda la `sendMail` solicitud una vez que el mensaje supera \~4 MB. En lugar de hacer que falle el informe, la función puede recurrir a un conjunto de adjuntos más pequeño. Esta lógica se duplicaba anteriormente como el helper en línea del runbook `Send-RjRbGuardedReportEmail` y ahora forma parte de la propia función.

| Parámetro                 | Tipo       | Predeterminado             | Descripción                                                                                                                                                                                                                                                                                    |
| ------------------------- | ---------- | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `FallbackAttachments`     | `string[]` | —                          | Conjunto de adjuntos más pequeño que se usa cuando el conjunto normal supera `MaxAttachmentBytes`, o cuando el envío con el conjunto normal falla para todos los destinatarios. Sin este parámetro no hay alternativa y un envío fallido lanza una excepción de inmediato.                     |
| `FallbackMarkdownContent` | `cadena`   | valor de `MarkdownContent` | Cuerpo usado cuando se envía el conjunto alternativo — úsalo para explicar qué archivos se omitieron y cómo obtenerlos.                                                                                                                                                                        |
| `MaxAttachmentBytes`      | `largo`    | `2.5MB`                    | Presupuesto de tamaño en bruto para el conjunto normal de adjuntos. Se mantiene con holgura por debajo del límite de \~4 MB de Graph después de la codificación base64 (+33 %), el cuerpo HTML y las imágenes de marca insertadas. Solo se evalúa cuando `FallbackAttachments` se proporciona. |

El control se ejecuta en dos etapas:

1. **Antes de enviar** — si el conjunto normal supera el presupuesto, el conjunto alternativo se envía directamente y un mensaje indica ambos tamaños.
2. **Después de un envío fallido** — si el envío con el conjunto normal falla para *todos* destinatarios, se intenta un reintento con el conjunto alternativo antes de que la función lance una excepción.

### Opcional — Transporte

| Parámetro               | Tipo          | Predeterminado | Descripción                                                                                                                                                                                                                                                 |
| ----------------------- | ------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `UseNativeGraphRequest` | `interruptor` | desactivado    | Envía mediante `Invoke-MgGraphRequest` (requiere `Microsoft.Graph` módulo y una `Connect-MgGraph` sesión) en lugar de `Invoke-RjRbRestMethodGraph`. Usa esto cuando el runbook esté construido en torno al SDK nativo en lugar del contenedor de RealmJoin. |

## Ejemplos de uso

### Varios destinatarios

`EmailTo` acepta una sola cadena que contiene una o más direcciones separadas por comas. Cada dirección se recorta, las entradas vacías se eliminan y **se envía un correo electrónico individual por destinatario** — los destinatarios no se ven entre sí.

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

### Con adjuntos y metadatos del Tenant

```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"
```

Los archivos adjuntos se enumeran en un cuadro de "Archivos adjuntos" en la parte inferior del cuerpo del correo, además de agregarse como adjuntos reales al mensaje.

### Marca personalizada de encabezado y pie de página

Lleva tu propia marca descargando primero los recursos a una ruta local y luego pasando las rutas resultantes. La función no obtiene URLs por sí misma.

```powershell
# Resolver los recursos de marca desde Azure Blob Storage al directorio temporal del runbook
$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"
```

Si `$headerPath` falta o es ilegible, la llamada sigue teniendo éxito — se usa el valor predeterminado incluido de RealmJoin y se registra una advertencia.

### Colores personalizados de la plantilla

Adapta el correo al diseño corporativo de un cliente. Ambos parámetros son independientes — reemplazar solo el color de acento mantiene el color de texto predeterminado:

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

Un valor no válido (por ejemplo `azul` o `#05c`) no hace que falle el envío: una advertencia nombra el parámetro y se usa el color predeterminado.

### Informes grandes con un conjunto alternativo de adjuntos

Genera un CSV y un libro de Excel, pero vuelve solo al libro cuando el par supera el presupuesto de tamaño:

```powershell
"Se omitió la exportación CSV porque los adjuntos superaron el límite de tamaño del correo. El libro de Excel contiene los datos completos."

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> **Nota:** $sizeHint")
```

Los runbooks que migran desde el helper en línea `Send-RjRbGuardedReportEmail` pueden eliminar esa función y renombrar la llamada a `Send-RjRbReportEmail` — los nombres de los parámetros (`Adjuntos`, `FallbackAttachments`, `FallbackMarkdownContent`, `MaxAttachmentBytes`) no cambian.

### Contenido plano (sin encabezado/pie de página)

Para notificaciones de tipo alerta que no deben parecer un correo de marketing:

```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
```

### Uso del SDK nativo de Microsoft.Graph

Si el runbook ya está autenticado mediante `Connect-MgGraph` (identidad administrada) y prefieres no mezclar el contenedor de RealmJoin:

```powershell
Connect-MgGraph -Identity -NoWelcome

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

### Lectura del cuerpo del informe desde un archivo

Para informes más grandes, genera el Markdown en un `.md` archivo y léelo:

```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
```

### Botones de acción (llamada a la acción)

Renderiza uno o más botones con marca añadiendo `{button}` a un enlace Markdown. Los botones colocados en la misma línea se agrupan en una sola fila:

```powershell
$reportMd = @"
# Solicitud de acceso

Una nueva solicitud de acceso al dispositivo espera tu decisión.

[Approve](https://portal.contoso.com/approve/123){button} [Reject](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
```

Cada botón es un hipervínculo normal con estilo de CTA — seguro en todos los clientes, con esquinas redondeadas en los clientes modernos y esquinas cuadradas en Outlook Classic.

## Compatibilidad con Markdown

La función incluye un convertidor ligero integrado de Markdown → HTML. **No se requiere ningún módulo externo de Markdown.** Sintaxis admitida:

| Markdown                                      | Notas                                                                                                                                                                                                                                                                                                                                                                                 |
| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `# … ######` encabezados                      | Los seis niveles. Espacio después `#` es opcional. `h1` obtiene un subrayado; espaciado ajustado para Outlook.                                                                                                                                                                                                                                                                        |
| `**negrita**`, `*cursiva*`, `~~tachado~~`     | Solo en línea (no debe abarcar varias líneas).                                                                                                                                                                                                                                                                                                                                        |
| `` `código en línea` ``                       | Se renderiza como `<code>` con un fondo gris claro.                                                                                                                                                                                                                                                                                                                                   |
| bloques de código delimitados lang ...        | La etiqueta de idioma se conserva como `class="language-…"`. También tolera delimitadores mal formados de una sola comilla invertida.                                                                                                                                                                                                                                                 |
| `[text](url)` enlaces                         | Abrir en una nueva pestaña con `noopener noreferrer`.                                                                                                                                                                                                                                                                                                                                 |
| `[label](url){button}` botones de enlace      | Se renderiza como un botón naranja de llamada a la acción con marca en lugar de un enlace simple. Múltiples `{button}` enlaces en la **misma línea** se renderizan uno al lado del otro en una sola fila (el ancho se divide por igual). Las esquinas redondeadas aparecen en clientes modernos (New Outlook, OWA, móvil); Outlook Classic (motor Word) renderiza esquinas cuadradas. |
| `![alt](url)` imágenes                        | Insertadas como `<img>` (sin magia de archivo adjunto en línea — la URL debe ser accesible para el cliente de correo).                                                                                                                                                                                                                                                                |
| `- elemento` / `1. elemento` listas           | Se admiten listas anidadas mediante una sangría de 2 espacios por nivel. Mezclar listas ordenadas y desordenadas cierra la lista anterior.                                                                                                                                                                                                                                            |
| Elementos de lista de varias líneas           | Una línea con sangría y no vacía directamente debajo de un `<li>` se incorpora al mismo elemento con un `<br>` salto de línea suave — no es necesario mantener cada elemento en una sola línea.                                                                                                                                                                                       |
| `- [ ]` / `- [x]` listas de tareas            | Se renderiza como `☐` / `☑` Glifos Unicode (verdes cuando están marcados). `<input type="checkbox">` se evita intencionalmente porque Outlook Classic elimina los controles de formulario. La mayúscula `[X]` también cuenta como marcado.                                                                                                                                            |
| `> cita en bloque`                            | Se renderiza con un borde izquierdo de color y un fondo sombreado.                                                                                                                                                                                                                                                                                                                    |
| `> [!NOTE\|TIP\|IMPORTANT\|WARNING\|CAUTION]` | Advertencias al estilo GitHub. La primera línea de la cita en bloque es el marcador (solo), las restantes `>`líneas prefijadas con - forman el cuerpo. Cada tipo obtiene su propio color de acento, glifo y barra de título.                                                                                                                                                          |
| `---`, `***`, `___`                           | Regla horizontal.                                                                                                                                                                                                                                                                                                                                                                     |
| `\|col\|col\|` tablas                         | Tablas estándar con barras verticales y `:---`, `:---:`, `---:` especificadores de alineación. Se requiere una fila de encabezado + un separador.                                                                                                                                                                                                                                     |
| `\\` escape                                   | `\*`, `\|` etc. se respetan para que se puedan emitir caracteres Markdown literales.                                                                                                                                                                                                                                                                                                  |

Los elementos no admitidos incluyen notas al pie, listas de definición y paso directo de HTML — mantenga el Markdown dentro de la tabla anterior.

## Comportamiento y control de errores

### Análisis de destinatarios

`EmailTo` se divide por comas, cada entrada se recorta y las entradas vacías se descartan. Si la lista resultante está vacía, la función lanza `No se encontraron destinatarios de correo válidos en el parámetro EmailTo.` antes de realizar cualquier llamada a Microsoft Graph.

### Errores por destinatario

Cada destinatario se envía de forma independiente. La función hace un seguimiento de los éxitos y los fallos:

* Si **al menos uno** el envío tiene éxito pero otros fallan, se emite una advertencia que enumera las direcciones fallidas; la función devuelve normalmente.
* Si **todos** los envíos fallan, la función lanza `No se pudo enviar el correo a todos los destinatarios: …` para que el runbook falle de forma explícita.

### Errores de archivos adjuntos

* Archivos que faltan (la ruta no existe) — se registran con detalle, se omiten silenciosamente.
* Archivos existentes pero ilegibles (bloqueados, permiso denegado) — se emite una advertencia, se omiten y el resto de la llamada continúa.
* El cuadro "Attached Files" en la parte inferior del correo enumera solo los archivos adjuntos que se leyeron correctamente.

### Errores al reemplazar imágenes

Ambos `HeaderImage` y `FooterImage` recurren a los valores predeterminados incluidos ante cualquier error (archivo faltante, error de E/S o un archivo que no sea una imagen válida). Una advertencia describe el fallo e identifica qué valor predeterminado se usó.

Desde 0.8.9 el formato de imagen se determina a partir de la **firma del archivo** (bytes mágicos) en lugar de la extensión del archivo. Un archivo llamado `.png` pero que en realidad contiene una página de error HTML — un resultado habitual cuando una descarga devuelve silenciosamente un documento de error — ahora se rechaza con una advertencia en lugar de producir un archivo adjunto en línea roto. Por el contrario, un PNG válido guardado con una extensión engañosa se acepta y se tipa correctamente.

### Colores no válidos

`AccentColor` y `TextColor` se validan contra `^#[0-9A-Fa-f]{6}$`. Un valor que no coincide emite una advertencia indicando el parámetro y el envío continúa con el color predeterminado. Los colores nunca son motivo para que un informe falle.

### Límite de tamaño total

Microsoft Graph limita `sendMail` las solicitudes a \~4 MB combinados (cuerpo HTML + todos los adjuntos, codificados en base64). La función emite una advertencia cuando cualquiera de las imágenes de marca supera los 3 MB.

Cuando `FallbackAttachments` se proporciona, el control de tamaño de los adjuntos descrito en la sección de parámetros anterior gestiona automáticamente las cargas útiles demasiado grandes. Sin un conjunto de reserva, una solicitud demasiado grande falla en la llamada a Microsoft Graph; considere:

* Proporcionar un `FallbackAttachments` conjunto (por ejemplo, el libro de Excel sin los archivos CSV sin procesar).
* Cargar datos grandes al canal de Storage Account en su lugar — vea [Configuración de informes del runbook](/es/automatizacion/runbooks/runbook-report-settings.md#storage-account-delivery).
* Enlazar a archivos adjuntos alojados externamente en lugar de incrustarlos.
* Comprimir datos tabulares (`Compress-Archive`) antes de adjuntar.

## Integración con Runbook Report Settings

Los runbooks de informes no codifican de forma fija la dirección del remitente ni la marca: declaran parámetros ocultos que el portal RealmJoin rellena previamente desde el JSON central de personalización. Los ajustes disponibles se documentan en [Configuración de informes del runbook](/es/automatizacion/runbooks/runbook-report-settings.md).

La vinculación ocurre en el `param()` bloque mediante `Use-RJInterface -Type Setting`, y los parámetros se marcan `"Hide": true` en el `.INPUTS RunbookCustomization` bloque para que no saturen el formulario del portal:

```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
)

si (-not $EmailFrom) {
    lanza "No hay EmailSender configurado. Consulte https://docs.realmjoin.com/automation/runbooks/runbook-report-settings para obtener instrucciones de configuración."
}

# Descarga y valida las imágenes de marca una vez por ejecución; devuelve solo las claves
# que se resolvieron correctamente, de modo que los ajustes no establecidos pasen a los valores predeterminados.
$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
```

Véase [Get-RjRbBrandingMailParams](/es/dev-reference/report-functions/get-rjrbbrandingmailparams.md) para las reglas de descarga, validación y limpieza.

## Salidas

La función no devuelve nada en caso de éxito. Todo el progreso se escribe mediante `Write-RjRbLog -Verbose` (visible cuando el runbook se ejecuta con `-Verbose` o `$VerbosePreference = 'Continue'`). Las advertencias se canalizan mediante `$WarningPreference = 'Continue'` independientemente de las anulaciones del lado del llamante, por lo que aparecen de forma fiable en el flujo de trabajos de Azure Automation.

## Ayudantes exportados relacionados

Los bloques de construcción detrás de `Send-RjRbReportEmail` ahora también se exportan desde el módulo, por lo que los runbooks pueden componer o previsualizar el HTML sin enviarlo:

| Función                                                                                          | Propósito                                                                                                                                                                                                                                                     |
| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`Get-RjRbBrandingMailParams`](/es/dev-reference/report-functions/get-rjrbbrandingmailparams.md) | Convierte los `RJReport.Branding.*` ajustes del Tenant en parámetros listos para aplicar: descarga y valida las imágenes, y pasa los colores y el enlace del pie de página.                                                                                   |
| `ConvertFrom-RjRbMarkdownToHtml`                                                                 | Conversor independiente de Markdown → HTML (el mismo motor ligero usado internamente, incluida la `{button}` sintaxis). Acepta `-AccentColor`/`-TextColor`.                                                                                                   |
| `Get-RjRbReportEmailBody`                                                                        | Ensambla el cuerpo HTML completo con marca (encabezado/pie de página, cuadro de información del Tenant, lista de adjuntos) a partir de HTML o Markdown — útil para renderizar e inspeccionar el correo antes de enviarlo. Acepta `-AccentColor`/`-TextColor`. |
| `Resolve-RjRbImageSource`                                                                        | Resuelve una ruta de imagen de encabezado/pie de página a su origen CID en línea. Valida por la firma del archivo y lanza una excepción ante cualquier cosa que no sea PNG, JPEG o GIF.                                                                       |

Excepto por `Get-RjRbBrandingMailParams`, estos están destinados principalmente a escenarios avanzados/de prueba; la ruta normal es llamar a `Send-RjRbReportEmail` directamente.

## Véase también

* [Get-RjRbBrandingMailParams](/es/dev-reference/report-functions/get-rjrbbrandingmailparams.md) — resolviendo los ajustes de marca del Tenant dentro de un runbook.
* [Configuración de informes del runbook](/es/automatizacion/runbooks/runbook-report-settings.md) — configuración central del buzón del remitente, información del service desk, marca y canal de entrega de Storage Account.
* Microsoft Graph: [Enviar correo](https://learn.microsoft.com/en-us/graph/api/user-sendmail) — API subyacente.


---

# 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/es/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.
