1:mod:`mailbox` --- Manipulate mailboxes in various formats 2========================================================== 3 4.. module:: mailbox 5 :synopsis: Manipulate mailboxes in various formats 6 7.. moduleauthor:: Gregory K. Johnson <gkj@gregorykjohnson.com> 8.. sectionauthor:: Gregory K. Johnson <gkj@gregorykjohnson.com> 9 10**Source code:** :source:`Lib/mailbox.py` 11 12-------------- 13 14This module defines two classes, :class:`Mailbox` and :class:`Message`, for 15accessing and manipulating on-disk mailboxes and the messages they contain. 16:class:`Mailbox` offers a dictionary-like mapping from keys to messages. 17:class:`Message` extends the :mod:`email.message` module's 18:class:`~email.message.Message` class with format-specific state and behavior. 19Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. 20 21 22.. seealso:: 23 24 Module :mod:`email` 25 Represent and manipulate messages. 26 27 28.. _mailbox-objects: 29 30:class:`Mailbox` objects 31------------------------ 32 33.. class:: Mailbox 34 35 A mailbox, which may be inspected and modified. 36 37 The :class:`Mailbox` class defines an interface and is not intended to be 38 instantiated. Instead, format-specific subclasses should inherit from 39 :class:`Mailbox` and your code should instantiate a particular subclass. 40 41 The :class:`Mailbox` interface is dictionary-like, with small keys 42 corresponding to messages. Keys are issued by the :class:`Mailbox` instance 43 with which they will be used and are only meaningful to that :class:`Mailbox` 44 instance. A key continues to identify a message even if the corresponding 45 message is modified, such as by replacing it with another message. 46 47 Messages may be added to a :class:`Mailbox` instance using the set-like 48 method :meth:`add` and removed using a ``del`` statement or the set-like 49 methods :meth:`remove` and :meth:`discard`. 50 51 :class:`Mailbox` interface semantics differ from dictionary semantics in some 52 noteworthy ways. Each time a message is requested, a new representation 53 (typically a :class:`Message` instance) is generated based upon the current 54 state of the mailbox. Similarly, when a message is added to a 55 :class:`Mailbox` instance, the provided message representation's contents are 56 copied. In neither case is a reference to the message representation kept by 57 the :class:`Mailbox` instance. 58 59 The default :class:`Mailbox` iterator iterates over message representations, 60 not keys as the default dictionary iterator does. Moreover, modification of a 61 mailbox during iteration is safe and well-defined. Messages added to the 62 mailbox after an iterator is created will not be seen by the 63 iterator. Messages removed from the mailbox before the iterator yields them 64 will be silently skipped, though using a key from an iterator may result in a 65 :exc:`KeyError` exception if the corresponding message is subsequently 66 removed. 67 68 .. warning:: 69 70 Be very cautious when modifying mailboxes that might be simultaneously 71 changed by some other process. The safest mailbox format to use for such 72 tasks is Maildir; try to avoid using single-file formats such as mbox for 73 concurrent writing. If you're modifying a mailbox, you *must* lock it by 74 calling the :meth:`lock` and :meth:`unlock` methods *before* reading any 75 messages in the file or making any changes by adding or deleting a 76 message. Failing to lock the mailbox runs the risk of losing messages or 77 corrupting the entire mailbox. 78 79 :class:`Mailbox` instances have the following methods: 80 81 82 .. method:: add(message) 83 84 Add *message* to the mailbox and return the key that has been assigned to 85 it. 86 87 Parameter *message* may be a :class:`Message` instance, an 88 :class:`email.message.Message` instance, a string, a byte string, or a 89 file-like object (which should be open in binary mode). If *message* is 90 an instance of the 91 appropriate format-specific :class:`Message` subclass (e.g., if it's an 92 :class:`mboxMessage` instance and this is an :class:`mbox` instance), its 93 format-specific information is used. Otherwise, reasonable defaults for 94 format-specific information are used. 95 96 .. versionchanged:: 3.2 97 Support for binary input was added. 98 99 100 .. method:: remove(key) 101 __delitem__(key) 102 discard(key) 103 104 Delete the message corresponding to *key* from the mailbox. 105 106 If no such message exists, a :exc:`KeyError` exception is raised if the 107 method was called as :meth:`remove` or :meth:`__delitem__` but no 108 exception is raised if the method was called as :meth:`discard`. The 109 behavior of :meth:`discard` may be preferred if the underlying mailbox 110 format supports concurrent modification by other processes. 111 112 113 .. method:: __setitem__(key, message) 114 115 Replace the message corresponding to *key* with *message*. Raise a 116 :exc:`KeyError` exception if no message already corresponds to *key*. 117 118 As with :meth:`add`, parameter *message* may be a :class:`Message` 119 instance, an :class:`email.message.Message` instance, a string, a byte 120 string, or a file-like object (which should be open in binary mode). If 121 *message* is an 122 instance of the appropriate format-specific :class:`Message` subclass 123 (e.g., if it's an :class:`mboxMessage` instance and this is an 124 :class:`mbox` instance), its format-specific information is 125 used. Otherwise, the format-specific information of the message that 126 currently corresponds to *key* is left unchanged. 127 128 129 .. method:: iterkeys() 130 keys() 131 132 Return an iterator over all keys if called as :meth:`iterkeys` or return a 133 list of keys if called as :meth:`keys`. 134 135 136 .. method:: itervalues() 137 __iter__() 138 values() 139 140 Return an iterator over representations of all messages if called as 141 :meth:`itervalues` or :meth:`__iter__` or return a list of such 142 representations if called as :meth:`values`. The messages are represented 143 as instances of the appropriate format-specific :class:`Message` subclass 144 unless a custom message factory was specified when the :class:`Mailbox` 145 instance was initialized. 146 147 .. note:: 148 149 The behavior of :meth:`__iter__` is unlike that of dictionaries, which 150 iterate over keys. 151 152 153 .. method:: iteritems() 154 items() 155 156 Return an iterator over (*key*, *message*) pairs, where *key* is a key and 157 *message* is a message representation, if called as :meth:`iteritems` or 158 return a list of such pairs if called as :meth:`items`. The messages are 159 represented as instances of the appropriate format-specific 160 :class:`Message` subclass unless a custom message factory was specified 161 when the :class:`Mailbox` instance was initialized. 162 163 164 .. method:: get(key, default=None) 165 __getitem__(key) 166 167 Return a representation of the message corresponding to *key*. If no such 168 message exists, *default* is returned if the method was called as 169 :meth:`get` and a :exc:`KeyError` exception is raised if the method was 170 called as :meth:`__getitem__`. The message is represented as an instance 171 of the appropriate format-specific :class:`Message` subclass unless a 172 custom message factory was specified when the :class:`Mailbox` instance 173 was initialized. 174 175 176 .. method:: get_message(key) 177 178 Return a representation of the message corresponding to *key* as an 179 instance of the appropriate format-specific :class:`Message` subclass, or 180 raise a :exc:`KeyError` exception if no such message exists. 181 182 183 .. method:: get_bytes(key) 184 185 Return a byte representation of the message corresponding to *key*, or 186 raise a :exc:`KeyError` exception if no such message exists. 187 188 .. versionadded:: 3.2 189 190 191 .. method:: get_string(key) 192 193 Return a string representation of the message corresponding to *key*, or 194 raise a :exc:`KeyError` exception if no such message exists. The 195 message is processed through :class:`email.message.Message` to 196 convert it to a 7bit clean representation. 197 198 199 .. method:: get_file(key) 200 201 Return a file-like representation of the message corresponding to *key*, 202 or raise a :exc:`KeyError` exception if no such message exists. The 203 file-like object behaves as if open in binary mode. This file should be 204 closed once it is no longer needed. 205 206 .. versionchanged:: 3.2 207 The file object really is a binary file; previously it was incorrectly 208 returned in text mode. Also, the file-like object now supports the 209 context management protocol: you can use a :keyword:`with` statement to 210 automatically close it. 211 212 .. note:: 213 214 Unlike other representations of messages, file-like representations are 215 not necessarily independent of the :class:`Mailbox` instance that 216 created them or of the underlying mailbox. More specific documentation 217 is provided by each subclass. 218 219 220 .. method:: __contains__(key) 221 222 Return ``True`` if *key* corresponds to a message, ``False`` otherwise. 223 224 225 .. method:: __len__() 226 227 Return a count of messages in the mailbox. 228 229 230 .. method:: clear() 231 232 Delete all messages from the mailbox. 233 234 235 .. method:: pop(key, default=None) 236 237 Return a representation of the message corresponding to *key* and delete 238 the message. If no such message exists, return *default*. The message is 239 represented as an instance of the appropriate format-specific 240 :class:`Message` subclass unless a custom message factory was specified 241 when the :class:`Mailbox` instance was initialized. 242 243 244 .. method:: popitem() 245 246 Return an arbitrary (*key*, *message*) pair, where *key* is a key and 247 *message* is a message representation, and delete the corresponding 248 message. If the mailbox is empty, raise a :exc:`KeyError` exception. The 249 message is represented as an instance of the appropriate format-specific 250 :class:`Message` subclass unless a custom message factory was specified 251 when the :class:`Mailbox` instance was initialized. 252 253 254 .. method:: update(arg) 255 256 Parameter *arg* should be a *key*-to-*message* mapping or an iterable of 257 (*key*, *message*) pairs. Updates the mailbox so that, for each given 258 *key* and *message*, the message corresponding to *key* is set to 259 *message* as if by using :meth:`__setitem__`. As with :meth:`__setitem__`, 260 each *key* must already correspond to a message in the mailbox or else a 261 :exc:`KeyError` exception will be raised, so in general it is incorrect 262 for *arg* to be a :class:`Mailbox` instance. 263 264 .. note:: 265 266 Unlike with dictionaries, keyword arguments are not supported. 267 268 269 .. method:: flush() 270 271 Write any pending changes to the filesystem. For some :class:`Mailbox` 272 subclasses, changes are always written immediately and :meth:`flush` does 273 nothing, but you should still make a habit of calling this method. 274 275 276 .. method:: lock() 277 278 Acquire an exclusive advisory lock on the mailbox so that other processes 279 know not to modify it. An :exc:`ExternalClashError` is raised if the lock 280 is not available. The particular locking mechanisms used depend upon the 281 mailbox format. You should *always* lock the mailbox before making any 282 modifications to its contents. 283 284 285 .. method:: unlock() 286 287 Release the lock on the mailbox, if any. 288 289 290 .. method:: close() 291 292 Flush the mailbox, unlock it if necessary, and close any open files. For 293 some :class:`Mailbox` subclasses, this method does nothing. 294 295 296.. _mailbox-maildir: 297 298:class:`Maildir` 299^^^^^^^^^^^^^^^^ 300 301 302.. class:: Maildir(dirname, factory=None, create=True) 303 304 A subclass of :class:`Mailbox` for mailboxes in Maildir format. Parameter 305 *factory* is a callable object that accepts a file-like message representation 306 (which behaves as if opened in binary mode) and returns a custom representation. 307 If *factory* is ``None``, :class:`MaildirMessage` is used as the default message 308 representation. If *create* is ``True``, the mailbox is created if it does not 309 exist. 310 311 If *create* is ``True`` and the *dirname* path exists, it will be treated as 312 an existing maildir without attempting to verify its directory layout. 313 314 It is for historical reasons that *dirname* is named as such rather than *path*. 315 316 Maildir is a directory-based mailbox format invented for the qmail mail 317 transfer agent and now widely supported by other programs. Messages in a 318 Maildir mailbox are stored in separate files within a common directory 319 structure. This design allows Maildir mailboxes to be accessed and modified 320 by multiple unrelated programs without data corruption, so file locking is 321 unnecessary. 322 323 Maildir mailboxes contain three subdirectories, namely: :file:`tmp`, 324 :file:`new`, and :file:`cur`. Messages are created momentarily in the 325 :file:`tmp` subdirectory and then moved to the :file:`new` subdirectory to 326 finalize delivery. A mail user agent may subsequently move the message to the 327 :file:`cur` subdirectory and store information about the state of the message 328 in a special "info" section appended to its file name. 329 330 Folders of the style introduced by the Courier mail transfer agent are also 331 supported. Any subdirectory of the main mailbox is considered a folder if 332 ``'.'`` is the first character in its name. Folder names are represented by 333 :class:`Maildir` without the leading ``'.'``. Each folder is itself a Maildir 334 mailbox but should not contain other folders. Instead, a logical nesting is 335 indicated using ``'.'`` to delimit levels, e.g., "Archived.2005.07". 336 337 .. note:: 338 339 The Maildir specification requires the use of a colon (``':'``) in certain 340 message file names. However, some operating systems do not permit this 341 character in file names, If you wish to use a Maildir-like format on such 342 an operating system, you should specify another character to use 343 instead. The exclamation point (``'!'``) is a popular choice. For 344 example:: 345 346 import mailbox 347 mailbox.Maildir.colon = '!' 348 349 The :attr:`colon` attribute may also be set on a per-instance basis. 350 351 :class:`Maildir` instances have all of the methods of :class:`Mailbox` in 352 addition to the following: 353 354 355 .. method:: list_folders() 356 357 Return a list of the names of all folders. 358 359 360 .. method:: get_folder(folder) 361 362 Return a :class:`Maildir` instance representing the folder whose name is 363 *folder*. A :exc:`NoSuchMailboxError` exception is raised if the folder 364 does not exist. 365 366 367 .. method:: add_folder(folder) 368 369 Create a folder whose name is *folder* and return a :class:`Maildir` 370 instance representing it. 371 372 373 .. method:: remove_folder(folder) 374 375 Delete the folder whose name is *folder*. If the folder contains any 376 messages, a :exc:`NotEmptyError` exception will be raised and the folder 377 will not be deleted. 378 379 380 .. method:: clean() 381 382 Delete temporary files from the mailbox that have not been accessed in the 383 last 36 hours. The Maildir specification says that mail-reading programs 384 should do this occasionally. 385 386 Some :class:`Mailbox` methods implemented by :class:`Maildir` deserve special 387 remarks: 388 389 390 .. method:: add(message) 391 __setitem__(key, message) 392 update(arg) 393 394 .. warning:: 395 396 These methods generate unique file names based upon the current process 397 ID. When using multiple threads, undetected name clashes may occur and 398 cause corruption of the mailbox unless threads are coordinated to avoid 399 using these methods to manipulate the same mailbox simultaneously. 400 401 402 .. method:: flush() 403 404 All changes to Maildir mailboxes are immediately applied, so this method 405 does nothing. 406 407 408 .. method:: lock() 409 unlock() 410 411 Maildir mailboxes do not support (or require) locking, so these methods do 412 nothing. 413 414 415 .. method:: close() 416 417 :class:`Maildir` instances do not keep any open files and the underlying 418 mailboxes do not support locking, so this method does nothing. 419 420 421 .. method:: get_file(key) 422 423 Depending upon the host platform, it may not be possible to modify or 424 remove the underlying message while the returned file remains open. 425 426 427.. seealso:: 428 429 `maildir man page from Courier <http://www.courier-mta.org/maildir.html>`_ 430 A specification of the format. Describes a common extension for 431 supporting folders. 432 433 `Using maildir format <https://cr.yp.to/proto/maildir.html>`_ 434 Notes on Maildir by its inventor. Includes an updated name-creation scheme and 435 details on "info" semantics. 436 437 438.. _mailbox-mbox: 439 440:class:`mbox` 441^^^^^^^^^^^^^ 442 443 444.. class:: mbox(path, factory=None, create=True) 445 446 A subclass of :class:`Mailbox` for mailboxes in mbox format. Parameter *factory* 447 is a callable object that accepts a file-like message representation (which 448 behaves as if opened in binary mode) and returns a custom representation. If 449 *factory* is ``None``, :class:`mboxMessage` is used as the default message 450 representation. If *create* is ``True``, the mailbox is created if it does not 451 exist. 452 453 The mbox format is the classic format for storing mail on Unix systems. All 454 messages in an mbox mailbox are stored in a single file with the beginning of 455 each message indicated by a line whose first five characters are "From ". 456 457 Several variations of the mbox format exist to address perceived shortcomings in 458 the original. In the interest of compatibility, :class:`mbox` implements the 459 original format, which is sometimes referred to as :dfn:`mboxo`. This means that 460 the :mailheader:`Content-Length` header, if present, is ignored and that any 461 occurrences of "From " at the beginning of a line in a message body are 462 transformed to ">From " when storing the message, although occurrences of ">From 463 " are not transformed to "From " when reading the message. 464 465 Some :class:`Mailbox` methods implemented by :class:`mbox` deserve special 466 remarks: 467 468 469 .. method:: get_file(key) 470 471 Using the file after calling :meth:`flush` or :meth:`close` on the 472 :class:`mbox` instance may yield unpredictable results or raise an 473 exception. 474 475 476 .. method:: lock() 477 unlock() 478 479 Three locking mechanisms are used---dot locking and, if available, the 480 :c:func:`flock` and :c:func:`lockf` system calls. 481 482 483.. seealso:: 484 485 `mbox man page from tin <http://www.tin.org/bin/man.cgi?section=5&topic=mbox>`_ 486 A specification of the format, with details on locking. 487 488 `Configuring Netscape Mail on Unix: Why The Content-Length Format is Bad <https://www.jwz.org/doc/content-length.html>`_ 489 An argument for using the original mbox format rather than a variation. 490 491 `"mbox" is a family of several mutually incompatible mailbox formats <https://www.loc.gov/preservation/digital/formats/fdd/fdd000383.shtml>`_ 492 A history of mbox variations. 493 494 495.. _mailbox-mh: 496 497:class:`MH` 498^^^^^^^^^^^ 499 500 501.. class:: MH(path, factory=None, create=True) 502 503 A subclass of :class:`Mailbox` for mailboxes in MH format. Parameter *factory* 504 is a callable object that accepts a file-like message representation (which 505 behaves as if opened in binary mode) and returns a custom representation. If 506 *factory* is ``None``, :class:`MHMessage` is used as the default message 507 representation. If *create* is ``True``, the mailbox is created if it does not 508 exist. 509 510 MH is a directory-based mailbox format invented for the MH Message Handling 511 System, a mail user agent. Each message in an MH mailbox resides in its own 512 file. An MH mailbox may contain other MH mailboxes (called :dfn:`folders`) in 513 addition to messages. Folders may be nested indefinitely. MH mailboxes also 514 support :dfn:`sequences`, which are named lists used to logically group 515 messages without moving them to sub-folders. Sequences are defined in a file 516 called :file:`.mh_sequences` in each folder. 517 518 The :class:`MH` class manipulates MH mailboxes, but it does not attempt to 519 emulate all of :program:`mh`'s behaviors. In particular, it does not modify 520 and is not affected by the :file:`context` or :file:`.mh_profile` files that 521 are used by :program:`mh` to store its state and configuration. 522 523 :class:`MH` instances have all of the methods of :class:`Mailbox` in addition 524 to the following: 525 526 527 .. method:: list_folders() 528 529 Return a list of the names of all folders. 530 531 532 .. method:: get_folder(folder) 533 534 Return an :class:`MH` instance representing the folder whose name is 535 *folder*. A :exc:`NoSuchMailboxError` exception is raised if the folder 536 does not exist. 537 538 539 .. method:: add_folder(folder) 540 541 Create a folder whose name is *folder* and return an :class:`MH` instance 542 representing it. 543 544 545 .. method:: remove_folder(folder) 546 547 Delete the folder whose name is *folder*. If the folder contains any 548 messages, a :exc:`NotEmptyError` exception will be raised and the folder 549 will not be deleted. 550 551 552 .. method:: get_sequences() 553 554 Return a dictionary of sequence names mapped to key lists. If there are no 555 sequences, the empty dictionary is returned. 556 557 558 .. method:: set_sequences(sequences) 559 560 Re-define the sequences that exist in the mailbox based upon *sequences*, 561 a dictionary of names mapped to key lists, like returned by 562 :meth:`get_sequences`. 563 564 565 .. method:: pack() 566 567 Rename messages in the mailbox as necessary to eliminate gaps in 568 numbering. Entries in the sequences list are updated correspondingly. 569 570 .. note:: 571 572 Already-issued keys are invalidated by this operation and should not be 573 subsequently used. 574 575 Some :class:`Mailbox` methods implemented by :class:`MH` deserve special 576 remarks: 577 578 579 .. method:: remove(key) 580 __delitem__(key) 581 discard(key) 582 583 These methods immediately delete the message. The MH convention of marking 584 a message for deletion by prepending a comma to its name is not used. 585 586 587 .. method:: lock() 588 unlock() 589 590 Three locking mechanisms are used---dot locking and, if available, the 591 :c:func:`flock` and :c:func:`lockf` system calls. For MH mailboxes, locking 592 the mailbox means locking the :file:`.mh_sequences` file and, only for the 593 duration of any operations that affect them, locking individual message 594 files. 595 596 597 .. method:: get_file(key) 598 599 Depending upon the host platform, it may not be possible to remove the 600 underlying message while the returned file remains open. 601 602 603 .. method:: flush() 604 605 All changes to MH mailboxes are immediately applied, so this method does 606 nothing. 607 608 609 .. method:: close() 610 611 :class:`MH` instances do not keep any open files, so this method is 612 equivalent to :meth:`unlock`. 613 614 615.. seealso:: 616 617 `nmh - Message Handling System <http://www.nongnu.org/nmh/>`_ 618 Home page of :program:`nmh`, an updated version of the original :program:`mh`. 619 620 `MH & nmh: Email for Users & Programmers <https://rand-mh.sourceforge.io/book/>`_ 621 A GPL-licensed book on :program:`mh` and :program:`nmh`, with some information 622 on the mailbox format. 623 624 625.. _mailbox-babyl: 626 627:class:`Babyl` 628^^^^^^^^^^^^^^ 629 630 631.. class:: Babyl(path, factory=None, create=True) 632 633 A subclass of :class:`Mailbox` for mailboxes in Babyl format. Parameter 634 *factory* is a callable object that accepts a file-like message representation 635 (which behaves as if opened in binary mode) and returns a custom representation. 636 If *factory* is ``None``, :class:`BabylMessage` is used as the default message 637 representation. If *create* is ``True``, the mailbox is created if it does not 638 exist. 639 640 Babyl is a single-file mailbox format used by the Rmail mail user agent 641 included with Emacs. The beginning of a message is indicated by a line 642 containing the two characters Control-Underscore (``'\037'``) and Control-L 643 (``'\014'``). The end of a message is indicated by the start of the next 644 message or, in the case of the last message, a line containing a 645 Control-Underscore (``'\037'``) character. 646 647 Messages in a Babyl mailbox have two sets of headers, original headers and 648 so-called visible headers. Visible headers are typically a subset of the 649 original headers that have been reformatted or abridged to be more 650 attractive. Each message in a Babyl mailbox also has an accompanying list of 651 :dfn:`labels`, or short strings that record extra information about the 652 message, and a list of all user-defined labels found in the mailbox is kept 653 in the Babyl options section. 654 655 :class:`Babyl` instances have all of the methods of :class:`Mailbox` in 656 addition to the following: 657 658 659 .. method:: get_labels() 660 661 Return a list of the names of all user-defined labels used in the mailbox. 662 663 .. note:: 664 665 The actual messages are inspected to determine which labels exist in 666 the mailbox rather than consulting the list of labels in the Babyl 667 options section, but the Babyl section is updated whenever the mailbox 668 is modified. 669 670 Some :class:`Mailbox` methods implemented by :class:`Babyl` deserve special 671 remarks: 672 673 674 .. method:: get_file(key) 675 676 In Babyl mailboxes, the headers of a message are not stored contiguously 677 with the body of the message. To generate a file-like representation, the 678 headers and body are copied together into an :class:`io.BytesIO` instance, 679 which has an API identical to that of a 680 file. As a result, the file-like object is truly independent of the 681 underlying mailbox but does not save memory compared to a string 682 representation. 683 684 685 .. method:: lock() 686 unlock() 687 688 Three locking mechanisms are used---dot locking and, if available, the 689 :c:func:`flock` and :c:func:`lockf` system calls. 690 691 692.. seealso:: 693 694 `Format of Version 5 Babyl Files <https://quimby.gnus.org/notes/BABYL>`_ 695 A specification of the Babyl format. 696 697 `Reading Mail with Rmail <https://www.gnu.org/software/emacs/manual/html_node/emacs/Rmail.html>`_ 698 The Rmail manual, with some information on Babyl semantics. 699 700 701.. _mailbox-mmdf: 702 703:class:`MMDF` 704^^^^^^^^^^^^^ 705 706 707.. class:: MMDF(path, factory=None, create=True) 708 709 A subclass of :class:`Mailbox` for mailboxes in MMDF format. Parameter *factory* 710 is a callable object that accepts a file-like message representation (which 711 behaves as if opened in binary mode) and returns a custom representation. If 712 *factory* is ``None``, :class:`MMDFMessage` is used as the default message 713 representation. If *create* is ``True``, the mailbox is created if it does not 714 exist. 715 716 MMDF is a single-file mailbox format invented for the Multichannel Memorandum 717 Distribution Facility, a mail transfer agent. Each message is in the same 718 form as an mbox message but is bracketed before and after by lines containing 719 four Control-A (``'\001'``) characters. As with the mbox format, the 720 beginning of each message is indicated by a line whose first five characters 721 are "From ", but additional occurrences of "From " are not transformed to 722 ">From " when storing messages because the extra message separator lines 723 prevent mistaking such occurrences for the starts of subsequent messages. 724 725 Some :class:`Mailbox` methods implemented by :class:`MMDF` deserve special 726 remarks: 727 728 729 .. method:: get_file(key) 730 731 Using the file after calling :meth:`flush` or :meth:`close` on the 732 :class:`MMDF` instance may yield unpredictable results or raise an 733 exception. 734 735 736 .. method:: lock() 737 unlock() 738 739 Three locking mechanisms are used---dot locking and, if available, the 740 :c:func:`flock` and :c:func:`lockf` system calls. 741 742 743.. seealso:: 744 745 `mmdf man page from tin <http://www.tin.org/bin/man.cgi?section=5&topic=mmdf>`_ 746 A specification of MMDF format from the documentation of tin, a newsreader. 747 748 `MMDF <https://en.wikipedia.org/wiki/MMDF>`_ 749 A Wikipedia article describing the Multichannel Memorandum Distribution 750 Facility. 751 752 753.. _mailbox-message-objects: 754 755:class:`Message` objects 756------------------------ 757 758 759.. class:: Message(message=None) 760 761 A subclass of the :mod:`email.message` module's 762 :class:`~email.message.Message`. Subclasses of :class:`mailbox.Message` add 763 mailbox-format-specific state and behavior. 764 765 If *message* is omitted, the new instance is created in a default, empty state. 766 If *message* is an :class:`email.message.Message` instance, its contents are 767 copied; furthermore, any format-specific information is converted insofar as 768 possible if *message* is a :class:`Message` instance. If *message* is a string, 769 a byte string, 770 or a file, it should contain an :rfc:`2822`\ -compliant message, which is read 771 and parsed. Files should be open in binary mode, but text mode files 772 are accepted for backward compatibility. 773 774 The format-specific state and behaviors offered by subclasses vary, but in 775 general it is only the properties that are not specific to a particular 776 mailbox that are supported (although presumably the properties are specific 777 to a particular mailbox format). For example, file offsets for single-file 778 mailbox formats and file names for directory-based mailbox formats are not 779 retained, because they are only applicable to the original mailbox. But state 780 such as whether a message has been read by the user or marked as important is 781 retained, because it applies to the message itself. 782 783 There is no requirement that :class:`Message` instances be used to represent 784 messages retrieved using :class:`Mailbox` instances. In some situations, the 785 time and memory required to generate :class:`Message` representations might 786 not be acceptable. For such situations, :class:`Mailbox` instances also 787 offer string and file-like representations, and a custom message factory may 788 be specified when a :class:`Mailbox` instance is initialized. 789 790 791.. _mailbox-maildirmessage: 792 793:class:`MaildirMessage` 794^^^^^^^^^^^^^^^^^^^^^^^ 795 796 797.. class:: MaildirMessage(message=None) 798 799 A message with Maildir-specific behaviors. Parameter *message* has the same 800 meaning as with the :class:`Message` constructor. 801 802 Typically, a mail user agent application moves all of the messages in the 803 :file:`new` subdirectory to the :file:`cur` subdirectory after the first time 804 the user opens and closes the mailbox, recording that the messages are old 805 whether or not they've actually been read. Each message in :file:`cur` has an 806 "info" section added to its file name to store information about its state. 807 (Some mail readers may also add an "info" section to messages in 808 :file:`new`.) The "info" section may take one of two forms: it may contain 809 "2," followed by a list of standardized flags (e.g., "2,FR") or it may 810 contain "1," followed by so-called experimental information. Standard flags 811 for Maildir messages are as follows: 812 813 +------+---------+--------------------------------+ 814 | Flag | Meaning | Explanation | 815 +======+=========+================================+ 816 | D | Draft | Under composition | 817 +------+---------+--------------------------------+ 818 | F | Flagged | Marked as important | 819 +------+---------+--------------------------------+ 820 | P | Passed | Forwarded, resent, or bounced | 821 +------+---------+--------------------------------+ 822 | R | Replied | Replied to | 823 +------+---------+--------------------------------+ 824 | S | Seen | Read | 825 +------+---------+--------------------------------+ 826 | T | Trashed | Marked for subsequent deletion | 827 +------+---------+--------------------------------+ 828 829 :class:`MaildirMessage` instances offer the following methods: 830 831 832 .. method:: get_subdir() 833 834 Return either "new" (if the message should be stored in the :file:`new` 835 subdirectory) or "cur" (if the message should be stored in the :file:`cur` 836 subdirectory). 837 838 .. note:: 839 840 A message is typically moved from :file:`new` to :file:`cur` after its 841 mailbox has been accessed, whether or not the message is has been 842 read. A message ``msg`` has been read if ``"S" in msg.get_flags()`` is 843 ``True``. 844 845 846 .. method:: set_subdir(subdir) 847 848 Set the subdirectory the message should be stored in. Parameter *subdir* 849 must be either "new" or "cur". 850 851 852 .. method:: get_flags() 853 854 Return a string specifying the flags that are currently set. If the 855 message complies with the standard Maildir format, the result is the 856 concatenation in alphabetical order of zero or one occurrence of each of 857 ``'D'``, ``'F'``, ``'P'``, ``'R'``, ``'S'``, and ``'T'``. The empty string 858 is returned if no flags are set or if "info" contains experimental 859 semantics. 860 861 862 .. method:: set_flags(flags) 863 864 Set the flags specified by *flags* and unset all others. 865 866 867 .. method:: add_flag(flag) 868 869 Set the flag(s) specified by *flag* without changing other flags. To add 870 more than one flag at a time, *flag* may be a string of more than one 871 character. The current "info" is overwritten whether or not it contains 872 experimental information rather than flags. 873 874 875 .. method:: remove_flag(flag) 876 877 Unset the flag(s) specified by *flag* without changing other flags. To 878 remove more than one flag at a time, *flag* maybe a string of more than 879 one character. If "info" contains experimental information rather than 880 flags, the current "info" is not modified. 881 882 883 .. method:: get_date() 884 885 Return the delivery date of the message as a floating-point number 886 representing seconds since the epoch. 887 888 889 .. method:: set_date(date) 890 891 Set the delivery date of the message to *date*, a floating-point number 892 representing seconds since the epoch. 893 894 895 .. method:: get_info() 896 897 Return a string containing the "info" for a message. This is useful for 898 accessing and modifying "info" that is experimental (i.e., not a list of 899 flags). 900 901 902 .. method:: set_info(info) 903 904 Set "info" to *info*, which should be a string. 905 906When a :class:`MaildirMessage` instance is created based upon an 907:class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status` 908and :mailheader:`X-Status` headers are omitted and the following conversions 909take place: 910 911+--------------------+----------------------------------------------+ 912| Resulting state | :class:`mboxMessage` or :class:`MMDFMessage` | 913| | state | 914+====================+==============================================+ 915| "cur" subdirectory | O flag | 916+--------------------+----------------------------------------------+ 917| F flag | F flag | 918+--------------------+----------------------------------------------+ 919| R flag | A flag | 920+--------------------+----------------------------------------------+ 921| S flag | R flag | 922+--------------------+----------------------------------------------+ 923| T flag | D flag | 924+--------------------+----------------------------------------------+ 925 926When a :class:`MaildirMessage` instance is created based upon an 927:class:`MHMessage` instance, the following conversions take place: 928 929+-------------------------------+--------------------------+ 930| Resulting state | :class:`MHMessage` state | 931+===============================+==========================+ 932| "cur" subdirectory | "unseen" sequence | 933+-------------------------------+--------------------------+ 934| "cur" subdirectory and S flag | no "unseen" sequence | 935+-------------------------------+--------------------------+ 936| F flag | "flagged" sequence | 937+-------------------------------+--------------------------+ 938| R flag | "replied" sequence | 939+-------------------------------+--------------------------+ 940 941When a :class:`MaildirMessage` instance is created based upon a 942:class:`BabylMessage` instance, the following conversions take place: 943 944+-------------------------------+-------------------------------+ 945| Resulting state | :class:`BabylMessage` state | 946+===============================+===============================+ 947| "cur" subdirectory | "unseen" label | 948+-------------------------------+-------------------------------+ 949| "cur" subdirectory and S flag | no "unseen" label | 950+-------------------------------+-------------------------------+ 951| P flag | "forwarded" or "resent" label | 952+-------------------------------+-------------------------------+ 953| R flag | "answered" label | 954+-------------------------------+-------------------------------+ 955| T flag | "deleted" label | 956+-------------------------------+-------------------------------+ 957 958 959.. _mailbox-mboxmessage: 960 961:class:`mboxMessage` 962^^^^^^^^^^^^^^^^^^^^ 963 964 965.. class:: mboxMessage(message=None) 966 967 A message with mbox-specific behaviors. Parameter *message* has the same meaning 968 as with the :class:`Message` constructor. 969 970 Messages in an mbox mailbox are stored together in a single file. The 971 sender's envelope address and the time of delivery are typically stored in a 972 line beginning with "From " that is used to indicate the start of a message, 973 though there is considerable variation in the exact format of this data among 974 mbox implementations. Flags that indicate the state of the message, such as 975 whether it has been read or marked as important, are typically stored in 976 :mailheader:`Status` and :mailheader:`X-Status` headers. 977 978 Conventional flags for mbox messages are as follows: 979 980 +------+----------+--------------------------------+ 981 | Flag | Meaning | Explanation | 982 +======+==========+================================+ 983 | R | Read | Read | 984 +------+----------+--------------------------------+ 985 | O | Old | Previously detected by MUA | 986 +------+----------+--------------------------------+ 987 | D | Deleted | Marked for subsequent deletion | 988 +------+----------+--------------------------------+ 989 | F | Flagged | Marked as important | 990 +------+----------+--------------------------------+ 991 | A | Answered | Replied to | 992 +------+----------+--------------------------------+ 993 994 The "R" and "O" flags are stored in the :mailheader:`Status` header, and the 995 "D", "F", and "A" flags are stored in the :mailheader:`X-Status` header. The 996 flags and headers typically appear in the order mentioned. 997 998 :class:`mboxMessage` instances offer the following methods: 999 1000 1001 .. method:: get_from() 1002 1003 Return a string representing the "From " line that marks the start of the 1004 message in an mbox mailbox. The leading "From " and the trailing newline 1005 are excluded. 1006 1007 1008 .. method:: set_from(from_, time_=None) 1009 1010 Set the "From " line to *from_*, which should be specified without a 1011 leading "From " or trailing newline. For convenience, *time_* may be 1012 specified and will be formatted appropriately and appended to *from_*. If 1013 *time_* is specified, it should be a :class:`time.struct_time` instance, a 1014 tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use 1015 :meth:`time.gmtime`). 1016 1017 1018 .. method:: get_flags() 1019 1020 Return a string specifying the flags that are currently set. If the 1021 message complies with the conventional format, the result is the 1022 concatenation in the following order of zero or one occurrence of each of 1023 ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``. 1024 1025 1026 .. method:: set_flags(flags) 1027 1028 Set the flags specified by *flags* and unset all others. Parameter *flags* 1029 should be the concatenation in any order of zero or more occurrences of 1030 each of ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``. 1031 1032 1033 .. method:: add_flag(flag) 1034 1035 Set the flag(s) specified by *flag* without changing other flags. To add 1036 more than one flag at a time, *flag* may be a string of more than one 1037 character. 1038 1039 1040 .. method:: remove_flag(flag) 1041 1042 Unset the flag(s) specified by *flag* without changing other flags. To 1043 remove more than one flag at a time, *flag* maybe a string of more than 1044 one character. 1045 1046When an :class:`mboxMessage` instance is created based upon a 1047:class:`MaildirMessage` instance, a "From " line is generated based upon the 1048:class:`MaildirMessage` instance's delivery date, and the following conversions 1049take place: 1050 1051+-----------------+-------------------------------+ 1052| Resulting state | :class:`MaildirMessage` state | 1053+=================+===============================+ 1054| R flag | S flag | 1055+-----------------+-------------------------------+ 1056| O flag | "cur" subdirectory | 1057+-----------------+-------------------------------+ 1058| D flag | T flag | 1059+-----------------+-------------------------------+ 1060| F flag | F flag | 1061+-----------------+-------------------------------+ 1062| A flag | R flag | 1063+-----------------+-------------------------------+ 1064 1065When an :class:`mboxMessage` instance is created based upon an 1066:class:`MHMessage` instance, the following conversions take place: 1067 1068+-------------------+--------------------------+ 1069| Resulting state | :class:`MHMessage` state | 1070+===================+==========================+ 1071| R flag and O flag | no "unseen" sequence | 1072+-------------------+--------------------------+ 1073| O flag | "unseen" sequence | 1074+-------------------+--------------------------+ 1075| F flag | "flagged" sequence | 1076+-------------------+--------------------------+ 1077| A flag | "replied" sequence | 1078+-------------------+--------------------------+ 1079 1080When an :class:`mboxMessage` instance is created based upon a 1081:class:`BabylMessage` instance, the following conversions take place: 1082 1083+-------------------+-----------------------------+ 1084| Resulting state | :class:`BabylMessage` state | 1085+===================+=============================+ 1086| R flag and O flag | no "unseen" label | 1087+-------------------+-----------------------------+ 1088| O flag | "unseen" label | 1089+-------------------+-----------------------------+ 1090| D flag | "deleted" label | 1091+-------------------+-----------------------------+ 1092| A flag | "answered" label | 1093+-------------------+-----------------------------+ 1094 1095When a :class:`Message` instance is created based upon an :class:`MMDFMessage` 1096instance, the "From " line is copied and all flags directly correspond: 1097 1098+-----------------+----------------------------+ 1099| Resulting state | :class:`MMDFMessage` state | 1100+=================+============================+ 1101| R flag | R flag | 1102+-----------------+----------------------------+ 1103| O flag | O flag | 1104+-----------------+----------------------------+ 1105| D flag | D flag | 1106+-----------------+----------------------------+ 1107| F flag | F flag | 1108+-----------------+----------------------------+ 1109| A flag | A flag | 1110+-----------------+----------------------------+ 1111 1112 1113.. _mailbox-mhmessage: 1114 1115:class:`MHMessage` 1116^^^^^^^^^^^^^^^^^^ 1117 1118 1119.. class:: MHMessage(message=None) 1120 1121 A message with MH-specific behaviors. Parameter *message* has the same meaning 1122 as with the :class:`Message` constructor. 1123 1124 MH messages do not support marks or flags in the traditional sense, but they 1125 do support sequences, which are logical groupings of arbitrary messages. Some 1126 mail reading programs (although not the standard :program:`mh` and 1127 :program:`nmh`) use sequences in much the same way flags are used with other 1128 formats, as follows: 1129 1130 +----------+------------------------------------------+ 1131 | Sequence | Explanation | 1132 +==========+==========================================+ 1133 | unseen | Not read, but previously detected by MUA | 1134 +----------+------------------------------------------+ 1135 | replied | Replied to | 1136 +----------+------------------------------------------+ 1137 | flagged | Marked as important | 1138 +----------+------------------------------------------+ 1139 1140 :class:`MHMessage` instances offer the following methods: 1141 1142 1143 .. method:: get_sequences() 1144 1145 Return a list of the names of sequences that include this message. 1146 1147 1148 .. method:: set_sequences(sequences) 1149 1150 Set the list of sequences that include this message. 1151 1152 1153 .. method:: add_sequence(sequence) 1154 1155 Add *sequence* to the list of sequences that include this message. 1156 1157 1158 .. method:: remove_sequence(sequence) 1159 1160 Remove *sequence* from the list of sequences that include this message. 1161 1162When an :class:`MHMessage` instance is created based upon a 1163:class:`MaildirMessage` instance, the following conversions take place: 1164 1165+--------------------+-------------------------------+ 1166| Resulting state | :class:`MaildirMessage` state | 1167+====================+===============================+ 1168| "unseen" sequence | no S flag | 1169+--------------------+-------------------------------+ 1170| "replied" sequence | R flag | 1171+--------------------+-------------------------------+ 1172| "flagged" sequence | F flag | 1173+--------------------+-------------------------------+ 1174 1175When an :class:`MHMessage` instance is created based upon an 1176:class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status` 1177and :mailheader:`X-Status` headers are omitted and the following conversions 1178take place: 1179 1180+--------------------+----------------------------------------------+ 1181| Resulting state | :class:`mboxMessage` or :class:`MMDFMessage` | 1182| | state | 1183+====================+==============================================+ 1184| "unseen" sequence | no R flag | 1185+--------------------+----------------------------------------------+ 1186| "replied" sequence | A flag | 1187+--------------------+----------------------------------------------+ 1188| "flagged" sequence | F flag | 1189+--------------------+----------------------------------------------+ 1190 1191When an :class:`MHMessage` instance is created based upon a 1192:class:`BabylMessage` instance, the following conversions take place: 1193 1194+--------------------+-----------------------------+ 1195| Resulting state | :class:`BabylMessage` state | 1196+====================+=============================+ 1197| "unseen" sequence | "unseen" label | 1198+--------------------+-----------------------------+ 1199| "replied" sequence | "answered" label | 1200+--------------------+-----------------------------+ 1201 1202 1203.. _mailbox-babylmessage: 1204 1205:class:`BabylMessage` 1206^^^^^^^^^^^^^^^^^^^^^ 1207 1208 1209.. class:: BabylMessage(message=None) 1210 1211 A message with Babyl-specific behaviors. Parameter *message* has the same 1212 meaning as with the :class:`Message` constructor. 1213 1214 Certain message labels, called :dfn:`attributes`, are defined by convention 1215 to have special meanings. The attributes are as follows: 1216 1217 +-----------+------------------------------------------+ 1218 | Label | Explanation | 1219 +===========+==========================================+ 1220 | unseen | Not read, but previously detected by MUA | 1221 +-----------+------------------------------------------+ 1222 | deleted | Marked for subsequent deletion | 1223 +-----------+------------------------------------------+ 1224 | filed | Copied to another file or mailbox | 1225 +-----------+------------------------------------------+ 1226 | answered | Replied to | 1227 +-----------+------------------------------------------+ 1228 | forwarded | Forwarded | 1229 +-----------+------------------------------------------+ 1230 | edited | Modified by the user | 1231 +-----------+------------------------------------------+ 1232 | resent | Resent | 1233 +-----------+------------------------------------------+ 1234 1235 By default, Rmail displays only visible headers. The :class:`BabylMessage` 1236 class, though, uses the original headers because they are more 1237 complete. Visible headers may be accessed explicitly if desired. 1238 1239 :class:`BabylMessage` instances offer the following methods: 1240 1241 1242 .. method:: get_labels() 1243 1244 Return a list of labels on the message. 1245 1246 1247 .. method:: set_labels(labels) 1248 1249 Set the list of labels on the message to *labels*. 1250 1251 1252 .. method:: add_label(label) 1253 1254 Add *label* to the list of labels on the message. 1255 1256 1257 .. method:: remove_label(label) 1258 1259 Remove *label* from the list of labels on the message. 1260 1261 1262 .. method:: get_visible() 1263 1264 Return an :class:`Message` instance whose headers are the message's 1265 visible headers and whose body is empty. 1266 1267 1268 .. method:: set_visible(visible) 1269 1270 Set the message's visible headers to be the same as the headers in 1271 *message*. Parameter *visible* should be a :class:`Message` instance, an 1272 :class:`email.message.Message` instance, a string, or a file-like object 1273 (which should be open in text mode). 1274 1275 1276 .. method:: update_visible() 1277 1278 When a :class:`BabylMessage` instance's original headers are modified, the 1279 visible headers are not automatically modified to correspond. This method 1280 updates the visible headers as follows: each visible header with a 1281 corresponding original header is set to the value of the original header, 1282 each visible header without a corresponding original header is removed, 1283 and any of :mailheader:`Date`, :mailheader:`From`, :mailheader:`Reply-To`, 1284 :mailheader:`To`, :mailheader:`CC`, and :mailheader:`Subject` that are 1285 present in the original headers but not the visible headers are added to 1286 the visible headers. 1287 1288When a :class:`BabylMessage` instance is created based upon a 1289:class:`MaildirMessage` instance, the following conversions take place: 1290 1291+-------------------+-------------------------------+ 1292| Resulting state | :class:`MaildirMessage` state | 1293+===================+===============================+ 1294| "unseen" label | no S flag | 1295+-------------------+-------------------------------+ 1296| "deleted" label | T flag | 1297+-------------------+-------------------------------+ 1298| "answered" label | R flag | 1299+-------------------+-------------------------------+ 1300| "forwarded" label | P flag | 1301+-------------------+-------------------------------+ 1302 1303When a :class:`BabylMessage` instance is created based upon an 1304:class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status` 1305and :mailheader:`X-Status` headers are omitted and the following conversions 1306take place: 1307 1308+------------------+----------------------------------------------+ 1309| Resulting state | :class:`mboxMessage` or :class:`MMDFMessage` | 1310| | state | 1311+==================+==============================================+ 1312| "unseen" label | no R flag | 1313+------------------+----------------------------------------------+ 1314| "deleted" label | D flag | 1315+------------------+----------------------------------------------+ 1316| "answered" label | A flag | 1317+------------------+----------------------------------------------+ 1318 1319When a :class:`BabylMessage` instance is created based upon an 1320:class:`MHMessage` instance, the following conversions take place: 1321 1322+------------------+--------------------------+ 1323| Resulting state | :class:`MHMessage` state | 1324+==================+==========================+ 1325| "unseen" label | "unseen" sequence | 1326+------------------+--------------------------+ 1327| "answered" label | "replied" sequence | 1328+------------------+--------------------------+ 1329 1330 1331.. _mailbox-mmdfmessage: 1332 1333:class:`MMDFMessage` 1334^^^^^^^^^^^^^^^^^^^^ 1335 1336 1337.. class:: MMDFMessage(message=None) 1338 1339 A message with MMDF-specific behaviors. Parameter *message* has the same meaning 1340 as with the :class:`Message` constructor. 1341 1342 As with message in an mbox mailbox, MMDF messages are stored with the 1343 sender's address and the delivery date in an initial line beginning with 1344 "From ". Likewise, flags that indicate the state of the message are 1345 typically stored in :mailheader:`Status` and :mailheader:`X-Status` headers. 1346 1347 Conventional flags for MMDF messages are identical to those of mbox message 1348 and are as follows: 1349 1350 +------+----------+--------------------------------+ 1351 | Flag | Meaning | Explanation | 1352 +======+==========+================================+ 1353 | R | Read | Read | 1354 +------+----------+--------------------------------+ 1355 | O | Old | Previously detected by MUA | 1356 +------+----------+--------------------------------+ 1357 | D | Deleted | Marked for subsequent deletion | 1358 +------+----------+--------------------------------+ 1359 | F | Flagged | Marked as important | 1360 +------+----------+--------------------------------+ 1361 | A | Answered | Replied to | 1362 +------+----------+--------------------------------+ 1363 1364 The "R" and "O" flags are stored in the :mailheader:`Status` header, and the 1365 "D", "F", and "A" flags are stored in the :mailheader:`X-Status` header. The 1366 flags and headers typically appear in the order mentioned. 1367 1368 :class:`MMDFMessage` instances offer the following methods, which are 1369 identical to those offered by :class:`mboxMessage`: 1370 1371 1372 .. method:: get_from() 1373 1374 Return a string representing the "From " line that marks the start of the 1375 message in an mbox mailbox. The leading "From " and the trailing newline 1376 are excluded. 1377 1378 1379 .. method:: set_from(from_, time_=None) 1380 1381 Set the "From " line to *from_*, which should be specified without a 1382 leading "From " or trailing newline. For convenience, *time_* may be 1383 specified and will be formatted appropriately and appended to *from_*. If 1384 *time_* is specified, it should be a :class:`time.struct_time` instance, a 1385 tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use 1386 :meth:`time.gmtime`). 1387 1388 1389 .. method:: get_flags() 1390 1391 Return a string specifying the flags that are currently set. If the 1392 message complies with the conventional format, the result is the 1393 concatenation in the following order of zero or one occurrence of each of 1394 ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``. 1395 1396 1397 .. method:: set_flags(flags) 1398 1399 Set the flags specified by *flags* and unset all others. Parameter *flags* 1400 should be the concatenation in any order of zero or more occurrences of 1401 each of ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``. 1402 1403 1404 .. method:: add_flag(flag) 1405 1406 Set the flag(s) specified by *flag* without changing other flags. To add 1407 more than one flag at a time, *flag* may be a string of more than one 1408 character. 1409 1410 1411 .. method:: remove_flag(flag) 1412 1413 Unset the flag(s) specified by *flag* without changing other flags. To 1414 remove more than one flag at a time, *flag* maybe a string of more than 1415 one character. 1416 1417When an :class:`MMDFMessage` instance is created based upon a 1418:class:`MaildirMessage` instance, a "From " line is generated based upon the 1419:class:`MaildirMessage` instance's delivery date, and the following conversions 1420take place: 1421 1422+-----------------+-------------------------------+ 1423| Resulting state | :class:`MaildirMessage` state | 1424+=================+===============================+ 1425| R flag | S flag | 1426+-----------------+-------------------------------+ 1427| O flag | "cur" subdirectory | 1428+-----------------+-------------------------------+ 1429| D flag | T flag | 1430+-----------------+-------------------------------+ 1431| F flag | F flag | 1432+-----------------+-------------------------------+ 1433| A flag | R flag | 1434+-----------------+-------------------------------+ 1435 1436When an :class:`MMDFMessage` instance is created based upon an 1437:class:`MHMessage` instance, the following conversions take place: 1438 1439+-------------------+--------------------------+ 1440| Resulting state | :class:`MHMessage` state | 1441+===================+==========================+ 1442| R flag and O flag | no "unseen" sequence | 1443+-------------------+--------------------------+ 1444| O flag | "unseen" sequence | 1445+-------------------+--------------------------+ 1446| F flag | "flagged" sequence | 1447+-------------------+--------------------------+ 1448| A flag | "replied" sequence | 1449+-------------------+--------------------------+ 1450 1451When an :class:`MMDFMessage` instance is created based upon a 1452:class:`BabylMessage` instance, the following conversions take place: 1453 1454+-------------------+-----------------------------+ 1455| Resulting state | :class:`BabylMessage` state | 1456+===================+=============================+ 1457| R flag and O flag | no "unseen" label | 1458+-------------------+-----------------------------+ 1459| O flag | "unseen" label | 1460+-------------------+-----------------------------+ 1461| D flag | "deleted" label | 1462+-------------------+-----------------------------+ 1463| A flag | "answered" label | 1464+-------------------+-----------------------------+ 1465 1466When an :class:`MMDFMessage` instance is created based upon an 1467:class:`mboxMessage` instance, the "From " line is copied and all flags directly 1468correspond: 1469 1470+-----------------+----------------------------+ 1471| Resulting state | :class:`mboxMessage` state | 1472+=================+============================+ 1473| R flag | R flag | 1474+-----------------+----------------------------+ 1475| O flag | O flag | 1476+-----------------+----------------------------+ 1477| D flag | D flag | 1478+-----------------+----------------------------+ 1479| F flag | F flag | 1480+-----------------+----------------------------+ 1481| A flag | A flag | 1482+-----------------+----------------------------+ 1483 1484 1485Exceptions 1486---------- 1487 1488The following exception classes are defined in the :mod:`mailbox` module: 1489 1490 1491.. exception:: Error() 1492 1493 The based class for all other module-specific exceptions. 1494 1495 1496.. exception:: NoSuchMailboxError() 1497 1498 Raised when a mailbox is expected but is not found, such as when instantiating a 1499 :class:`Mailbox` subclass with a path that does not exist (and with the *create* 1500 parameter set to ``False``), or when opening a folder that does not exist. 1501 1502 1503.. exception:: NotEmptyError() 1504 1505 Raised when a mailbox is not empty but is expected to be, such as when deleting 1506 a folder that contains messages. 1507 1508 1509.. exception:: ExternalClashError() 1510 1511 Raised when some mailbox-related condition beyond the control of the program 1512 causes it to be unable to proceed, such as when failing to acquire a lock that 1513 another program already holds a lock, or when a uniquely-generated file name 1514 already exists. 1515 1516 1517.. exception:: FormatError() 1518 1519 Raised when the data in a file cannot be parsed, such as when an :class:`MH` 1520 instance attempts to read a corrupted :file:`.mh_sequences` file. 1521 1522 1523.. _mailbox-examples: 1524 1525Examples 1526-------- 1527 1528A simple example of printing the subjects of all messages in a mailbox that seem 1529interesting:: 1530 1531 import mailbox 1532 for message in mailbox.mbox('~/mbox'): 1533 subject = message['subject'] # Could possibly be None. 1534 if subject and 'python' in subject.lower(): 1535 print(subject) 1536 1537To copy all mail from a Babyl mailbox to an MH mailbox, converting all of the 1538format-specific information that can be converted:: 1539 1540 import mailbox 1541 destination = mailbox.MH('~/Mail') 1542 destination.lock() 1543 for message in mailbox.Babyl('~/RMAIL'): 1544 destination.add(mailbox.MHMessage(message)) 1545 destination.flush() 1546 destination.unlock() 1547 1548This example sorts mail from several mailing lists into different mailboxes, 1549being careful to avoid mail corruption due to concurrent modification by other 1550programs, mail loss due to interruption of the program, or premature termination 1551due to malformed messages in the mailbox:: 1552 1553 import mailbox 1554 import email.errors 1555 1556 list_names = ('python-list', 'python-dev', 'python-bugs') 1557 1558 boxes = {name: mailbox.mbox('~/email/%s' % name) for name in list_names} 1559 inbox = mailbox.Maildir('~/Maildir', factory=None) 1560 1561 for key in inbox.iterkeys(): 1562 try: 1563 message = inbox[key] 1564 except email.errors.MessageParseError: 1565 continue # The message is malformed. Just leave it. 1566 1567 for name in list_names: 1568 list_id = message['list-id'] 1569 if list_id and name in list_id: 1570 # Get mailbox to use 1571 box = boxes[name] 1572 1573 # Write copy to disk before removing original. 1574 # If there's a crash, you might duplicate a message, but 1575 # that's better than losing a message completely. 1576 box.lock() 1577 box.add(message) 1578 box.flush() 1579 box.unlock() 1580 1581 # Remove original message 1582 inbox.lock() 1583 inbox.discard(key) 1584 inbox.flush() 1585 inbox.unlock() 1586 break # Found destination, so stop looking. 1587 1588 for box in boxes.itervalues(): 1589 box.close() 1590 1591