Connect

Enviar un correo desde Outlook

Envía un correo desde el buzón de Outlook / Microsoft 365 de la conexión, a lo más una vez.

Tool IDoutlook.correo.enviar
Nombre MCPoutlook__correo__enviar
Conectoroutlook
Planoaction
Scope (permiso)outlook:send
Authconnection_credentials
Versión1
Sensiblesí
Deprecadono
ComportamientoreadOnly=false, destructive=true, idempotent=true, openWorld=true

Requiere conexión. Indica cuál en cada llamada: header X-Connect-Connection en REST y campo connectionId en el execute_write de MCP. No hay resolución implícita, ni siquiera con una sola conexión activa: la conexión es la empresa. El id sale de conexiones.estado.consultar.

Qué hace

Exige un UUID v4 como clave de idempotencia; consérvala. aceptado significa que Microsoft lo aceptó para enviarlo, no que se entregó. Si estado es resultado_desconocido, el correo pudo haber salido: no reintentes ni generes otra clave; revisa Enviados (outlook.correos.buscar con carpeta: enviados si la conexión puede leer) o pídeselo a la persona. Requiere que la cuenta haya autorizado el envío en Microsoft.

Entrada

CampoTipoRequeridoDescripción
paralista de string ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$síDestinatarios directos. Al menos uno.
cclista de string ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$noDestinatarios en copia.
ccolista de string ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$noDestinatarios en copia oculta.
asuntostringsíAsunto del correo, en una sola línea.
cuerpostringsíCuerpo del correo, en texto o en HTML según formato.
formato"texto" · "html"no · default "texto"texto (por defecto) o html.
JSON Schema de entrada
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "para": {
      "minItems": 1,
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 320,
        "format": "email",
        "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
      },
      "description": "Destinatarios directos. Al menos uno."
    },
    "cc": {
      "description": "Destinatarios en copia.",
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 320,
        "format": "email",
        "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
      }
    },
    "cco": {
      "description": "Destinatarios en copia oculta.",
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 320,
        "format": "email",
        "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
      }
    },
    "asunto": {
      "type": "string",
      "minLength": 1,
      "maxLength": 998,
      "description": "Asunto del correo, en una sola línea."
    },
    "cuerpo": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100000,
      "description": "Cuerpo del correo, en texto o en HTML según `formato`."
    },
    "formato": {
      "default": "texto",
      "description": "`texto` (por defecto) o `html`.",
      "type": "string",
      "enum": [
        "texto",
        "html"
      ]
    }
  },
  "required": [
    "para",
    "asunto",
    "cuerpo"
  ],
  "additionalProperties": false
}

Ejemplo

curl
curl -X POST https://connect.emisso.ai/api/v1/tools/outlook.correo.enviar/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Idempotency-Key: 9d1f4c2a-7b30-4e58-9c11-2f6a8de5b743" \
  -H "Content-Type: application/json" \
  -d '{"input":{"para":["cliente@ejemplo.cl"],"asunto":"Orden de compra 4512","cuerpo":"Hola, confirmamos la recepción de tu orden de compra 4512. Saludos.","formato":"texto"}}'
MCP · meta-tool execute_write
{
  "tool": "outlook.correo.enviar",
  "params": {
    "para": [
      "cliente@ejemplo.cl"
    ],
    "asunto": "Orden de compra 4512",
    "cuerpo": "Hola, confirmamos la recepción de tu orden de compra 4512. Saludos.",
    "formato": "texto"
  },
  "connectionId": "conn_9tKfR2mQx4Vb",
  "idempotencyKey": "9d1f4c2a-7b30-4e58-9c11-2f6a8de5b743"
}

Clave de idempotencia obligatoria. Sin ella la llamada responde idempotency_key_missing. Genera un UUID v4 nuevo por operación y envíalo en Idempotency-Key (REST) o en idempotencyKey (MCP). Repite la misma clave solo al reintentar esa operación.

Salida esperada (200):

{
  "data": {
    "estado": "aceptado",
    "operacionId": "req_5tYw2nRk88Ma",
    "puedeReintentar": false,
    "siguientePaso": "ninguno"
  },
  "meta": {
    "request_id": "req_…",
    "tool_id": "outlook.correo.enviar",
    "plane": "action",
    "latency_ms": 7410,
    "audit_status": "recorded"
  }
}

Microsoft no devuelve el identificador del correo enviado. Conserva la Idempotency-Key; si estado fuera resultado_desconocido, repite con la misma clave, nunca con otra.

Salida

CampoTipoRequeridoDescripción
estado"aceptado" · "resultado_desconocido"síaceptado si Microsoft aceptó el correo para enviarlo (202); no confirma la entrega. resultado_desconocido si el correo pudo haber salido.
operacionIdstringsírequest_id de la operación: el de la primera solicitud con esta clave.
puedeReintentarbooleanosíSiempre false: reintentar con otra clave duplicaría el correo.
siguientePaso"ninguno" · "revisar_enviados"sírevisar_enviados cuando el resultado es desconocido: revisa la carpeta Enviados antes de hacer nada más.
JSON Schema de salida
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "estado": {
      "type": "string",
      "enum": [
        "aceptado",
        "resultado_desconocido"
      ],
      "description": "`aceptado` si Microsoft aceptó el correo para enviarlo (202); no confirma la entrega. `resultado_desconocido` si el correo pudo haber salido."
    },
    "operacionId": {
      "type": "string",
      "description": "request_id de la operación: el de la primera solicitud con esta clave."
    },
    "puedeReintentar": {
      "type": "boolean",
      "const": false,
      "description": "Siempre false: reintentar con otra clave duplicaría el correo."
    },
    "siguientePaso": {
      "type": "string",
      "enum": [
        "ninguno",
        "revisar_enviados"
      ],
      "description": "`revisar_enviados` cuando el resultado es desconocido: revisa la carpeta Enviados antes de hacer nada más."
    }
  },
  "required": [
    "estado",
    "operacionId",
    "puedeReintentar",
    "siguientePaso"
  ],
  "additionalProperties": false
}

Errores de esta tool

CódigoHTTPReintentableQué hacer
connection_disabled403noReactívala en /connections o usa otra conexión del mismo sistema.
connection_not_found404noUsa uno de los connectionId que lista el error, o revisa la conexión en /connections. No hace falta reactivar nada.
connection_credential_required428noCrea un enlace con conexiones.enlace.crear (modo reconectar si la conexión ya existe) y pide a la persona que entregue la credencial de nuevo. No reintentes con la credencial anterior.
connection_busy409síEspera unos segundos y reintenta. Es una espera transitoria: no necesitas volver a conectar ni ingresar la credencial otra vez.
upstream_error502síReintenta más tarde. Si persiste, el problema está en el sistema externo, no en tu integración.
timeout504síReintenta. Para sincronizaciones largas usa la vía asíncrona y consulta el estado del trabajo.
connector_onboarding_required428noLee el mensaje: dice qué falta. Se completa en el portal de ese sistema, no en Connect, y después la llamada funciona sin cambios.
connection_scope_not_enabled403noPide a un owner/admin que habilite el scope en /connections para esa conexión, o usa otra que ya lo tenga activo. Cambiar la credencial del actor no resuelve este error.
rate_limited429síEspera y reintenta con backoff exponencial.
upstream_unexpected_response502noNo reintentes: la respuesta es determinista. Repórtalo con el request_id para que actualicemos el conector.
idempotency_key_missing400noGenera un UUID v4, envíalo como Idempotency-Key y reutilízalo solo para reintentos de esta misma operación.
idempotency_in_progress409síEspera unos segundos y reintenta con la MISMA clave. Generar una nueva para la misma operación es lo que duplica el efecto.
idempotency_conflict409noGenera una clave nueva para una operación nueva; reutiliza la clave solo para reintentar la misma.

Toda llamada puede devolver además los códigos transversales (validation_error, unauthorized, scope_not_granted, rate_limited, entre otros): el detalle vive en el catálogo de errores.

En esta página