summaryrefslogtreecommitdiffstats
path: root/Doc/library/email.policy.rst
blob: d9a292ca31f72d54d991deddabb902d633ae8248 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
:mod:`email`: Policy Objects
----------------------------

.. module:: email.policy
   :synopsis: Controlling the parsing and generating of messages

.. versionadded:: 3.3


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.

Policy objects give the email package the flexibility to handle all these
disparate use cases.

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
generating output to be sent to an SMTP server.  These are listed `below
<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
file on disk and pass it to the system ``sendmail`` program on a Unix system::

   >>> 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:
   ...     msg = msg_from_binary_file(f, policy=email.policy.mbox)
   >>> p = Popen(['sendmail', msg['To'][0].address], stdin=PIPE)
   >>> g = BytesGenerator(p.stdin, policy=email.policy.SMTP)
   >>> g.flatten(msg)
   >>> p.stdin.close()
   >>> rc = p.wait()

.. XXX email.policy.mbox/MBOX does not exist yet

Some email package methods accept a *policy* keyword argument, allowing the
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
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
      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
      Instances`_ for policies that use an RFC conformant linesep.  Setting it
      to :attr:`os.linesep` may also be useful.

   .. attribute:: must_be_7bit

      If ``True``, data output by a bytes generator is limited to ASCII
      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).
      String generators act as if ``must_be_7bit`` is ``True`` regardless of
      the policy in effect, since a string cannot represent non-ASCII bytes.

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

   :mod:`Policy` object also have the following methods:

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

   .. method:: clone(obj, *kw)

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

The following instances of :class:`Policy` provide defaults suitable for
specific common application domains.

.. data:: default

   An instance of :class:`Policy` with all defaults unchanged.

.. data:: SMTP

   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``.

.. data:: HTTP

   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).

.. data:: strict

   :attr:`raise_on_defect` is set to :const:`True`.