Home | History | Annotate | Download | only in library
      1 :mod:`email.contentmanager`: Managing MIME Content
      2 --------------------------------------------------
      3 
      4 .. module:: email.contentmanager
      5    :synopsis: Storing and Retrieving Content from MIME Parts
      6 
      7 .. moduleauthor:: R. David Murray <rdmurray (a] bitdance.com>
      8 .. sectionauthor:: R. David Murray <rdmurray (a] bitdance.com>
      9 
     10 **Source code:** :source:`Lib/email/contentmanager.py`
     11 
     12 ------------
     13 
     14 .. versionadded:: 3.6 [1]_
     15 
     16 
     17 .. class:: ContentManager()
     18 
     19    Base class for content managers.  Provides the standard registry mechanisms
     20    to register converters between MIME content and other representations, as
     21    well as the ``get_content`` and ``set_content`` dispatch methods.
     22 
     23 
     24    .. method:: get_content(msg, *args, **kw)
     25 
     26       Look up a handler function based on the ``mimetype`` of *msg* (see next
     27       paragraph), call it, passing through all arguments, and return the result
     28       of the call.  The expectation is that the handler will extract the
     29       payload from *msg* and return an object that encodes information about
     30       the extracted data.
     31 
     32       To find the handler, look for the following keys in the registry,
     33       stopping with the first one found:
     34 
     35             * the string representing the full MIME type (``maintype/subtype``)
     36             * the string representing the ``maintype``
     37             * the empty string
     38 
     39       If none of these keys produce a handler, raise a :exc:`KeyError` for the
     40       full MIME type.
     41 
     42 
     43    .. method:: set_content(msg, obj, *args, **kw)
     44 
     45       If the ``maintype`` is ``multipart``, raise a :exc:`TypeError`; otherwise
     46       look up a handler function based on the type of *obj* (see next
     47       paragraph), call :meth:`~email.message.EmailMessage.clear_content` on the
     48       *msg*, and call the handler function, passing through all arguments.  The
     49       expectation is that the handler will transform and store *obj* into
     50       *msg*, possibly making other changes to *msg* as well, such as adding
     51       various MIME headers to encode information needed to interpret the stored
     52       data.
     53 
     54       To find the handler, obtain the type of *obj* (``typ = type(obj)``), and
     55       look for the following keys in the registry, stopping with the first one
     56       found:
     57 
     58            * the type itself (``typ``)
     59            * the type's fully qualified name (``typ.__module__ + '.' +
     60              typ.__qualname__``).
     61            * the type's qualname (``typ.__qualname__``)
     62            * the type's name (``typ.__name__``).
     63 
     64       If none of the above match, repeat all of the checks above for each of
     65       the types in the :term:`MRO` (``typ.__mro__``).  Finally, if no other key
     66       yields a handler, check for a handler for the key ``None``.  If there is
     67       no handler for ``None``, raise a :exc:`KeyError` for the fully
     68       qualified name of the type.
     69 
     70       Also add a :mailheader:`MIME-Version` header if one is not present (see
     71       also :class:`.MIMEPart`).
     72 
     73 
     74    .. method:: add_get_handler(key, handler)
     75 
     76       Record the function *handler* as the handler for *key*.  For the possible
     77       values of *key*, see :meth:`get_content`.
     78 
     79 
     80    .. method:: add_set_handler(typekey, handler)
     81 
     82       Record *handler* as the function to call when an object of a type
     83       matching *typekey* is passed to :meth:`set_content`.  For the possible
     84       values of *typekey*, see :meth:`set_content`.
     85 
     86 
     87 Content Manager Instances
     88 ~~~~~~~~~~~~~~~~~~~~~~~~~
     89 
     90 Currently the email package provides only one concrete content manager,
     91 :data:`raw_data_manager`, although more may be added in the future.
     92 :data:`raw_data_manager` is the
     93 :attr:`~email.policy.EmailPolicy.content_manager` provided by
     94 :attr:`~email.policy.EmailPolicy` and its derivatives.
     95 
     96 
     97 .. data:: raw_data_manager
     98 
     99    This content manager provides only a minimum interface beyond that provided
    100    by :class:`~email.message.Message` itself:  it deals only with text, raw
    101    byte strings, and :class:`~email.message.Message` objects.  Nevertheless, it
    102    provides significant advantages compared to the base API: ``get_content`` on
    103    a text part will return a unicode string without the application needing to
    104    manually decode it, ``set_content`` provides a rich set of options for
    105    controlling the headers added to a part and controlling the content transfer
    106    encoding, and it enables the use of the various ``add_`` methods, thereby
    107    simplifying the creation of multipart messages.
    108 
    109    .. method:: get_content(msg, errors='replace')
    110 
    111       Return the payload of the part as either a string (for ``text`` parts), an
    112       :class:`~email.message.EmailMessage` object (for ``message/rfc822``
    113       parts), or a ``bytes`` object (for all other non-multipart types).  Raise
    114       a :exc:`KeyError` if called on a ``multipart``.  If the part is a
    115       ``text`` part and *errors* is specified, use it as the error handler when
    116       decoding the payload to unicode.  The default error handler is
    117       ``replace``.
    118 
    119    .. method:: set_content(msg, <'str'>, subtype="plain", charset='utf-8' \
    120                            cte=None, \
    121                            disposition=None, filename=None, cid=None, \
    122                            params=None, headers=None)
    123                set_content(msg, <'bytes'>, maintype, subtype, cte="base64", \
    124                            disposition=None, filename=None, cid=None, \
    125                            params=None, headers=None)
    126                set_content(msg, <'EmailMessage'>, cte=None, \
    127                            disposition=None, filename=None, cid=None, \
    128                            params=None, headers=None)
    129                set_content(msg, <'list'>, subtype='mixed', \
    130                            disposition=None, filename=None, cid=None, \
    131                            params=None, headers=None)
    132 
    133        Add headers and payload to *msg*:
    134 
    135        Add a :mailheader:`Content-Type` header with a ``maintype/subtype``
    136        value.
    137 
    138            * For ``str``, set the MIME ``maintype`` to ``text``, and set the
    139              subtype to *subtype* if it is specified, or ``plain`` if it is not.
    140            * For ``bytes``, use the specified *maintype* and *subtype*, or
    141              raise a :exc:`TypeError` if they are not specified.
    142            * For :class:`~email.message.EmailMessage` objects, set the maintype
    143              to ``message``, and set the subtype to *subtype* if it is
    144              specified or ``rfc822`` if it is not.  If *subtype* is
    145              ``partial``, raise an error (``bytes`` objects must be used to
    146              construct ``message/partial`` parts).
    147            * For *<'list'>*, which should be a list of
    148              :class:`~email.message.EmailMessage` objects, set the ``maintype``
    149              to ``multipart``, and the ``subtype`` to *subtype* if it is
    150              specified, and ``mixed`` if it is not.  If the message parts in
    151              the *<'list'>* have :mailheader:`MIME-Version` headers, remove
    152              them.
    153 
    154        If *charset* is provided (which is valid only for ``str``), encode the
    155        string to bytes using the specified character set.  The default is
    156        ``utf-8``.  If the specified *charset* is a known alias for a standard
    157        MIME charset name, use the standard charset instead.
    158 
    159        If *cte* is set, encode the payload using the specified content transfer
    160        encoding, and set the :mailheader:`Content-Transfer-Endcoding` header to
    161        that value.  Possible values for *cte* are ``quoted-printable``,
    162        ``base64``, ``7bit``, ``8bit``, and ``binary``.  If the input cannot be
    163        encoded in the specified encoding (for example, specifying a *cte* of
    164        ``7bit`` for an input that contains non-ASCII values), raise a
    165        :exc:`ValueError`.
    166 
    167             * For ``str`` objects, if *cte* is not set use heuristics to
    168               determine the most compact encoding.
    169             * For :class:`~email.message.EmailMessage`, per :rfc:`2046`, raise
    170               an error if a *cte* of ``quoted-printable`` or ``base64`` is
    171               requested for *subtype* ``rfc822``, and for any *cte* other than
    172               ``7bit`` for *subtype* ``external-body``.  For
    173               ``message/rfc822``, use ``8bit`` if *cte* is not specified.  For
    174               all other values of *subtype*, use ``7bit``.
    175 
    176        .. note:: A *cte* of ``binary`` does not actually work correctly yet.
    177           The ``EmailMessage`` object as modified by ``set_content`` is
    178           correct, but :class:`~email.generator.BytesGenerator` does not
    179           serialize it correctly.
    180 
    181        If *disposition* is set, use it as the value of the
    182        :mailheader:`Content-Disposition` header.  If not specified, and
    183        *filename* is specified, add the header with the value ``attachment``.
    184        If *disposition* is not specified and *filename* is also not specified,
    185        do not add the header.  The only valid values for *disposition* are
    186        ``attachment`` and ``inline``.
    187 
    188        If *filename* is specified, use it as the value of the ``filename``
    189        parameter of the :mailheader:`Content-Disposition` header.
    190 
    191        If *cid* is specified, add a :mailheader:`Content-ID` header with
    192        *cid* as its value.
    193 
    194        If *params* is specified, iterate its ``items`` method and use the
    195        resulting ``(key, value)`` pairs to set additional parameters on the
    196        :mailheader:`Content-Type` header.
    197 
    198        If *headers* is specified and is a list of strings of the form
    199        ``headername: headervalue`` or a list of ``header`` objects
    200        (distinguished from strings by having a ``name`` attribute), add the
    201        headers to *msg*.
    202 
    203 
    204 .. rubric:: Footnotes
    205 
    206 .. [1] Oringally added in 3.4 as a :term:`provisional module <provisional
    207        package>`
    208