> 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

Envía correos electrónicos de informes HTML con identidad corporativa desde runbooks de Azure Automation a través de Microsoft Graph usando contenido Markdown.

## Resumen

`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 HTML responsivo con marca de RealmJoin, adjunta archivos opcionales y gráficos de marca en línea (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 consistencia de nomenclatura con el resto del módulo (`*-RjRb*`). El nombre anterior `Send-RjReportEmail` se exporta como un alias compatible con versiones anteriores, de modo que los runbooks existentes sigan funcionando sin cambios — pero los nuevos runbooks deberían llamar a `Send-RjRbReportEmail`.

Características clave:

* **Markdown de entrada, HTML de salida** — los runbooks redactan el cuerpo del informe en Markdown; la función lo renderiza en HTML con el tema 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 para múltiples destinatarios. Este es un diseño de privacidad/BCC por defecto.
* **Encabezado y pie de página con marca en línea** — los recursos PNG incluidos se envían como adjuntos CID y se referencian mediante el HTML incrustado. Ambos pueden sobrescribirse o suprimirse por completo.
* **Colores de plantilla personalizables** — el color de acento y el color del texto de la plantilla pueden sobrescribirse en cada llamada, de modo que los correos de informe puedan seguir el diseño corporativo de un cliente.
* **Protección integrada contra el tamaño de los adjuntos** — un conjunto de adjuntos alternativo más pequeño opcional se envía automáticamente cuando el conjunto normal supera el presupuesto de tamaño o cuando falla su intento de envío.
* **Autoconectable** — si no hay ninguna sesión de Graph activa, la función llama de forma transparente a `Connect-RjRbGraph` (o `Connect-MgGraph -Identity` cuando `-UseNativeGraphRequest` está establecido).
* **Resiliente** — las lecturas de adjuntos fallidas, las anulaciones de imagen inválidas, los colores inválidos o los fallos de sendMail por destinatario se notifican, pero no detienen todo el lote a menos que *todos* los destinatarios fallen.

Los ajustes centralizados de correo electrónico (dirección del remitente, información del servicio de asistencia) están documentados en [Configuración del informe 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 dirección `From` . La identidad administrada de la cuenta de Automation debe poder enviar en nombre de ese buzón a través del permiso de aplicación de Graph `Mail.Send` (restringido mediante RBAC para aplicaciones si desea limitar la identidad a un único buzón).

> **El remitente no debe ser un grupo de Microsoft 365.** La función envía mediante el extremo Graph `/users/{EmailFrom}/sendMail` — un grupo de Microsoft 365 no es un objeto de usuario, por lo que la llamada falla. Use un buzón de usuario o compartido.
>
> Las direcciones de grupos de Microsoft 365 como **recipientes** se aceptan técnicamente, pero **no se recomienda**: el mensaje puede llegar solo al buzón del grupo (los miembros reciben una copia personal solo si siguen al grupo), la administració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 propio runbook sigue informando éxito. Prefiera direcciones de buzones individuales.

### Permisos de Graph

| Escenario                                     | Permiso requerido                                             |
| --------------------------------------------- | ------------------------------------------------------------- |
| Predeterminado (`Invoke-RjRbRestMethodGraph`) | `Mail.Send` (Application) en el buzón del remitente           |
| Con `-UseNativeGraphRequest`                  | La misma — la llamada sigue llegando 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 requiere solo el remitente, el destinatario, un asunto y el cuerpo Markdown:

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

Hola Alice,

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

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

Esto produce un correo RealmJoin totalmente con marca, con el encabezado y pie de página predeterminados, compatibilidad con modo claro/oscuro y el bloque de tenant/versión en el pie de página.

## Parámetros

### Requerido

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

### Opcional — Contenido

| Parámetro           | Tipo       | Predeterminado | Descripción                                                                                                                                                                                                            |
| ------------------- | ---------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Adjuntos`          | `string[]` | `@()`          | Rutas locales de archivos para adjuntar. Los archivos faltantes se registran y se omiten, los archivos ilegibles emiten una advertencia pero no detienen 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 la carpeta del buzón del remitente *Elementos enviados*. Establézcalo en `$false` para informes de gran volumen y evitar llenar el buzón.                                 |
| `TenantDisplayName` | `string`   | —              | Se muestra en el cuadro de información del tenant incrustado al final del área de contenido.                                                                                                                           |
| `ReportVersion`     | `string`   | —              | Se muestra en el cuadro de información del tenant (use 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` | `string`      | incluidos `Assets/Header.png` | Ruta local a un PNG/JPG/GIF que sobrescribe la imagen de encabezado predeterminada. **El runbook debe resolver cualquier URL/blob a un archivo local de antemano** (por ejemplo, mediante `Get-AzStorageBlobContent`). Los reemplazos faltantes/ilegibles vuelven al predeterminado incluido y emiten una advertencia. |
| `FooterImage` | `string`      | incluidos `Assets/Footer.png` | Mismo tratamiento que `HeaderImage`. El pie de página se representa 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`  | `string`      | `https://www.realmjoin.com`   | URL usada 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 se ignora la anulación.                                                                                                                                                                                      |
| `NoFooter`    | `interruptor` | desactivado                   | Suprime por completo la imagen del pie de página y su vínculo. Si se combina con `FooterImage` o un `FooterLink`personalizado, se emite una advertencia y esos valores se ignoran.                                                                                                                                     |
| `AccentColor` | `string`      | `#f8842c`                     | *Nuevo en 0.8.9.* Color hex de 6 dígitos para las filas de encabezado de tabla, 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 predeterminado.                                                                             |
| `TextColor`   | `string`      | `#011e33`                     | *Nuevo en 0.8.9.* Color hex de 6 dígitos para el texto del cuerpo, títulos, 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 de correo y los valores predeterminados incluidos. Relaciones de aspecto significativamente distintas pueden verse deformadas en ventanas estrechas. Cada gráfico debería permanecer muy por debajo de 3 MB — Graph limita el total `sendMail` de 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 por byte a 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. Verifique 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 — Protección del tamaño de los adjuntos

*Nuevo en 0.8.9.* Graph rechaza toda la `sendMail` solicitud una vez que el mensaje supera \~4 MB. En lugar de fallar el informe, la función puede recurrir a un conjunto de adjuntos más pequeño. Esta lógica antes se duplicaba como el ayudante de runbook en línea `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 genera una excepción de inmediato.               |
| `FallbackMarkdownContent` | `string`   | valor de `MarkdownContent` | Cuerpo que se usa cuando se envía el conjunto alternativo — úselo para explicar qué archivos se omitieron y cómo obtenerlos.                                                                                                                                                              |
| `MaxAttachmentBytes`      | `long`     | `2.5MB`                    | Presupuesto de tamaño bruto para el conjunto de adjuntos normal. Permanece con seguridad 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 en línea. Solo se evalúa cuando `FallbackAttachments` se proporciona. |

La protección 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 sesión de `Connect-MgGraph` ) en lugar de `Invoke-RjRbRestMethodGraph`. Úselo cuando el runbook esté construido alrededor del SDK nativo en lugar del envoltorio 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 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   "Inventario mensual" `
    -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           "Inventario de dispositivos — $(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 "Archivos adjuntos" en la parte inferior del cuerpo del correo, además de añadirse como adjuntos reales al mensaje.

### Marca personalizada para encabezado/pie de página

Aporte su propia marca descargando primero los recursos a una ruta local y luego pase las rutas resultantes. La función no obtiene las URL por sí misma.

```powershell
# Resolver recursos de marca desde Azure Blob Storage a la carpeta 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          "Informe con marca" `
    -MarkdownContent  $reportMd `
    -HeaderImage      $headerPath `
    -FooterImage      $footerPath `
    -FooterLink       "https://intranet.contoso.com/it-reports"
```

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

### Colores de plantilla personalizados

Haga coincidir el correo con el diseño corporativo de un cliente. Ambos parámetros son independientes — sobrescribir solo el color de acento conserva el color de texto predeterminado:

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

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

### Informes grandes con un conjunto alternativo de adjuntos

Genere un CSV y un libro de Excel, pero recurra solo al libro cuando el par supere el presupuesto de tamaño:

```powershell
$sizeHint = "La exportación CSV se omitió 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                  "Inventario de dispositivos" `
    -MarkdownContent          $reportMd `
    -Attachments              @($csvPath, $xlsxPath) `
    -FallbackAttachments      @($xlsxPath) `
    -FallbackMarkdownContent  ($reportMd + "`n`n> **Nota:** $sizeHint")
```

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

### 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         "[ALERTA] Se superó el umbral de licencias" `
    -MarkdownContent "## Se superó el umbral de licencias`n`nConsulte el panel para obtener detalles." `
    -NoHeader `
    -NoFooter
```

### Usando el SDK nativo de Microsoft.Graph

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

```powershell
Connect-MgGraph -Identity -NoWelcome

Send-RjRbReportEmail `
    -EmailFrom             "realmjoin-report@contoso.com" `
    -EmailTo               "alice@contoso.com" `
    -Subject               "Envío nativo de Graph" `
    -MarkdownContent       $reportMd `
    -UseNativeGraphRequest
```

### Leer el cuerpo del informe desde un archivo

Para informes más grandes, genere el Markdown en un `.md` archivo y léalo con:

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

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

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

Renderice uno o más botones con marca agregando `{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 está esperando su decisión.

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

Send-RjRbReportEmail `
    -EmailFrom       "realmjoin-report@contoso.com" `
    -EmailTo         "approver@contoso.com" `
    -Subject         "Acción requerida: solicitud de acceso al dispositivo" `
    -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 incorporado de Markdown → HTML. **No se requiere ningún módulo externo de Markdown.** Sintaxis admitida:

| Markdown                                      | Notas                                                                                                                                                                                                                                                                                                                                                                       |
| --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `# … ######` encabezados                      | Todos los seis niveles. El espacio después de `#` 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 representa 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.                                                                                                                                                                                                                                       |
| `[texto](url)` enlaces                        | Se abre en una nueva pestaña con `noopener noreferrer`.                                                                                                                                                                                                                                                                                                                     |
| `[etiqueta](url){button}` botones de enlace   | Se representa como un botón de llamada a la acción naranja con marca en lugar de un enlace simple. Varios `{button}` enlaces en la **misma línea** se muestran lado a lado en una sola fila (el ancho se divide por igual). Las esquinas redondeadas se muestran en clientes modernos (New Outlook, OWA, móviles); Outlook Classic (motor Word) muestra esquinas cuadradas. |
| `![alt](url)` imágenes                        | Insertadas como `<img>` (sin magia de adjuntos en línea: la URL debe ser accesible para el cliente de correo).                                                                                                                                                                                                                                                              |
| `- elemento` / `1. elemento` listas           | Se admiten listas anidadas mediante una indentación 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, no vacía, directamente debajo de una `<li>` se integra en el mismo elemento con un `<br>` salto suave — no es necesario mantener cada elemento en una sola línea.                                                                                                                                                                                    |
| `- [ ]` / `- [x]` listas de tareas            | Se representa como `☐` / `☑` Glifos Unicode (verdes cuando están marcados). `<input type="checkbox">` se evita intencionalmente porque Outlook Classic elimina los controles de formulario. Mayúscula `[X]` también cuenta como marcado.                                                                                                                                    |
| `> blockquote`                                | Se muestra con un borde izquierdo coloreado y un fondo sombreado.                                                                                                                                                                                                                                                                                                           |
| `> [!NOTE\|TIP\|IMPORTANT\|WARNING\|CAUTION]` | Advertencias al estilo de 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 tiene su propio color de acento, glifo y barra de título.                                                                                                                                               |
| `---`, `***`, `___`                           | Regla horizontal.                                                                                                                                                                                                                                                                                                                                                           |
| `\|col\|col\|` tablas                         | Tablas estándar con barras verticales con `:---`, `:---:`, `---:` especificadores de alineación. Se requieren una fila de encabezado y un separador.                                                                                                                                                                                                                        |
| `\\` escape                                   | `\*`, `\|` etc. se respetan para que se puedan emitir caracteres Markdown literales.                                                                                                                                                                                                                                                                                        |

Entre los elementos no compatibles se incluyen notas al pie, listas de definiciones y paso directo de HTML — mantén el Markdown en la tabla anterior.

## Comportamiento y manejo de errores

### Análisis de destinatarios

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

### Fallos por destinatario

Cada destinatario se envía de forma independiente. La función registra éxitos y fallos:

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

### Fallos de adjuntos

* Archivos faltantes (la ruta no existe) — se registran de forma detallada, se omiten en silencio.
* Archivos existentes pero ilegibles (bloqueados, permiso denegado) — se emite una advertencia, se omiten, el resto de la llamada continúa.
* El cuadro "Attached Files" en la parte inferior del correo electrónico enumera solo los adjuntos que se pudieron leer correctamente.

### Fallos de sustitución de imágenes

Ambos `HeaderImage` y `FooterImage` recurre 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 la versión 0.8.9, el formato de la imagen se determina a partir de la **firma de archivo** (bytes mágicos) en lugar de la extensión del archivo. Un archivo que se llama `.png` pero 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 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 frente a `^#[0-9A-Fa-f]{6}$`. Un valor que no coincide emite una advertencia que nombra el parámetro y el envío continúa con el color predeterminado. Los colores nunca son un motivo para que un informe falle.

### Límite de tamaño total

Graph limita `sendMail` las solicitudes en \~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 maneja automáticamente las cargas útiles sobredimensionadas. Sin un conjunto de respaldo, una solicitud sobredimensionada falla en la llamada a Graph; considere:

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

## Integración con la configuración de informes de runbook

Los runbooks de informe no codifican de forma fija la dirección del remitente ni la marca: declaran parámetros ocultos que el portal RealmJoin completa previamente a partir del JSON central de personalización. La configuración disponible se documenta en [Configuración del informe 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 están marcados `"Hide": true` en el `.INPUTS RunbookCustomization` bloque para que no ensucien el formulario del portal:

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

if (-not $EmailFrom) {
    throw "No EmailSender configured. See https://docs.realmjoin.com/automation/runbooks/runbook-report-settings for setup instructions."
}

# Download and validate the branding images once per run; returns only the keys
# that resolved successfully, so unset settings fall through to the defaults.
$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
```

Ver [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 si tiene éxito. Todo el progreso se escribe mediante `Write-RjRbLog -Verbose` (visible cuando el runbook se ejecuta con `-Verbose` o `$VerbosePreference = 'Continue'`). Las advertencias se fuerzan a través de `$WarningPreference = 'Continue'` independientemente de las anulaciones del lado del llamador, por lo que aparecen de forma fiable en el flujo de trabajo de Azure Automation.

## Ayudantes exportados relacionados

Los bloques de construcción detrás de `Send-RjRbReportEmail` también se exportan ahora 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 las `RJReport.Branding.*` configuraciones del tenant en parámetros listos para splattear: 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, 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 a su origen CID en línea. Valida por firma de archivo y lanza un error ante cualquier cosa que no sea PNG, JPEG o GIF.                                                                                |

Excepto por `Get-RjRbBrandingMailParams`Get-RjRbReportEmailBody `Send-RjRbReportEmail` directamente.

## Véase también

* [Get-RjRbBrandingMailParams](/es/dev-reference/report-functions/get-rjrbbrandingmailparams.md) — resolviendo la configuración de marca del tenant dentro de un runbook.
* [Configuración del informe del runbook](/es/automatizacion/runbooks/runbook-report-settings.md) — configuración central del buzón del remitente, la información del service desk, la marca y el 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 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/es/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.
