"email.contentmanager": Managing MIME Content
*********************************************

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

======================================================================

Added in version 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__").

      * the type's "qualname" ("typ.__qualname__")

      * the type's "name" ("typ.__name__").

      If none of the above match, repeat all of the checks above for
      each of the types in the *MRO* ("typ.__mro__"). Finally, if no
      other key yields a handler, check for a handler for the key
      "None".  If there is no handler for "None", raise a "KeyError"
      for the fully qualified name of the type.

      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

   This content manager provides only a minimum interface beyond that
   provided by "Message" itself:  it deals only with text, raw bytes,
   and "Message" objects.  Nevertheless, it provides significant
   advantages compared to the base API: "get_content" on a text part
   will return a string without the application needing to manually
   decode it, "set_content" provides a rich set of options for
   controlling the headers added to a part and controlling the content
   transfer encoding, and it enables the use of the various "add_"
   methods, thereby simplifying the creation of multipart messages.

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

      Return the payload of the part as either a string (for "text"
      parts), an "EmailMessage" object (for "message/rfc822" parts),
      or a "bytes" object (for all other non-multipart types).  Raise
      a "KeyError" if called on a "multipart".  If the part is a
      "text" part and *errors* is specified, use it as the error
      handler when decoding the payload to a string.  The default
      error handler is "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".

      * For "str" objects, if *cte* is not set use heuristics to
        determine the most compact encoding.  Prior to encoding,
        "str.splitlines()" is used to normalize all line boundaries,
        ensuring that each line of the payload is terminated by the
        current policy's "linesep" property (even if the original
        string did not end with one).

      * For "bytes" objects, *cte* is taken to be base64 if not set,
        and the aforementioned newline translation is not performed.

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