# `email.contentmanager`: Gestión de contenido MIME

Código fuente: Lib/email/contentmanager.py

Nuevo en la versión 3.6: [1]

class email.contentmanager.ContentManager

  Clase base para gestores de contenido. Proporciona los mecanismos de registro estándar para registrar convertidores entre contenido MIME y otras representaciones, así como los métodos de envío `get_content` y `set_content`.

  get_content(msg, *args, **kw)

    Busca una función de controlador basada en el `mimetype` de msg (ver el siguiente párrafo), la llama, le pasa todos los argumentos y retorna el resultado de la llamada. La expectativa es que el controlador extraiga la carga útil de msg y retorne un objeto que codifica información sobre los datos extraídos.

    Para encontrar el controlador, busca las siguientes llaves en el registro, deteniéndose con la primera que encuentre:

    - la cadena que representa el tipo MIME completo (`maintype/subtype`)

    - la cadena de caracteres que representa el `maintype`

    - la cadena de caracteres vacía

    Si ninguna de estas llaves produce un controlador, se lanza una excepción `KeyError` para el tipo MIME completo.

  set_content(msg, obj, *args, **kw)

    Si el `maintype` es `multipart`, se lanza un `TypeError`; de lo contrario, busca una función de controlador basada en el tipo de obj (ver el siguiente párrafo), llama a `clear_content()` en el msg y llama a la función de controlador, pasando todos los argumentos. La expectativa es que el controlador transforme y almacene obj en msg, posiblemente realizando otros cambios a msg también, como agregar varios encabezados MIME para codificar la información necesaria para interpretar los datos almacenados.

    Para encontrar el controlador, obtiene el tipo de obj (`typ = type(obj)`), y busca las siguientes llaves en el registro, deteniéndose con la primera encontrada:

    - el tipo en sí (`typ`)

    - el nombre completo de calificación del tipo (`typ.__module__ + '.' + typ.__qualname__`).

    - el nombre de calificación del tipo (`typ.__qualname__`)

    - el nombre del tipo (`typ.__name__`).

    Si ninguno de los anteriores coincide, repite todas las comprobaciones anteriores para cada uno de los tipos en el MRO (`typ.__mro__`). Finalmente, si ninguna otra llave produce un controlador, busca un controlador para la llave `None`. Si no hay un controlador para `None`, lanza un `KeyError` para el nombre completo de calificación del tipo.

    También agrega un encabezado MIME-Version si no hay uno presente (vea también `MIMEPart`).

  add_get_handler(key, handler)

    Registra el handler de funciones como el manejador de key. Para los posibles valores de key, consulte `get_content()`.

  add_set_handler(typekey, handler)

    Registra el handler como la función a llamar cuando un objeto de un tipo coincidente typekey se pasa a `set_content()`. Para los posibles valores de typekey, consulte `set_content()`.

## Instancias gestoras de contenido

Actualmente, el paquete de correo electrónico solo proporciona un administrador de contenido concreto, `raw_data_manager`, aunque en el futuro se pueden agregar más. `raw_data_manager` es el `content_manager` proporcionado por `EmailPolicy` y sus derivados.

email.contentmanager.raw_data_manager

  Este administrador de contenido proporciona sólo una interfaz mínima más allá de la proporcionada por `Message` en sí: trata solo con texto, cadenas de bytes sin procesar, y objetos `Message`. Sin embargo, proporciona ventajas significativas en comparación con la API base: `get_content` en una parte de texto retornará una cadena de caracteres unicode sin que la aplicación tenga que decodificarla manualmente, `set_content` proporciona un amplio conjunto de opciones para controlar los encabezados añadidos a una parte y controlar la codificación de transferencia de contenido, y permite el uso de los diversos métodos `add_`, simplificando así la creación de mensajes multiparte.

  email.contentmanager.get_content(msg, errors='replace')

    Retorna la carga útil de la parte como una cadena de caracteres (para partes de `text`), un objeto `EmailMessage` (para partes de `message/rfc822`), o un objeto de `bytes` (para todos los demás tipos que no son multiparte). Lanza un `KeyError` si se llama en un `multipart`. Si la parte es una parte de `text` y se especifica errors, se usa como el controlador de errores al decodificar la carga útil a unicode. El controlador de errores predeterminado es `replace`.

  email.contentmanager.set_content(msg, <'str'>, subtype="plain", charset='utf-8', cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)
  email.contentmanager.set_content(msg, <'bytes'>, maintype, subtype, cte="base64", disposition=None, filename=None, cid=None, params=None, headers=None)
  email.contentmanager.set_content(msg, <'EmailMessage'>, cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)

    Añade cabeceras y carga útil al msg:

    Añade un encabezado Content-Type con un valor `maintype/subtype`.

    - Para `str`, establece el `maintype` de MIME en `text`, y establece el subtipo en subtype si se especifica, o `plain` si no está presente.

    - Para `bytes`, usa el maintype y subtype especificados, o lanza un `TypeError` si no se especifican.

    - Para objetos `EmailMessage`, establece el maintype en `message`, y establece el subtype en subtype si se especifica o `rfc822` si no se especifica. Si subtype es `partial`, se lanza un error (los objetos de `bytes` deben usarse para construir partes `message/partial`).

    Si se proporciona charset (lo cual solo es válido para `str`), codifica la cadena de caracteres en bytes utilizando el conjunto de caracteres especificado. El valor por defecto es `utf-8`. Si el charset especificado es un alias conocido del nombre de un conjunto de caracteres del estándar MIME, utiliza el conjunto de caracteres estándar en su lugar.

    Si se establece cte, codifica la carga útil mediante la codificación de transferencia de contenido especificada y establece el encabezado Content-Transfer-Encoding en ese valor. Los valores posibles para cte son `quoted-printable`, `base64`, `7bit`, `8bit`, y `binary`. Si la entrada no se puede codificar en la codificación especificada (por ejemplo, especificando un cte de `7bit` para una entrada que contiene valores no ASCII), se lanza un `ValueError`.

    - Para objetos `str`, si cte no está configurado, se usa la heurística para determinar la codificación más compacta.

    - Para `EmailMessage`, según RFC 2046, se lanza un error si se solicita un cte de `quoted-printable` o `base64` para el subtype `rfc822`, y para cualquier cte que no sea `7bit` para el subtype `external-body`. Para `message/rfc822`, se usa `8bit` si no se especifica cte. Para todos los demás valores de subtype, se usa `7bit`.

    Nota

    Un cte de `binary` todavía no funciona correctamente. El objeto `EmailMessage` modificado por `set_content` es correcto, pero `BytesGenerator` no lo serializa correctamente.

    Si se establece disposición, se usa como valor del encabezado Content-Disposition. Si no se especifica y se especifica filename, agrega el encabezado con el valor `attachment`. Si no se especifica disposition y tampoco se especifica filename, no agrega el encabezado. Los únicos valores válidos para disposition son `attachment` e `inline`.

    Si se especifica el filename, se usa como el valor del parámetro `filename` del encabezado Content-Disposition.

    Si se especifica cid, agrega un encabezado Content-ID con valor cid.

    Si se especifica params, itera su método `items` y use los pares resultantes `(key, value)` para establecer parámetros adicionales en el encabezado Content-Type.

    Si se especifica headers y es una lista de cadenas de caracteres de la forma `headername: headervalue` o una lista de objetos `header` (que se distinguen de las cadenas de caracteres por tener un atributo `name`), agrega los encabezados a msg.

Notas al pie de página

[1]

Originalmente añadido en la versión 3.4 como un módulo provisional