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