1.. _compat32_message: 2 3:mod:`email.message.Message`: Representing an email message using the :data:`~email.policy.compat32` API 4-------------------------------------------------------------------------------------------------------- 5 6.. module:: email.message 7 :synopsis: The base class representing email messages in a fashion 8 backward compatible with python3.2 9 10 11The :class:`Message` class is very similar to the 12:class:`~email.message.EmailMessage` class, without the methods added by that 13class, and with the default behavior of certain other methods being slightly 14different. We also document here some methods that, while supported by the 15:class:`~email.message.EmailMessage` class, are not recommended unless you are 16dealing with legacy code. 17 18The philosophy and structure of the two classes is otherwise the same. 19 20This document describes the behavior under the default (for :class:`Message`) 21policy :attr:`~email.policy.Compat32`. If you are going to use another policy, 22you should be using the :class:`~email.message.EmailMessage` class instead. 23 24An email message consists of *headers* and a *payload*. Headers must be 25:rfc:`5233` style names and values, where the field name and value are 26separated by a colon. The colon is not part of either the field name or the 27field value. The payload may be a simple text message, or a binary object, or 28a structured sequence of sub-messages each with their own set of headers and 29their own payload. The latter type of payload is indicated by the message 30having a MIME type such as :mimetype:`multipart/\*` or 31:mimetype:`message/rfc822`. 32 33The conceptual model provided by a :class:`Message` object is that of an 34ordered dictionary of headers with additional methods for accessing both 35specialized information from the headers, for accessing the payload, for 36generating a serialized version of the message, and for recursively walking 37over the object tree. Note that duplicate headers are supported but special 38methods must be used to access them. 39 40The :class:`Message` pseudo-dictionary is indexed by the header names, which 41must be ASCII values. The values of the dictionary are strings that are 42supposed to contain only ASCII characters; there is some special handling for 43non-ASCII input, but it doesn't always produce the correct results. Headers 44are stored and returned in case-preserving form, but field names are matched 45case-insensitively. There may also be a single envelope header, also known as 46the *Unix-From* header or the ``From_`` header. The *payload* is either a 47string or bytes, in the case of simple message objects, or a list of 48:class:`Message` objects, for MIME container documents (e.g. 49:mimetype:`multipart/\*` and :mimetype:`message/rfc822`). 50 51Here are the methods of the :class:`Message` class: 52 53 54.. class:: Message(policy=compat32) 55 56 If *policy* is specified (it must be an instance of a :mod:`~email.policy` 57 class) use the rules it specifies to update and serialize the representation 58 of the message. If *policy* is not set, use the :class:`compat32 59 <email.policy.Compat32>` policy, which maintains backward compatibility with 60 the Python 3.2 version of the email package. For more information see the 61 :mod:`~email.policy` documentation. 62 63 .. versionchanged:: 3.3 The *policy* keyword argument was added. 64 65 66 .. method:: as_string(unixfrom=False, maxheaderlen=0, policy=None) 67 68 Return the entire message flattened as a string. When optional *unixfrom* 69 is true, the envelope header is included in the returned string. 70 *unixfrom* defaults to ``False``. For backward compabitility reasons, 71 *maxheaderlen* defaults to ``0``, so if you want a different value you 72 must override it explicitly (the value specified for *max_line_length* in 73 the policy will be ignored by this method). The *policy* argument may be 74 used to override the default policy obtained from the message instance. 75 This can be used to control some of the formatting produced by the 76 method, since the specified *policy* will be passed to the ``Generator``. 77 78 Flattening the message may trigger changes to the :class:`Message` if 79 defaults need to be filled in to complete the transformation to a string 80 (for example, MIME boundaries may be generated or modified). 81 82 Note that this method is provided as a convenience and may not always 83 format the message the way you want. For example, by default it does 84 not do the mangling of lines that begin with ``From`` that is 85 required by the unix mbox format. For more flexibility, instantiate a 86 :class:`~email.generator.Generator` instance and use its 87 :meth:`~email.generator.Generator.flatten` method directly. For example:: 88 89 from io import StringIO 90 from email.generator import Generator 91 fp = StringIO() 92 g = Generator(fp, mangle_from_=True, maxheaderlen=60) 93 g.flatten(msg) 94 text = fp.getvalue() 95 96 If the message object contains binary data that is not encoded according 97 to RFC standards, the non-compliant data will be replaced by unicode 98 "unknown character" code points. (See also :meth:`.as_bytes` and 99 :class:`~email.generator.BytesGenerator`.) 100 101 .. versionchanged:: 3.4 the *policy* keyword argument was added. 102 103 104 .. method:: __str__() 105 106 Equivalent to :meth:`.as_string()`. Allows ``str(msg)`` to produce a 107 string containing the formatted message. 108 109 110 .. method:: as_bytes(unixfrom=False, policy=None) 111 112 Return the entire message flattened as a bytes object. When optional 113 *unixfrom* is true, the envelope header is included in the returned 114 string. *unixfrom* defaults to ``False``. The *policy* argument may be 115 used to override the default policy obtained from the message instance. 116 This can be used to control some of the formatting produced by the 117 method, since the specified *policy* will be passed to the 118 ``BytesGenerator``. 119 120 Flattening the message may trigger changes to the :class:`Message` if 121 defaults need to be filled in to complete the transformation to a string 122 (for example, MIME boundaries may be generated or modified). 123 124 Note that this method is provided as a convenience and may not always 125 format the message the way you want. For example, by default it does 126 not do the mangling of lines that begin with ``From`` that is 127 required by the unix mbox format. For more flexibility, instantiate a 128 :class:`~email.generator.BytesGenerator` instance and use its 129 :meth:`~email.generator.BytesGenerator.flatten` method directly. 130 For example:: 131 132 from io import BytesIO 133 from email.generator import BytesGenerator 134 fp = BytesIO() 135 g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60) 136 g.flatten(msg) 137 text = fp.getvalue() 138 139 .. versionadded:: 3.4 140 141 142 .. method:: __bytes__() 143 144 Equivalent to :meth:`.as_bytes()`. Allows ``bytes(msg)`` to produce a 145 bytes object containing the formatted message. 146 147 .. versionadded:: 3.4 148 149 150 .. method:: is_multipart() 151 152 Return ``True`` if the message's payload is a list of sub-\ 153 :class:`Message` objects, otherwise return ``False``. When 154 :meth:`is_multipart` returns ``False``, the payload should be a string 155 object (which might be a CTE encoded binary payload. (Note that 156 :meth:`is_multipart` returning ``True`` does not necessarily mean that 157 "msg.get_content_maintype() == 'multipart'" will return the ``True``. 158 For example, ``is_multipart`` will return ``True`` when the 159 :class:`Message` is of type ``message/rfc822``.) 160 161 162 .. method:: set_unixfrom(unixfrom) 163 164 Set the message's envelope header to *unixfrom*, which should be a string. 165 166 167 .. method:: get_unixfrom() 168 169 Return the message's envelope header. Defaults to ``None`` if the 170 envelope header was never set. 171 172 173 .. method:: attach(payload) 174 175 Add the given *payload* to the current payload, which must be ``None`` or 176 a list of :class:`Message` objects before the call. After the call, the 177 payload will always be a list of :class:`Message` objects. If you want to 178 set the payload to a scalar object (e.g. a string), use 179 :meth:`set_payload` instead. 180 181 This is a legacy method. On the 182 :class:`~email.emailmessage.EmailMessage` class its functionality is 183 replaced by :meth:`~email.message.EmailMessage.set_content` and the 184 related ``make`` and ``add`` methods. 185 186 187 .. method:: get_payload(i=None, decode=False) 188 189 Return the current payload, which will be a list of 190 :class:`Message` objects when :meth:`is_multipart` is ``True``, or a 191 string when :meth:`is_multipart` is ``False``. If the payload is a list 192 and you mutate the list object, you modify the message's payload in place. 193 194 With optional argument *i*, :meth:`get_payload` will return the *i*-th 195 element of the payload, counting from zero, if :meth:`is_multipart` is 196 ``True``. An :exc:`IndexError` will be raised if *i* is less than 0 or 197 greater than or equal to the number of items in the payload. If the 198 payload is a string (i.e. :meth:`is_multipart` is ``False``) and *i* is 199 given, a :exc:`TypeError` is raised. 200 201 Optional *decode* is a flag indicating whether the payload should be 202 decoded or not, according to the :mailheader:`Content-Transfer-Encoding` 203 header. When ``True`` and the message is not a multipart, the payload will 204 be decoded if this header's value is ``quoted-printable`` or ``base64``. 205 If some other encoding is used, or :mailheader:`Content-Transfer-Encoding` 206 header is missing, the payload is 207 returned as-is (undecoded). In all cases the returned value is binary 208 data. If the message is a multipart and the *decode* flag is ``True``, 209 then ``None`` is returned. If the payload is base64 and it was not 210 perfectly formed (missing padding, characters outside the base64 211 alphabet), then an appropriate defect will be added to the message's 212 defect property (:class:`~email.errors.InvalidBase64PaddingDefect` or 213 :class:`~email.errors.InvalidBase64CharactersDefect`, respectively). 214 215 When *decode* is ``False`` (the default) the body is returned as a string 216 without decoding the :mailheader:`Content-Transfer-Encoding`. However, 217 for a :mailheader:`Content-Transfer-Encoding` of 8bit, an attempt is made 218 to decode the original bytes using the ``charset`` specified by the 219 :mailheader:`Content-Type` header, using the ``replace`` error handler. 220 If no ``charset`` is specified, or if the ``charset`` given is not 221 recognized by the email package, the body is decoded using the default 222 ASCII charset. 223 224 This is a legacy method. On the 225 :class:`~email.emailmessage.EmailMessage` class its functionality is 226 replaced by :meth:`~email.message.EmailMessage.get_content` and 227 :meth:`~email.message.EmailMessage.iter_parts`. 228 229 230 .. method:: set_payload(payload, charset=None) 231 232 Set the entire message object's payload to *payload*. It is the client's 233 responsibility to ensure the payload invariants. Optional *charset* sets 234 the message's default character set; see :meth:`set_charset` for details. 235 236 This is a legacy method. On the 237 :class:`~email.emailmessage.EmailMessage` class its functionality is 238 replaced by :meth:`~email.message.EmailMessage.set_content`. 239 240 241 .. method:: set_charset(charset) 242 243 Set the character set of the payload to *charset*, which can either be a 244 :class:`~email.charset.Charset` instance (see :mod:`email.charset`), a 245 string naming a character set, or ``None``. If it is a string, it will 246 be converted to a :class:`~email.charset.Charset` instance. If *charset* 247 is ``None``, the ``charset`` parameter will be removed from the 248 :mailheader:`Content-Type` header (the message will not be otherwise 249 modified). Anything else will generate a :exc:`TypeError`. 250 251 If there is no existing :mailheader:`MIME-Version` header one will be 252 added. If there is no existing :mailheader:`Content-Type` header, one 253 will be added with a value of :mimetype:`text/plain`. Whether the 254 :mailheader:`Content-Type` header already exists or not, its ``charset`` 255 parameter will be set to *charset.output_charset*. If 256 *charset.input_charset* and *charset.output_charset* differ, the payload 257 will be re-encoded to the *output_charset*. If there is no existing 258 :mailheader:`Content-Transfer-Encoding` header, then the payload will be 259 transfer-encoded, if needed, using the specified 260 :class:`~email.charset.Charset`, and a header with the appropriate value 261 will be added. If a :mailheader:`Content-Transfer-Encoding` header 262 already exists, the payload is assumed to already be correctly encoded 263 using that :mailheader:`Content-Transfer-Encoding` and is not modified. 264 265 This is a legacy method. On the 266 :class:`~email.emailmessage.EmailMessage` class its functionality is 267 replaced by the *charset* parameter of the 268 :meth:`email.emailmessage.EmailMessage.set_content` method. 269 270 271 .. method:: get_charset() 272 273 Return the :class:`~email.charset.Charset` instance associated with the 274 message's payload. 275 276 This is a legacy method. On the 277 :class:`~email.emailmessage.EmailMessage` class it always returns 278 ``None``. 279 280 281 The following methods implement a mapping-like interface for accessing the 282 message's :rfc:`2822` headers. Note that there are some semantic differences 283 between these methods and a normal mapping (i.e. dictionary) interface. For 284 example, in a dictionary there are no duplicate keys, but here there may be 285 duplicate message headers. Also, in dictionaries there is no guaranteed 286 order to the keys returned by :meth:`keys`, but in a :class:`Message` object, 287 headers are always returned in the order they appeared in the original 288 message, or were added to the message later. Any header deleted and then 289 re-added are always appended to the end of the header list. 290 291 These semantic differences are intentional and are biased toward maximal 292 convenience. 293 294 Note that in all cases, any envelope header present in the message is not 295 included in the mapping interface. 296 297 In a model generated from bytes, any header values that (in contravention of 298 the RFCs) contain non-ASCII bytes will, when retrieved through this 299 interface, be represented as :class:`~email.header.Header` objects with 300 a charset of `unknown-8bit`. 301 302 303 .. method:: __len__() 304 305 Return the total number of headers, including duplicates. 306 307 308 .. method:: __contains__(name) 309 310 Return true if the message object has a field named *name*. Matching is 311 done case-insensitively and *name* should not include the trailing colon. 312 Used for the ``in`` operator, e.g.:: 313 314 if 'message-id' in myMessage: 315 print('Message-ID:', myMessage['message-id']) 316 317 318 .. method:: __getitem__(name) 319 320 Return the value of the named header field. *name* should not include the 321 colon field separator. If the header is missing, ``None`` is returned; a 322 :exc:`KeyError` is never raised. 323 324 Note that if the named field appears more than once in the message's 325 headers, exactly which of those field values will be returned is 326 undefined. Use the :meth:`get_all` method to get the values of all the 327 extant named headers. 328 329 330 .. method:: __setitem__(name, val) 331 332 Add a header to the message with field name *name* and value *val*. The 333 field is appended to the end of the message's existing fields. 334 335 Note that this does *not* overwrite or delete any existing header with the same 336 name. If you want to ensure that the new header is the only one present in the 337 message with field name *name*, delete the field first, e.g.:: 338 339 del msg['subject'] 340 msg['subject'] = 'Python roolz!' 341 342 343 .. method:: __delitem__(name) 344 345 Delete all occurrences of the field with name *name* from the message's 346 headers. No exception is raised if the named field isn't present in the 347 headers. 348 349 350 .. method:: keys() 351 352 Return a list of all the message's header field names. 353 354 355 .. method:: values() 356 357 Return a list of all the message's field values. 358 359 360 .. method:: items() 361 362 Return a list of 2-tuples containing all the message's field headers and 363 values. 364 365 366 .. method:: get(name, failobj=None) 367 368 Return the value of the named header field. This is identical to 369 :meth:`__getitem__` except that optional *failobj* is returned if the 370 named header is missing (defaults to ``None``). 371 372 Here are some additional useful methods: 373 374 375 .. method:: get_all(name, failobj=None) 376 377 Return a list of all the values for the field named *name*. If there are 378 no such named headers in the message, *failobj* is returned (defaults to 379 ``None``). 380 381 382 .. method:: add_header(_name, _value, **_params) 383 384 Extended header setting. This method is similar to :meth:`__setitem__` 385 except that additional header parameters can be provided as keyword 386 arguments. *_name* is the header field to add and *_value* is the 387 *primary* value for the header. 388 389 For each item in the keyword argument dictionary *_params*, the key is 390 taken as the parameter name, with underscores converted to dashes (since 391 dashes are illegal in Python identifiers). Normally, the parameter will 392 be added as ``key="value"`` unless the value is ``None``, in which case 393 only the key will be added. If the value contains non-ASCII characters, 394 it can be specified as a three tuple in the format 395 ``(CHARSET, LANGUAGE, VALUE)``, where ``CHARSET`` is a string naming the 396 charset to be used to encode the value, ``LANGUAGE`` can usually be set 397 to ``None`` or the empty string (see :rfc:`2231` for other possibilities), 398 and ``VALUE`` is the string value containing non-ASCII code points. If 399 a three tuple is not passed and the value contains non-ASCII characters, 400 it is automatically encoded in :rfc:`2231` format using a ``CHARSET`` 401 of ``utf-8`` and a ``LANGUAGE`` of ``None``. 402 403 Here's an example:: 404 405 msg.add_header('Content-Disposition', 'attachment', filename='bud.gif') 406 407 This will add a header that looks like :: 408 409 Content-Disposition: attachment; filename="bud.gif" 410 411 An example with non-ASCII characters:: 412 413 msg.add_header('Content-Disposition', 'attachment', 414 filename=('iso-8859-1', '', 'Fußballer.ppt')) 415 416 Which produces :: 417 418 Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt" 419 420 421 .. method:: replace_header(_name, _value) 422 423 Replace a header. Replace the first header found in the message that 424 matches *_name*, retaining header order and field name case. If no 425 matching header was found, a :exc:`KeyError` is raised. 426 427 428 .. method:: get_content_type() 429 430 Return the message's content type. The returned string is coerced to 431 lower case of the form :mimetype:`maintype/subtype`. If there was no 432 :mailheader:`Content-Type` header in the message the default type as given 433 by :meth:`get_default_type` will be returned. Since according to 434 :rfc:`2045`, messages always have a default type, :meth:`get_content_type` 435 will always return a value. 436 437 :rfc:`2045` defines a message's default type to be :mimetype:`text/plain` 438 unless it appears inside a :mimetype:`multipart/digest` container, in 439 which case it would be :mimetype:`message/rfc822`. If the 440 :mailheader:`Content-Type` header has an invalid type specification, 441 :rfc:`2045` mandates that the default type be :mimetype:`text/plain`. 442 443 444 .. method:: get_content_maintype() 445 446 Return the message's main content type. This is the :mimetype:`maintype` 447 part of the string returned by :meth:`get_content_type`. 448 449 450 .. method:: get_content_subtype() 451 452 Return the message's sub-content type. This is the :mimetype:`subtype` 453 part of the string returned by :meth:`get_content_type`. 454 455 456 .. method:: get_default_type() 457 458 Return the default content type. Most messages have a default content 459 type of :mimetype:`text/plain`, except for messages that are subparts of 460 :mimetype:`multipart/digest` containers. Such subparts have a default 461 content type of :mimetype:`message/rfc822`. 462 463 464 .. method:: set_default_type(ctype) 465 466 Set the default content type. *ctype* should either be 467 :mimetype:`text/plain` or :mimetype:`message/rfc822`, although this is not 468 enforced. The default content type is not stored in the 469 :mailheader:`Content-Type` header. 470 471 472 .. method:: get_params(failobj=None, header='content-type', unquote=True) 473 474 Return the message's :mailheader:`Content-Type` parameters, as a list. 475 The elements of the returned list are 2-tuples of key/value pairs, as 476 split on the ``'='`` sign. The left hand side of the ``'='`` is the key, 477 while the right hand side is the value. If there is no ``'='`` sign in 478 the parameter the value is the empty string, otherwise the value is as 479 described in :meth:`get_param` and is unquoted if optional *unquote* is 480 ``True`` (the default). 481 482 Optional *failobj* is the object to return if there is no 483 :mailheader:`Content-Type` header. Optional *header* is the header to 484 search instead of :mailheader:`Content-Type`. 485 486 This is a legacy method. On the 487 :class:`~email.emailmessage.EmailMessage` class its functionality is 488 replaced by the *params* property of the individual header objects 489 returned by the header access methods. 490 491 492 .. method:: get_param(param, failobj=None, header='content-type', unquote=True) 493 494 Return the value of the :mailheader:`Content-Type` header's parameter 495 *param* as a string. If the message has no :mailheader:`Content-Type` 496 header or if there is no such parameter, then *failobj* is returned 497 (defaults to ``None``). 498 499 Optional *header* if given, specifies the message header to use instead of 500 :mailheader:`Content-Type`. 501 502 Parameter keys are always compared case insensitively. The return value 503 can either be a string, or a 3-tuple if the parameter was :rfc:`2231` 504 encoded. When it's a 3-tuple, the elements of the value are of the form 505 ``(CHARSET, LANGUAGE, VALUE)``. Note that both ``CHARSET`` and 506 ``LANGUAGE`` can be ``None``, in which case you should consider ``VALUE`` 507 to be encoded in the ``us-ascii`` charset. You can usually ignore 508 ``LANGUAGE``. 509 510 If your application doesn't care whether the parameter was encoded as in 511 :rfc:`2231`, you can collapse the parameter value by calling 512 :func:`email.utils.collapse_rfc2231_value`, passing in the return value 513 from :meth:`get_param`. This will return a suitably decoded Unicode 514 string when the value is a tuple, or the original string unquoted if it 515 isn't. For example:: 516 517 rawparam = msg.get_param('foo') 518 param = email.utils.collapse_rfc2231_value(rawparam) 519 520 In any case, the parameter value (either the returned string, or the 521 ``VALUE`` item in the 3-tuple) is always unquoted, unless *unquote* is set 522 to ``False``. 523 524 This is a legacy method. On the 525 :class:`~email.emailmessage.EmailMessage` class its functionality is 526 replaced by the *params* property of the individual header objects 527 returned by the header access methods. 528 529 530 .. method:: set_param(param, value, header='Content-Type', requote=True, \ 531 charset=None, language='', replace=False) 532 533 Set a parameter in the :mailheader:`Content-Type` header. If the 534 parameter already exists in the header, its value will be replaced with 535 *value*. If the :mailheader:`Content-Type` header as not yet been defined 536 for this message, it will be set to :mimetype:`text/plain` and the new 537 parameter value will be appended as per :rfc:`2045`. 538 539 Optional *header* specifies an alternative header to 540 :mailheader:`Content-Type`, and all parameters will be quoted as necessary 541 unless optional *requote* is ``False`` (the default is ``True``). 542 543 If optional *charset* is specified, the parameter will be encoded 544 according to :rfc:`2231`. Optional *language* specifies the RFC 2231 545 language, defaulting to the empty string. Both *charset* and *language* 546 should be strings. 547 548 If *replace* is ``False`` (the default) the header is moved to the 549 end of the list of headers. If *replace* is ``True``, the header 550 will be updated in place. 551 552 .. versionchanged:: 3.4 ``replace`` keyword was added. 553 554 555 .. method:: del_param(param, header='content-type', requote=True) 556 557 Remove the given parameter completely from the :mailheader:`Content-Type` 558 header. The header will be re-written in place without the parameter or 559 its value. All values will be quoted as necessary unless *requote* is 560 ``False`` (the default is ``True``). Optional *header* specifies an 561 alternative to :mailheader:`Content-Type`. 562 563 564 .. method:: set_type(type, header='Content-Type', requote=True) 565 566 Set the main type and subtype for the :mailheader:`Content-Type` 567 header. *type* must be a string in the form :mimetype:`maintype/subtype`, 568 otherwise a :exc:`ValueError` is raised. 569 570 This method replaces the :mailheader:`Content-Type` header, keeping all 571 the parameters in place. If *requote* is ``False``, this leaves the 572 existing header's quoting as is, otherwise the parameters will be quoted 573 (the default). 574 575 An alternative header can be specified in the *header* argument. When the 576 :mailheader:`Content-Type` header is set a :mailheader:`MIME-Version` 577 header is also added. 578 579 This is a legacy method. On the 580 :class:`~email.emailmessage.EmailMessage` class its functionality is 581 replaced by the ``make_`` and ``add_`` methods. 582 583 584 .. method:: get_filename(failobj=None) 585 586 Return the value of the ``filename`` parameter of the 587 :mailheader:`Content-Disposition` header of the message. If the header 588 does not have a ``filename`` parameter, this method falls back to looking 589 for the ``name`` parameter on the :mailheader:`Content-Type` header. If 590 neither is found, or the header is missing, then *failobj* is returned. 591 The returned string will always be unquoted as per 592 :func:`email.utils.unquote`. 593 594 595 .. method:: get_boundary(failobj=None) 596 597 Return the value of the ``boundary`` parameter of the 598 :mailheader:`Content-Type` header of the message, or *failobj* if either 599 the header is missing, or has no ``boundary`` parameter. The returned 600 string will always be unquoted as per :func:`email.utils.unquote`. 601 602 603 .. method:: set_boundary(boundary) 604 605 Set the ``boundary`` parameter of the :mailheader:`Content-Type` header to 606 *boundary*. :meth:`set_boundary` will always quote *boundary* if 607 necessary. A :exc:`~email.errors.HeaderParseError` is raised if the 608 message object has no :mailheader:`Content-Type` header. 609 610 Note that using this method is subtly different than deleting the old 611 :mailheader:`Content-Type` header and adding a new one with the new 612 boundary via :meth:`add_header`, because :meth:`set_boundary` preserves 613 the order of the :mailheader:`Content-Type` header in the list of 614 headers. However, it does *not* preserve any continuation lines which may 615 have been present in the original :mailheader:`Content-Type` header. 616 617 618 .. method:: get_content_charset(failobj=None) 619 620 Return the ``charset`` parameter of the :mailheader:`Content-Type` header, 621 coerced to lower case. If there is no :mailheader:`Content-Type` header, or if 622 that header has no ``charset`` parameter, *failobj* is returned. 623 624 Note that this method differs from :meth:`get_charset` which returns the 625 :class:`~email.charset.Charset` instance for the default encoding of the message body. 626 627 628 .. method:: get_charsets(failobj=None) 629 630 Return a list containing the character set names in the message. If the 631 message is a :mimetype:`multipart`, then the list will contain one element 632 for each subpart in the payload, otherwise, it will be a list of length 1. 633 634 Each item in the list will be a string which is the value of the 635 ``charset`` parameter in the :mailheader:`Content-Type` header for the 636 represented subpart. However, if the subpart has no 637 :mailheader:`Content-Type` header, no ``charset`` parameter, or is not of 638 the :mimetype:`text` main MIME type, then that item in the returned list 639 will be *failobj*. 640 641 642 .. method:: get_content_disposition() 643 644 Return the lowercased value (without parameters) of the message's 645 :mailheader:`Content-Disposition` header if it has one, or ``None``. The 646 possible values for this method are *inline*, *attachment* or ``None`` 647 if the message follows :rfc:`2183`. 648 649 .. versionadded:: 3.5 650 651 .. method:: walk() 652 653 The :meth:`walk` method is an all-purpose generator which can be used to 654 iterate over all the parts and subparts of a message object tree, in 655 depth-first traversal order. You will typically use :meth:`walk` as the 656 iterator in a ``for`` loop; each iteration returns the next subpart. 657 658 Here's an example that prints the MIME type of every part of a multipart 659 message structure: 660 661 .. testsetup:: 662 663 >>> from email import message_from_binary_file 664 >>> with open('Lib/test/test_email/data/msg_16.txt', 'rb') as f: 665 ... msg = message_from_binary_file(f) 666 >>> from email.iterators import _structure 667 668 .. doctest:: 669 670 >>> for part in msg.walk(): 671 ... print(part.get_content_type()) 672 multipart/report 673 text/plain 674 message/delivery-status 675 text/plain 676 text/plain 677 message/rfc822 678 text/plain 679 680 ``walk`` iterates over the subparts of any part where 681 :meth:`is_multipart` returns ``True``, even though 682 ``msg.get_content_maintype() == 'multipart'`` may return ``False``. We 683 can see this in our example by making use of the ``_structure`` debug 684 helper function: 685 686 .. doctest:: 687 688 >>> for part in msg.walk(): 689 ... print(part.get_content_maintype() == 'multipart'), 690 ... part.is_multipart()) 691 True True 692 False False 693 False True 694 False False 695 False False 696 False True 697 False False 698 >>> _structure(msg) 699 multipart/report 700 text/plain 701 message/delivery-status 702 text/plain 703 text/plain 704 message/rfc822 705 text/plain 706 707 Here the ``message`` parts are not ``multiparts``, but they do contain 708 subparts. ``is_multipart()`` returns ``True`` and ``walk`` descends 709 into the subparts. 710 711 712 :class:`Message` objects can also optionally contain two instance attributes, 713 which can be used when generating the plain text of a MIME message. 714 715 716 .. attribute:: preamble 717 718 The format of a MIME document allows for some text between the blank line 719 following the headers, and the first multipart boundary string. Normally, 720 this text is never visible in a MIME-aware mail reader because it falls 721 outside the standard MIME armor. However, when viewing the raw text of 722 the message, or when viewing the message in a non-MIME aware reader, this 723 text can become visible. 724 725 The *preamble* attribute contains this leading extra-armor text for MIME 726 documents. When the :class:`~email.parser.Parser` discovers some text 727 after the headers but before the first boundary string, it assigns this 728 text to the message's *preamble* attribute. When the 729 :class:`~email.generator.Generator` is writing out the plain text 730 representation of a MIME message, and it finds the 731 message has a *preamble* attribute, it will write this text in the area 732 between the headers and the first boundary. See :mod:`email.parser` and 733 :mod:`email.generator` for details. 734 735 Note that if the message object has no preamble, the *preamble* attribute 736 will be ``None``. 737 738 739 .. attribute:: epilogue 740 741 The *epilogue* attribute acts the same way as the *preamble* attribute, 742 except that it contains text that appears between the last boundary and 743 the end of the message. 744 745 You do not need to set the epilogue to the empty string in order for the 746 :class:`~email.generator.Generator` to print a newline at the end of the 747 file. 748 749 750 .. attribute:: defects 751 752 The *defects* attribute contains a list of all the problems found when 753 parsing this message. See :mod:`email.errors` for a detailed description 754 of the possible parsing defects. 755