Python 3.6.5 Documentation >  "email.contentmanager": Managing MIME Content

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

**Source code:** Lib/email/contentmanager.py

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

New in version 3.6: [1]

class email.contentmanager.ContentManager

Base class for content managers. Provides the standard registry
mechanisms to register converters between MIME content and other
representations, as well as the "get_content" and "set_content"
dispatch methods.

get_content(msg, *args, **kw)

Look up a handler function based on the "mimetype" of *msg* (see
next paragraph), call it, passing through all arguments, and
return the result of the call. The expectation is that the
handler will extract the payload from *msg* and return an object
that encodes information about the extracted data.

To find the handler, look for the following keys in the
registry, stopping with the first one found:

* the string representing the full MIME type
("maintype/subtype")

* the string representing the "maintype"

* the empty string

If none of these keys produce a handler, raise a "KeyError" for
the full MIME type.

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

If the "maintype" is "multipart", raise a "TypeError"; otherwise
look up a handler function based on the type of *obj* (see next
paragraph), call "clear_content()" on the *msg*, and call the
handler function, passing through all arguments. The
expectation is that the handler will transform and store *obj*
into *msg*, possibly making other changes to *msg* as well, such
as adding various MIME headers to encode information needed to
interpret the stored data.

To find the handler, obtain the type of *obj* ("typ =
type(obj)"), and look for the following keys in the registry,
stopping with the first one found:

* the type itself ("typ")

* the type’s fully qualified name ("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.

Also add a *MIME-Version* header if one is not present (see also
"MIMEPart").

add_get_handler(key, handler)

Record the function *handler* as the handler for *key*. For the
possible values of *key*, see "get_content()".

add_set_handler(typekey, handler)

Record *handler* as the function to call when an object of a
type matching *typekey* is passed to "set_content()". For the
possible values of *typekey*, see "set_content()".


Content Manager Instances
=========================

Currently the email package provides only one concrete content
manager, "raw_data_manager", although more may be added in the future.
"raw_data_manager" is the "content_manager" provided by "EmailPolicy"
and its derivatives.

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 byte
strings, and "Message" objects. Nevertheless, it provides
significant advantages compared to the base API: "get_content" on a
text part will return a unicode 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 unicode. 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)
email.contentmanager.set_content(msg, <'list'>, subtype='mixed', disposition=None, filename=None, cid=None, params=None, headers=None)

Add headers and payload to *msg*:

Add a *Content-Type* header with a "maintype/subtype" value.

* For "str", set the MIME "maintype" to "text", and set the
subtype to *subtype* if it is specified, or "plain" if it
is not.

* For "bytes", use the specified *maintype* and *subtype*,
or raise a "TypeError" if they are not specified.

* For "EmailMessage" objects, set the maintype to
"message", and set the subtype to *subtype* if it is
specified or "rfc822" if it is not. If *subtype* is
"partial", raise an error ("bytes" objects must be used to
construct "message/partial" parts).

* For *<’list’>*, which should be a list of "EmailMessage"
objects, set the "maintype" to "multipart", and the
"subtype" to *subtype* if it is specified, and "mixed" if
it is not. If the message parts in the *<’list’>* have
*MIME-Version* headers, remove them.

If *charset* is provided (which is valid only for "str"), encode
the string to bytes using the specified character set. The
default is "utf-8". If the specified *charset* is a known alias
for a standard MIME charset name, use the standard charset
instead.

If *cte* is set, encode the payload using the specified content
transfer encoding, and set the *Content-Transfer-Encoding*
header to that value. Possible values for *cte* are "quoted-
printable", "base64", "7bit", "8bit", and "binary". If the
input cannot be encoded in the specified encoding (for example,
specifying a *cte* of "7bit" for an input that contains non-
ASCII values), raise a "ValueError".

* For "str" objects, if *cte* is not set use heuristics to
determine the most compact encoding.

* For "EmailMessage", per **RFC 2046**, raise an error if a
*cte* of "quoted-printable" or "base64" is requested for
*subtype* "rfc822", and for any *cte* other than "7bit" for
*subtype* "external-body". For "message/rfc822", use
"8bit" if *cte* is not specified. For all other values of
*subtype*, use "7bit".

Note: A *cte* of "binary" does not actually work correctly
yet. The "EmailMessage" object as modified by "set_content" is
correct, but "BytesGenerator" does not serialize it correctly.

If *disposition* is set, use it as the value of the *Content-
Disposition* header. If not specified, and *filename* is
specified, add the header with the value "attachment". If
*disposition* is not specified and *filename* is also not
specified, do not add the header. The only valid values for
*disposition* are "attachment" and "inline".

If *filename* is specified, use it as the value of the
"filename" parameter of the *Content-Disposition* header.

If *cid* is specified, add a *Content-ID* header with *cid* as
its value.

If *params* is specified, iterate its "items" method and use the
resulting "(key, value)" pairs to set additional parameters on
the *Content-Type* header.

If *headers* is specified and is a list of strings of the form
"headername: headervalue" or a list of "header" objects
(distinguished from strings by having a "name" attribute), add
the headers to *msg*.

-[ Footnotes ]-

[1] Originally added in 3.4 as a *provisional module*