> ## Documentation Index
> Fetch the complete documentation index at: https://docs.basaltic.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Envío de correo

> Envíe mensajes, gestione la aceptación y los resultados parciales por lotes y consulte los resultados de entrega.

Use una [identidad verificada](/es/email/identities) en la región de destino. La dirección `from` debe pertenecer a ese dominio o a uno de sus subdominios. Enviar requiere `email:SendMessage` sobre la identidad; los envíos con plantilla también requieren `email:SendTemplatedMessage` sobre la plantilla.

<span id="send-a-message" />

## Enviar un mensaje

<Tabs>
  <Tab title="Console">
    Abra Email y **Sent messages** para enviar un mensaje y consultar su estado. Seleccione una identidad verificada e introduzca remitente, destinatarios, asunto y cuerpo.
  </Tab>

  <Tab title="API">
    Envíe `POST /v1/sent-messages`. Use la cabecera `Idempotency-Key` al reintentar la misma solicitud para que un timeout de red no produzca otro correo.

    ```json theme={null}
    {
      "identity":"example.com",
      "from":"updates@example.com",
      "to":["reader@example.net"],
      "subject":"Your report is ready",
      "content":{"text":"Your report is ready to view."},
      "configuration_set":"transactional"
    }
    ```

    `configuration_set` es opcional. Los selectores de recursos aceptan un UUID, un nombre dentro de la cuenta o un CRN correspondiente. Consulte [Autenticación](/es/authentication) para el token bearer y la cabecera `X-Account-Id`.
  </Tab>

  <Tab title="CLI">
    Guarde la solicitud JSON de la pestaña API como `request-1.json`. Use su cuenta y región configuradas.

    ```bash theme={null}
    basaltic email sent-message send --from-file request-1.json
    ```
  </Tab>

  <Tab title="Go">
    Guarde la solicitud JSON de la pestaña API como `request-1.json`. Configure credenciales, cuenta y región mediante las variables de entorno del SDK.

    ```go theme={null}
    package main

    import (
    	"context"
    	"encoding/json"
    	"fmt"
    	"os"

    	basaltic "github.com/basaltic-sh/sdk-go"
    	"github.com/basaltic-sh/sdk-go/email"
    )

    func readJSON(path string, value any) error {
    	data, err := os.ReadFile(path)
    	if err != nil {
    		return err
    	}
    	return json.Unmarshal(data, value)
    }

    func run() error {
    	ctx := context.Background()
    	cfg, err := basaltic.NewConfig(ctx)
    	if err != nil {
    		return err
    	}
    	client := email.New(cfg)
    	var request1 email.SendMessageRequest
    	if err := readJSON("request-1.json", &request1); err != nil {
    		return err
    	}
    	result1, err := client.SendMessage(ctx, &request1)
    	if err != nil {
    		return err
    	}
    	fmt.Printf("%+v\n", result1)
    	return nil
    }

    func main() {
    	if err := run(); err != nil {
    		fmt.Fprintln(os.Stderr, err)
    		os.Exit(1)
    	}
    }
    ```
  </Tab>
</Tabs>

`content` selecciona un modo explícito: `text` y/o `html`, `raw` para un mensaje RFC 5322 completo o `template` con `template_data`. El texto nunca se interpreta automáticamente como HTML. Proporcione `subject` para texto/HTML; los mensajes sin procesar y las plantillas aportan su propio asunto. El servicio valida el remitente y firma el correo saliente con DKIM. Para contenido reutilizable, consulte [Plantillas y envíos por lotes](/es/email/templates).

<span id="acceptance-and-delivery" />

## Aceptación y entrega

La respuesta contiene un `message` con UUID, CRN y ResourceRef `identity`. La aceptación correcta de la API encola el mensaje. No demuestra la entrega en la bandeja de entrada.

| Estado | Significado |
| - | - |
| `queued` | Aceptado y esperando un worker de envío. |
| `sending` | Hay un intento de entrega SMTP en curso. |
| `sent` | El servidor SMTP destinatario aceptó el mensaje. |
| `failed` | Falló el intento SMTP o el proceso de envío. |
| `bounced` | Se informó un rebote posterior. |
| `complained` | Se informó una queja posterior. |

Lea `GET /v1/sent-messages/{message_id}` para obtener `smtp_response`, `error_message` y las marcas de tiempo de los resultados. Un registro de mensaje puede contener varios destinatarios; su estado no es un recibo individual de entrega por dirección. Envíe mensajes separados cuando necesite un resultado independiente por destinatario.

Liste mensajes con `GET /v1/sent-messages`, filtrando opcionalmente por `identity`, `status` o `recipient`. Use `meta.marker` para la página siguiente, conservando los filtros. Lea texto/HTML decodificados completos en `/v1/sent-messages/{message_id}/content`, descargue MIME reconstruido en `/raw` y archivos individuales en `/attachments/{attachment_id}`. La lectura de contenido requiere `email:GetSentMessageContent`, independientemente del acceso a metadatos.

<span id="suppressions-and-rejections" />

## Supresiones y rechazos

Las supresiones de la cuenta eliminan destinatarios coincidentes antes de encolar. La solicitud falla cuando todos los destinatarios están suprimidos. Un conjunto de configuración puede omitir explícitamente determinadas direcciones suprimidas; úselo solo después de resolver la causa. Cree entradas manuales con `POST /v1/suppressions`; las direcciones duplicadas devuelven 409. Use `PATCH /v1/suppressions/{suppression_id}` para cambiar descripción o vencimiento. La omisión conserva el vencimiento y null lo hace permanente. Lea y elimine supresiones individuales por UUID en la misma ruta.

Las entradas manuales y las creadas por rebotes o quejas aparecen en **Suppressions**. Eliminar una entrada permite futuros envíos; no reenvía correos.

Las solicitudes rechazadas no crean registros de mensajes encolados. Consulte `GET /v1/rejections` para el motivo del rechazo, los destinatarios afectados y la referencia opcional de identidad. Un rechazo puede no tener identidad si no se pudo resolver.

Para tendencias agregadas de envío y respuestas, use [Métricas de Email](/es/email/metrics). Los detalles de aperturas y clics por mensaje siguen disponibles en `GET /v1/sent-messages/{message_id}/engagement`.

<span id="message-retention-and-attachments" />

## Retención de mensajes y adjuntos

El contenido de mensajes enviados se conserva **30 días**, incluidos en el precio de envío. La respuesta incluye `expires_at`. El historial deja de estar disponible tras el vencimiento; los objetos de adjuntos siguen sujetos al ciclo de vida del bucket y a los cargos de Storage.

Para adjuntar objetos existentes, proporcione `attachments` al enviar un mensaje:

```json theme={null}
{
  "identity": "example.com",
  "from": "sender@example.com",
  "to": ["recipient@example.net"],
  "subject": "Your report",
  "content": {"text": "Your report is attached."},
  "attachments": [
    {"bucket":"email-files","key":"reports/report.pdf","name":"report.pdf"}
  ]
}
```

El bucket debe pertenecer a la misma cuenta y región. Se requiere `storage:GetObject`. Un `version_id` opcional selecciona una versión concreta del objeto; el servicio fija la versión y la suma de comprobación seleccionadas para que una sobrescritura posterior no cambie silenciosamente un correo aceptado. Un adjunto ausente o modificado impide la entrega.

Cuando `content.raw` contiene un mensaje MIME completo con adjuntos binarios, proporcione también `attachments_bucket`, usando nombre, UUID o CRN del bucket. Email extrae esos adjuntos a `email/{identity_id}/sent/{message_id}/` y conserva solo sus referencias junto al cuerpo del mensaje. Esta ruta requiere `storage:PutObject` y `storage:GetObject` bajo ese prefijo. Los adjuntos se leen antes de firmar con DKIM.

Las cuotas de la organización limitan el tamaño codificado completo y los destinatarios de envío aceptados por segundo móvil y en 24 horas móviles. Se aplican entre cuentas e identidades de la región y cuentan los destinatarios restantes tras filtrar supresiones. Las admisiones fallidas no consumen cuota. Consulte la [referencia de cuotas y retención](/es/email/receiving#quotas-and-retention).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.