| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | :mod:`email`: Policy Objects
 | 
					
						
							|  |  |  | ----------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. module:: email.policy
 | 
					
						
							|  |  |  |    :synopsis: Controlling the parsing and generating of messages
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-10 21:43:13 +02:00
										 |  |  | .. versionadded:: 3.3
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | The :mod:`email` package's prime focus is the handling of email messages as
 | 
					
						
							|  |  |  | described by the various email and MIME RFCs.  However, the general format of
 | 
					
						
							|  |  |  | email messages (a block of header fields each consisting of a name followed by
 | 
					
						
							|  |  |  | a colon followed by a value, the whole block followed by a blank line and an
 | 
					
						
							|  |  |  | arbitrary 'body'), is a format that has found utility outside of the realm of
 | 
					
						
							|  |  |  | email.  Some of these uses conform fairly closely to the main RFCs, some do
 | 
					
						
							|  |  |  | not.  And even when working with email, there are times when it is desirable to
 | 
					
						
							|  |  |  | break strict compliance with the RFCs.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  | Policy objects give the email package the flexibility to handle all these
 | 
					
						
							|  |  |  | disparate use cases.
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | A :class:`Policy` object encapsulates a set of attributes and methods that
 | 
					
						
							|  |  |  | control the behavior of various components of the email package during use.
 | 
					
						
							|  |  |  | :class:`Policy` instances can be passed to various classes and methods in the
 | 
					
						
							|  |  |  | email package to alter the default behavior.  The settable values and their
 | 
					
						
							|  |  |  | defaults are described below.  The :mod:`policy` module also provides some
 | 
					
						
							|  |  |  | pre-created :class:`Policy` instances.  In addition to a :const:`default`
 | 
					
						
							|  |  |  | instance, there are instances tailored for certain applications.  For example
 | 
					
						
							|  |  |  | there is an :const:`SMTP` :class:`Policy` with defaults appropriate for
 | 
					
						
							| 
									
										
										
										
											2011-04-19 09:21:00 +02:00
										 |  |  | generating output to be sent to an SMTP server.  These are listed `below
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | <Policy Instances>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In general an application will only need to deal with setting the policy at the
 | 
					
						
							|  |  |  | input and output boundaries.  Once parsed, a message is represented by a
 | 
					
						
							|  |  |  | :class:`~email.message.Message` object, which is designed to be independent of
 | 
					
						
							|  |  |  | the format that the message has "on the wire" when it is received, transmitted,
 | 
					
						
							|  |  |  | or displayed.  Thus, a :class:`Policy` can be specified when parsing a message
 | 
					
						
							|  |  |  | to create a :class:`~email.message.Message`, and again when turning the
 | 
					
						
							|  |  |  | :class:`~email.message.Message` into some other representation.  While often a
 | 
					
						
							|  |  |  | program will use the same :class:`Policy` for both input and output, the two
 | 
					
						
							|  |  |  | can be different.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | As an example, the following code could be used to read an email message from a
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  | file on disk and pass it to the system ``sendmail`` program on a Unix system::
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    >>> from email import msg_from_binary_file
 | 
					
						
							|  |  |  |    >>> from email.generator import BytesGenerator
 | 
					
						
							|  |  |  |    >>> import email.policy
 | 
					
						
							|  |  |  |    >>> from subprocess import Popen, PIPE
 | 
					
						
							|  |  |  |    >>> with open('mymsg.txt', 'b') as f:
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  |    ...     Msg = msg_from_binary_file(f, policy=email.policy.mbox)
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  |    >>> p = Popen(['sendmail', msg['To'][0].address], stdin=PIPE)
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  |    >>> g = BytesGenerator(p.stdin, policy=email.policy.SMTP)
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  |    >>> g.flatten(msg)
 | 
					
						
							|  |  |  |    >>> p.stdin.close()
 | 
					
						
							|  |  |  |    >>> rc = p.wait()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Some email package methods accept a *policy* keyword argument, allowing the
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  | policy to be overridden for that method.  For example, the following code uses
 | 
					
						
							|  |  |  | the :meth:`email.message.Message.as_string` method of the *msg* object from the
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | previous example and re-write it to a file using the native line separators for
 | 
					
						
							|  |  |  | the platform on which it is running::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    >>> import os
 | 
					
						
							|  |  |  |    >>> mypolicy = email.policy.Policy(linesep=os.linesep)
 | 
					
						
							|  |  |  |    >>> with open('converted.txt', 'wb') as f:
 | 
					
						
							|  |  |  |    ...     f.write(msg.as_string(policy=mypolicy))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Policy instances are immutable, but they can be cloned, accepting the same
 | 
					
						
							|  |  |  | keyword arguments as the class constructor and returning a new :class:`Policy`
 | 
					
						
							|  |  |  | instance that is a copy of the original but with the specified attributes
 | 
					
						
							|  |  |  | values changed.  For example, the following creates an SMTP policy that will
 | 
					
						
							|  |  |  | raise any defects detected as errors::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    >>> strict_SMTP = email.policy.SMTP.clone(raise_on_defect=True)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Policy objects can also be combined using the addition operator, producing a
 | 
					
						
							|  |  |  | policy object whose settings are a combination of the non-default values of the
 | 
					
						
							|  |  |  | summed objects::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    >>> strict_SMTP = email.policy.SMTP + email.policy.strict
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This operation is not commutative; that is, the order in which the objects are
 | 
					
						
							|  |  |  | added matters.  To illustrate::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    >>> Policy = email.policy.Policy
 | 
					
						
							|  |  |  |    >>> apolicy = Policy(max_line_length=100) + Policy(max_line_length=80)
 | 
					
						
							|  |  |  |    >>> apolicy.max_line_length
 | 
					
						
							|  |  |  |    80
 | 
					
						
							|  |  |  |    >>> apolicy = Policy(max_line_length=80) + Policy(max_line_length=100)
 | 
					
						
							|  |  |  |    >>> apolicy.max_line_length
 | 
					
						
							|  |  |  |    100
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: Policy(**kw)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The valid constructor keyword arguments are any of the attributes listed
 | 
					
						
							|  |  |  |    below.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: max_line_length
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The maximum length of any line in the serialized output, not counting the
 | 
					
						
							|  |  |  |       end of line character(s).  Default is 78, per :rfc:`5322`.  A value of
 | 
					
						
							|  |  |  |       ``0`` or :const:`None` indicates that no line wrapping should be
 | 
					
						
							|  |  |  |       done at all.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: linesep
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The string to be used to terminate lines in serialized output.  The
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  |       default is ``\n`` because that's the internal end-of-line discipline used
 | 
					
						
							|  |  |  |       by Python, though ``\r\n`` is required by the RFCs.  See `Policy
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  |       Instances`_ for policies that use an RFC conformant linesep.  Setting it
 | 
					
						
							|  |  |  |       to :attr:`os.linesep` may also be useful.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: must_be_7bit
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  |       If ``True``, data output by a bytes generator is limited to ASCII
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  |       characters.  If :const:`False` (the default), then bytes with the high
 | 
					
						
							|  |  |  |       bit set are preserved and/or allowed in certain contexts (for example,
 | 
					
						
							|  |  |  |       where possible a content transfer encoding of ``8bit`` will be used).
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  |       String generators act as if ``must_be_7bit`` is ``True`` regardless of
 | 
					
						
							|  |  |  |       the policy in effect, since a string cannot represent non-ASCII bytes.
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: raise_on_defect
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       If :const:`True`, any defects encountered will be raised as errors.  If
 | 
					
						
							|  |  |  |       :const:`False` (the default), defects will be passed to the
 | 
					
						
							|  |  |  |       :meth:`register_defect` method.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  |    :mod:`Policy` object also have the following methods:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  |    .. method:: handle_defect(obj, defect)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       *obj* is the object on which to register the defect.  *defect* should be
 | 
					
						
							|  |  |  |       an instance of a  subclass of :class:`~email.errors.Defect`.
 | 
					
						
							|  |  |  |       If :attr:`raise_on_defect`
 | 
					
						
							|  |  |  |       is ``True`` the defect is raised as an exception.  Otherwise *obj* and
 | 
					
						
							|  |  |  |       *defect* are passed to :meth:`register_defect`.  This method is intended
 | 
					
						
							|  |  |  |       to be called by parsers when they encounter defects, and will not be
 | 
					
						
							|  |  |  |       called by code that uses the email library unless that code is
 | 
					
						
							|  |  |  |       implementing an alternate parser.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: register_defect(obj, defect)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       *obj* is the object on which to register the defect.  *defect* should be
 | 
					
						
							|  |  |  |       a subclass of :class:`~email.errors.Defect`.  This method is part of the
 | 
					
						
							|  |  |  |       public API so that custom ``Policy`` subclasses can implement alternate
 | 
					
						
							|  |  |  |       handling of defects.  The default implementation calls the ``append``
 | 
					
						
							|  |  |  |       method of the ``defects`` attribute of *obj*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  |    .. method:: clone(obj, *kw)
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |       Return a new :class:`Policy` instance whose attributes have the same
 | 
					
						
							|  |  |  |       values as the current instance, except where those attributes are
 | 
					
						
							|  |  |  |       given new values by the keyword arguments.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Policy Instances
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  | ^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | The following instances of :class:`Policy` provide defaults suitable for
 | 
					
						
							|  |  |  | specific common application domains.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. data:: default
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  |    An instance of :class:`Policy` with all defaults unchanged.
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. data:: SMTP
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  |    Output serialized from a message will conform to the email and SMTP
 | 
					
						
							|  |  |  |    RFCs.  The only changed attribute is :attr:`linesep`, which is set to
 | 
					
						
							|  |  |  |    ``\r\n``.
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. data:: HTTP
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  |    Suitable for use when serializing headers for use in HTTP traffic.
 | 
					
						
							|  |  |  |    :attr:`linesep` is set to ``\r\n``, and :attr:`max_line_length` is set to
 | 
					
						
							|  |  |  |    :const:`None` (unlimited).
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. data:: strict
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-18 16:00:47 -04:00
										 |  |  |    :attr:`raise_on_defect` is set to :const:`True`.
 |