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 qmail <http://www.qmail.org/man/man5/maildir.html>`_ 430 The original specification of the format. 431 432 `Using maildir format <https://cr.yp.to/proto/maildir.html>`_ 433 Notes on Maildir by its inventor. Includes an updated name-creation scheme and 434 details on "info" semantics. 435 436 `maildir man page from Courier <http://www.courier-mta.org/maildir.html>`_ 437 Another specification of the format. Describes a common extension for supporting 438 folders. 439 440 441.. _mailbox-mbox: 442 443:class:`mbox` 444^^^^^^^^^^^^^ 445 446 447.. class:: mbox(path, factory=None, create=True) 448 449 A subclass of :class:`Mailbox` for mailboxes in mbox format. Parameter *factory* 450 is a callable object that accepts a file-like message representation (which 451 behaves as if opened in binary mode) and returns a custom representation. If 452 *factory* is ``None``, :class:`mboxMessage` is used as the default message 453 representation. If *create* is ``True``, the mailbox is created if it does not 454 exist. 455 456 The mbox format is the classic format for storing mail on Unix systems. All 457 messages in an mbox mailbox are stored in a single file with the beginning of 458 each message indicated by a line whose first five characters are "From ". 459 460 Several variations of the mbox format exist to address perceived shortcomings in 461 the original. In the interest of compatibility, :class:`mbox` implements the 462 original format, which is sometimes referred to as :dfn:`mboxo`. This means that 463 the :mailheader:`Content-Length` header, if present, is ignored and that any 464 occurrences of "From " at the beginning of a line in a message body are 465 transformed to ">From " when storing the message, although occurrences of ">From 466 " are not transformed to "From " when reading the message. 467 468 Some :class:`Mailbox` methods implemented by :class:`mbox` deserve special 469 remarks: 470 471 472 .. method:: get_file(key) 473 474 Using the file after calling :meth:`flush` or :meth:`close` on the 475 :class:`mbox` instance may yield unpredictable results or raise an 476 exception. 477 478 479 .. method:: lock() 480 unlock() 481 482 Three locking mechanisms are used---dot locking and, if available, the 483 :c:func:`flock` and :c:func:`lockf` system calls. 484 485 486.. seealso:: 487 488 `mbox man page from qmail <http://www.qmail.org/man/man5/mbox.html>`_ 489 A specification of the format and its variations. 490 491 `mbox man page from tin <http://www.tin.org/bin/man.cgi?section=5&topic=mbox>`_ 492 Another specification of the format, with details on locking. 493 494 `Configuring Netscape Mail on Unix: Why The Content-Length Format is Bad <https://www.jwz.org/doc/content-length.html>`_ 495 An argument for using the original mbox format rather than a variation. 496 497 `"mbox" is a family of several mutually incompatible mailbox formats <https://www.loc.gov/preservation/digital/formats/fdd/fdd000383.shtml>`_ 498 A history of mbox variations. 499 500 501.. _mailbox-mh: 502 503:class:`MH` 504^^^^^^^^^^^ 505 506 507.. class:: MH(path, factory=None, create=True) 508 509 A subclass of :class:`Mailbox` for mailboxes in MH format. Parameter *factory* 510 is a callable object that accepts a file-like message representation (which 511 behaves as if opened in binary mode) and returns a custom representation. If 512 *factory* is ``None``, :class:`MHMessage` is used as the default message 513 representation. If *create* is ``True``, the mailbox is created if it does not 514 exist. 515 516 MH is a directory-based mailbox format invented for the MH Message Handling 517 System, a mail user agent. Each message in an MH mailbox resides in its own 518 file. An MH mailbox may contain other MH mailboxes (called :dfn:`folders`) in 519 addition to messages. Folders may be nested indefinitely. MH mailboxes also 520 support :dfn:`sequences`, which are named lists used to logically group 521 messages without moving them to sub-folders. Sequences are defined in a file 522 called :file:`.mh_sequences` in each folder. 523 524 The :class:`MH` class manipulates MH mailboxes, but it does not attempt to 525 emulate all of :program:`mh`'s behaviors. In particular, it does not modify 526 and is not affected by the :file:`context` or :file:`.mh_profile` files that 527 are used by :program:`mh` to store its state and configuration. 528 529 :class:`MH` instances have all of the methods of :class:`Mailbox` in addition 530 to the following: 531 532 533 .. method:: list_folders() 534 535 Return a list of the names of all folders. 536 537 538 .. method:: get_folder(folder) 539 540 Return an :class:`MH` instance representing the folder whose name is 541 *folder*. A :exc:`NoSuchMailboxError` exception is raised if the folder 542 does not exist. 543 544 545 .. method:: add_folder(folder) 546 547 Create a folder whose name is *folder* and return an :class:`MH` instance 548 representing it. 549 550 551 .. method:: remove_folder(folder) 552 553 Delete the folder whose name is *folder*. If the folder contains any 554 messages, a :exc:`NotEmptyError` exception will be raised and the folder 555 will not be deleted. 556 557 558 .. method:: get_sequences() 559 560 Return a dictionary of sequence names mapped to key lists. If there are no 561 sequences, the empty dictionary is returned. 562 563 564 .. method:: set_sequences(sequences) 565 566 Re-define the sequences that exist in the mailbox based upon *sequences*, 567 a dictionary of names mapped to key lists, like returned by 568 :meth:`get_sequences`. 569 570 571 .. method:: pack() 572 573 Rename messages in the mailbox as necessary to eliminate gaps in 574 numbering. Entries in the sequences list are updated correspondingly. 575 576 .. note:: 577 578 Already-issued keys are invalidated by this operation and should not be 579 subsequently used. 580 581 Some :class:`Mailbox` methods implemented by :class:`MH` deserve special 582 remarks: 583 584 585 .. method:: remove(key) 586 __delitem__(key) 587 discard(key) 588 589 These methods immediately delete the message. The MH convention of marking 590 a message for deletion by prepending a comma to its name is not used. 591 592 593 .. method:: lock() 594 unlock() 595 596 Three locking mechanisms are used---dot locking and, if available, the 597 :c:func:`flock` and :c:func:`lockf` system calls. For MH mailboxes, locking 598 the mailbox means locking the :file:`.mh_sequences` file and, only for the 599 duration of any operations that affect them, locking individual message 600 files. 601 602 603 .. method:: get_file(key) 604 605 Depending upon the host platform, it may not be possible to remove the 606 underlying message while the returned file remains open. 607 608 609 .. method:: flush() 610 611 All changes to MH mailboxes are immediately applied, so this method does 612 nothing. 613 614 615 .. method:: close() 616 617 :class:`MH` instances do not keep any open files, so this method is 618 equivalent to :meth:`unlock`. 619 620 621.. seealso:: 622 623 `nmh - Message Handling System <http://www.nongnu.org/nmh/>`_ 624 Home page of :program:`nmh`, an updated version of the original :program:`mh`. 625 626 `MH & nmh: Email for Users & Programmers <https://rand-mh.sourceforge.io/book/>`_ 627 A GPL-licensed book on :program:`mh` and :program:`nmh`, with some information 628 on the mailbox format. 629 630 631.. _mailbox-babyl: 632 633:class:`Babyl` 634^^^^^^^^^^^^^^ 635 636 637.. class:: Babyl(path, factory=None, create=True) 638 639 A subclass of :class:`Mailbox` for mailboxes in Babyl format. Parameter 640 *factory* is a callable object that accepts a file-like message representation 641 (which behaves as if opened in binary mode) and returns a custom representation. 642 If *factory* is ``None``, :class:`BabylMessage` is used as the default message 643 representation. If *create* is ``True``, the mailbox is created if it does not 644 exist. 645 646 Babyl is a single-file mailbox format used by the Rmail mail user agent 647 included with Emacs. The beginning of a message is indicated by a line 648 containing the two characters Control-Underscore (``'\037'``) and Control-L 649 (``'\014'``). The end of a message is indicated by the start of the next 650 message or, in the case of the last message, a line containing a 651 Control-Underscore (``'\037'``) character. 652 653 Messages in a Babyl mailbox have two sets of headers, original headers and 654 so-called visible headers. Visible headers are typically a subset of the 655 original headers that have been reformatted or abridged to be more 656 attractive. Each message in a Babyl mailbox also has an accompanying list of 657 :dfn:`labels`, or short strings that record extra information about the 658 message, and a list of all user-defined labels found in the mailbox is kept 659 in the Babyl options section. 660 661 :class:`Babyl` instances have all of the methods of :class:`Mailbox` in 662 addition to the following: 663 664 665 .. method:: get_labels() 666 667 Return a list of the names of all user-defined labels used in the mailbox. 668 669 .. note:: 670 671 The actual messages are inspected to determine which labels exist in 672 the mailbox rather than consulting the list of labels in the Babyl 673 options section, but the Babyl section is updated whenever the mailbox 674 is modified. 675 676 Some :class:`Mailbox` methods implemented by :class:`Babyl` deserve special 677 remarks: 678 679 680 .. method:: get_file(key) 681 682 In Babyl mailboxes, the headers of a message are not stored contiguously 683 with the body of the message. To generate a file-like representation, the 684 headers and body are copied together into an :class:`io.BytesIO` instance, 685 which has an API identical to that of a 686 file. As a result, the file-like object is truly independent of the 687 underlying mailbox but does not save memory compared to a string 688 representation. 689 690 691 .. method:: lock() 692 unlock() 693 694 Three locking mechanisms are used---dot locking and, if available, the 695 :c:func:`flock` and :c:func:`lockf` system calls. 696 697 698.. seealso:: 699 700 `Format of Version 5 Babyl Files <https://quimby.gnus.org/notes/BABYL>`_ 701 A specification of the Babyl format. 702 703 `Reading Mail with Rmail <https://www.gnu.org/software/emacs/manual/html_node/emacs/Rmail.html>`_ 704 The Rmail manual, with some information on Babyl semantics. 705 706 707.. _mailbox-mmdf: 708 709:class:`MMDF` 710^^^^^^^^^^^^^ 711 712 713.. class:: MMDF(path, factory=None, create=True) 714 715 A subclass of :class:`Mailbox` for mailboxes in MMDF format. Parameter *factory* 716 is a callable object that accepts a file-like message representation (which 717 behaves as if opened in binary mode) and returns a custom representation. If 718 *factory* is ``None``, :class:`MMDFMessage` is used as the default message 719 representation. If *create* is ``True``, the mailbox is created if it does not 720 exist. 721 722 MMDF is a single-file mailbox format invented for the Multichannel Memorandum 723 Distribution Facility, a mail transfer agent. Each message is in the same 724 form as an mbox message but is bracketed before and after by lines containing 725 four Control-A (``'\001'``) characters. As with the mbox format, the 726 beginning of each message is indicated by a line whose first five characters 727 are "From ", but additional occurrences of "From " are not transformed to 728 ">From " when storing messages because the extra message separator lines 729 prevent mistaking such occurrences for the starts of subsequent messages. 730 731 Some :class:`Mailbox` methods implemented by :class:`MMDF` deserve special 732 remarks: 733 734 735 .. method:: get_file(key) 736 737 Using the file after calling :meth:`flush` or :meth:`close` on the 738 :class:`MMDF` instance may yield unpredictable results or raise an 739 exception. 740 741 742 .. method:: lock() 743 unlock() 744 745 Three locking mechanisms are used---dot locking and, if available, the 746 :c:func:`flock` and :c:func:`lockf` system calls. 747 748 749.. seealso:: 750 751 `mmdf man page from tin <http://www.tin.org/bin/man.cgi?section=5&topic=mmdf>`_ 752 A specification of MMDF format from the documentation of tin, a newsreader. 753 754 `MMDF <https://en.wikipedia.org/wiki/MMDF>`_ 755 A Wikipedia article describing the Multichannel Memorandum Distribution 756 Facility. 757 758 759.. _mailbox-message-objects: 760 761:class:`Message` objects 762------------------------ 763 764 765.. class:: Message(message=None) 766 767 A subclass of the :mod:`email.message` module's 768 :class:`~email.message.Message`. Subclasses of :class:`mailbox.Message` add 769 mailbox-format-specific state and behavior. 770 771 If *message* is omitted, the new instance is created in a default, empty state. 772 If *message* is an :class:`email.message.Message` instance, its contents are 773 copied; furthermore, any format-specific information is converted insofar as 774 possible if *message* is a :class:`Message` instance. If *message* is a string, 775 a byte string, 776 or a file, it should contain an :rfc:`2822`\ -compliant message, which is read 777 and parsed. Files should be open in binary mode, but text mode files 778 are accepted for backward compatibility. 779 780 The format-specific state and behaviors offered by subclasses vary, but in 781 general it is only the properties that are not specific to a particular 782 mailbox that are supported (although presumably the properties are specific 783 to a particular mailbox format). For example, file offsets for single-file 784 mailbox formats and file names for directory-based mailbox formats are not 785 retained, because they are only applicable to the original mailbox. But state 786 such as whether a message has been read by the user or marked as important is 787 retained, because it applies to the message itself. 788 789 There is no requirement that :class:`Message` instances be used to represent 790 messages retrieved using :class:`Mailbox` instances. In some situations, the 791 time and memory required to generate :class:`Message` representations might 792 not be acceptable. For such situations, :class:`Mailbox` instances also 793 offer string and file-like representations, and a custom message factory may 794 be specified when a :class:`Mailbox` instance is initialized. 795 796 797.. _mailbox-maildirmessage: 798 799:class:`MaildirMessage` 800^^^^^^^^^^^^^^^^^^^^^^^ 801 802 803.. class:: MaildirMessage(message=None) 804 805 A message with Maildir-specific behaviors. Parameter *message* has the same 806 meaning as with the :class:`Message` constructor. 807 808 Typically, a mail user agent application moves all of the messages in the 809 :file:`new` subdirectory to the :file:`cur` subdirectory after the first time 810 the user opens and closes the mailbox, recording that the messages are old 811 whether or not they've actually been read. Each message in :file:`cur` has an 812 "info" section added to its file name to store information about its state. 813 (Some mail readers may also add an "info" section to messages in 814 :file:`new`.) The "info" section may take one of two forms: it may contain 815 "2," followed by a list of standardized flags (e.g., "2,FR") or it may 816 contain "1," followed by so-called experimental information. Standard flags 817 for Maildir messages are as follows: 818 819 +------+---------+--------------------------------+ 820 | Flag | Meaning | Explanation | 821 +======+=========+================================+ 822 | D | Draft | Under composition | 823 +------+---------+--------------------------------+ 824 | F | Flagged | Marked as important | 825 +------+---------+--------------------------------+ 826 | P | Passed | Forwarded, resent, or bounced | 827 +------+---------+--------------------------------+ 828 | R | Replied | Replied to | 829 +------+---------+--------------------------------+ 830 | S | Seen | Read | 831 +------+---------+--------------------------------+ 832 | T | Trashed | Marked for subsequent deletion | 833 +------+---------+--------------------------------+ 834 835 :class:`MaildirMessage` instances offer the following methods: 836 837 838 .. method:: get_subdir() 839 840 Return either "new" (if the message should be stored in the :file:`new` 841 subdirectory) or "cur" (if the message should be stored in the :file:`cur` 842 subdirectory). 843 844 .. note:: 845 846 A message is typically moved from :file:`new` to :file:`cur` after its 847 mailbox has been accessed, whether or not the message is has been 848 read. A message ``msg`` has been read if ``"S" in msg.get_flags()`` is 849 ``True``. 850 851 852 .. method:: set_subdir(subdir) 853 854 Set the subdirectory the message should be stored in. Parameter *subdir* 855 must be either "new" or "cur". 856 857 858 .. method:: get_flags() 859 860 Return a string specifying the flags that are currently set. If the 861 message complies with the standard Maildir format, the result is the 862 concatenation in alphabetical order of zero or one occurrence of each of 863 ``'D'``, ``'F'``, ``'P'``, ``'R'``, ``'S'``, and ``'T'``. The empty string 864 is returned if no flags are set or if "info" contains experimental 865 semantics. 866 867 868 .. method:: set_flags(flags) 869 870 Set the flags specified by *flags* and unset all others. 871 872 873 .. method:: add_flag(flag) 874 875 Set the flag(s) specified by *flag* without changing other flags. To add 876 more than one flag at a time, *flag* may be a string of more than one 877 character. The current "info" is overwritten whether or not it contains 878 experimental information rather than flags. 879 880 881 .. method:: remove_flag(flag) 882 883 Unset the flag(s) specified by *flag* without changing other flags. To 884 remove more than one flag at a time, *flag* maybe a string of more than 885 one character. If "info" contains experimental information rather than 886 flags, the current "info" is not modified. 887 888 889 .. method:: get_date() 890 891 Return the delivery date of the message as a floating-point number 892 representing seconds since the epoch. 893 894 895 .. method:: set_date(date) 896 897 Set the delivery date of the message to *date*, a floating-point number 898 representing seconds since the epoch. 899 900 901 .. method:: get_info() 902 903 Return a string containing the "info" for a message. This is useful for 904 accessing and modifying "info" that is experimental (i.e., not a list of 905 flags). 906 907 908 .. method:: set_info(info) 909 910 Set "info" to *info*, which should be a string. 911 912When a :class:`MaildirMessage` instance is created based upon an 913:class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status` 914and :mailheader:`X-Status` headers are omitted and the following conversions 915take place: 916 917+--------------------+----------------------------------------------+ 918| Resulting state | :class:`mboxMessage` or :class:`MMDFMessage` | 919| | state | 920+====================+==============================================+ 921| "cur" subdirectory | O flag | 922+--------------------+----------------------------------------------+ 923| F flag | F flag | 924+--------------------+----------------------------------------------+ 925| R flag | A flag | 926+--------------------+----------------------------------------------+ 927| S flag | R flag | 928+--------------------+----------------------------------------------+ 929| T flag | D flag | 930+--------------------+----------------------------------------------+ 931 932When a :class:`MaildirMessage` instance is created based upon an 933:class:`MHMessage` instance, the following conversions take place: 934 935+-------------------------------+--------------------------+ 936| Resulting state | :class:`MHMessage` state | 937+===============================+==========================+ 938| "cur" subdirectory | "unseen" sequence | 939+-------------------------------+--------------------------+ 940| "cur" subdirectory and S flag | no "unseen" sequence | 941+-------------------------------+--------------------------+ 942| F flag | "flagged" sequence | 943+-------------------------------+--------------------------+ 944| R flag | "replied" sequence | 945+-------------------------------+--------------------------+ 946 947When a :class:`MaildirMessage` instance is created based upon a 948:class:`BabylMessage` instance, the following conversions take place: 949 950+-------------------------------+-------------------------------+ 951| Resulting state | :class:`BabylMessage` state | 952+===============================+===============================+ 953| "cur" subdirectory | "unseen" label | 954+-------------------------------+-------------------------------+ 955| "cur" subdirectory and S flag | no "unseen" label | 956+-------------------------------+-------------------------------+ 957| P flag | "forwarded" or "resent" label | 958+-------------------------------+-------------------------------+ 959| R flag | "answered" label | 960+-------------------------------+-------------------------------+ 961| T flag | "deleted" label | 962+-------------------------------+-------------------------------+ 963 964 965.. _mailbox-mboxmessage: 966 967:class:`mboxMessage` 968^^^^^^^^^^^^^^^^^^^^ 969 970 971.. class:: mboxMessage(message=None) 972 973 A message with mbox-specific behaviors. Parameter *message* has the same meaning 974 as with the :class:`Message` constructor. 975 976 Messages in an mbox mailbox are stored together in a single file. The 977 sender's envelope address and the time of delivery are typically stored in a 978 line beginning with "From " that is used to indicate the start of a message, 979 though there is considerable variation in the exact format of this data among 980 mbox implementations. Flags that indicate the state of the message, such as 981 whether it has been read or marked as important, are typically stored in 982 :mailheader:`Status` and :mailheader:`X-Status` headers. 983 984 Conventional flags for mbox messages are as follows: 985 986 +------+----------+--------------------------------+ 987 | Flag | Meaning | Explanation | 988 +======+==========+================================+ 989 | R | Read | Read | 990 +------+----------+--------------------------------+ 991 | O | Old | Previously detected by MUA | 992 +------+----------+--------------------------------+ 993 | D | Deleted | Marked for subsequent deletion | 994 +------+----------+--------------------------------+ 995 | F | Flagged | Marked as important | 996 +------+----------+--------------------------------+ 997 | A | Answered | Replied to | 998 +------+----------+--------------------------------+ 999 1000 The "R" and "O" flags are stored in the :mailheader:`Status` header, and the 1001 "D", "F", and "A" flags are stored in the :mailheader:`X-Status` header. The 1002 flags and headers typically appear in the order mentioned. 1003 1004 :class:`mboxMessage` instances offer the following methods: 1005 1006 1007 .. method:: get_from() 1008 1009 Return a string representing the "From " line that marks the start of the 1010 message in an mbox mailbox. The leading "From " and the trailing newline 1011 are excluded. 1012 1013 1014 .. method:: set_from(from_, time_=None) 1015 1016 Set the "From " line to *from_*, which should be specified without a 1017 leading "From " or trailing newline. For convenience, *time_* may be 1018 specified and will be formatted appropriately and appended to *from_*. If 1019 *time_* is specified, it should be a :class:`time.struct_time` instance, a 1020 tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use 1021 :meth:`time.gmtime`). 1022 1023 1024 .. method:: get_flags() 1025 1026 Return a string specifying the flags that are currently set. If the 1027 message complies with the conventional format, the result is the 1028 concatenation in the following order of zero or one occurrence of each of 1029 ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``. 1030 1031 1032 .. method:: set_flags(flags) 1033 1034 Set the flags specified by *flags* and unset all others. Parameter *flags* 1035 should be the concatenation in any order of zero or more occurrences of 1036 each of ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``. 1037 1038 1039 .. method:: add_flag(flag) 1040 1041 Set the flag(s) specified by *flag* without changing other flags. To add 1042 more than one flag at a time, *flag* may be a string of more than one 1043 character. 1044 1045 1046 .. method:: remove_flag(flag) 1047 1048 Unset the flag(s) specified by *flag* without changing other flags. To 1049 remove more than one flag at a time, *flag* maybe a string of more than 1050 one character. 1051 1052When an :class:`mboxMessage` instance is created based upon a 1053:class:`MaildirMessage` instance, a "From " line is generated based upon the 1054:class:`MaildirMessage` instance's delivery date, and the following conversions 1055take place: 1056 1057+-----------------+-------------------------------+ 1058| Resulting state | :class:`MaildirMessage` state | 1059+=================+===============================+ 1060| R flag | S flag | 1061+-----------------+-------------------------------+ 1062| O flag | "cur" subdirectory | 1063+-----------------+-------------------------------+ 1064| D flag | T flag | 1065+-----------------+-------------------------------+ 1066| F flag | F flag | 1067+-----------------+-------------------------------+ 1068| A flag | R flag | 1069+-----------------+-------------------------------+ 1070 1071When an :class:`mboxMessage` instance is created based upon an 1072:class:`MHMessage` instance, the following conversions take place: 1073 1074+-------------------+--------------------------+ 1075| Resulting state | :class:`MHMessage` state | 1076+===================+==========================+ 1077| R flag and O flag | no "unseen" sequence | 1078+-------------------+--------------------------+ 1079| O flag | "unseen" sequence | 1080+-------------------+--------------------------+ 1081| F flag | "flagged" sequence | 1082+-------------------+--------------------------+ 1083| A flag | "replied" sequence | 1084+-------------------+--------------------------+ 1085 1086When an :class:`mboxMessage` instance is created based upon a 1087:class:`BabylMessage` instance, the following conversions take place: 1088 1089+-------------------+-----------------------------+ 1090| Resulting state | :class:`BabylMessage` state | 1091+===================+=============================+ 1092| R flag and O flag | no "unseen" label | 1093+-------------------+-----------------------------+ 1094| O flag | "unseen" label | 1095+-------------------+-----------------------------+ 1096| D flag | "deleted" label | 1097+-------------------+-----------------------------+ 1098| A flag | "answered" label | 1099+-------------------+-----------------------------+ 1100 1101When a :class:`Message` instance is created based upon an :class:`MMDFMessage` 1102instance, the "From " line is copied and all flags directly correspond: 1103 1104+-----------------+----------------------------+ 1105| Resulting state | :class:`MMDFMessage` state | 1106+=================+============================+ 1107| R flag | R flag | 1108+-----------------+----------------------------+ 1109| O flag | O flag | 1110+-----------------+----------------------------+ 1111| D flag | D flag | 1112+-----------------+----------------------------+ 1113| F flag | F flag | 1114+-----------------+----------------------------+ 1115| A flag | A flag | 1116+-----------------+----------------------------+ 1117 1118 1119.. _mailbox-mhmessage: 1120 1121:class:`MHMessage` 1122^^^^^^^^^^^^^^^^^^ 1123 1124 1125.. class:: MHMessage(message=None) 1126 1127 A message with MH-specific behaviors. Parameter *message* has the same meaning 1128 as with the :class:`Message` constructor. 1129 1130 MH messages do not support marks or flags in the traditional sense, but they 1131 do support sequences, which are logical groupings of arbitrary messages. Some 1132 mail reading programs (although not the standard :program:`mh` and 1133 :program:`nmh`) use sequences in much the same way flags are used with other 1134 formats, as follows: 1135 1136 +----------+------------------------------------------+ 1137 | Sequence | Explanation | 1138 +==========+==========================================+ 1139 | unseen | Not read, but previously detected by MUA | 1140 +----------+------------------------------------------+ 1141 | replied | Replied to | 1142 +----------+------------------------------------------+ 1143 | flagged | Marked as important | 1144 +----------+------------------------------------------+ 1145 1146 :class:`MHMessage` instances offer the following methods: 1147 1148 1149 .. method:: get_sequences() 1150 1151 Return a list of the names of sequences that include this message. 1152 1153 1154 .. method:: set_sequences(sequences) 1155 1156 Set the list of sequences that include this message. 1157 1158 1159 .. method:: add_sequence(sequence) 1160 1161 Add *sequence* to the list of sequences that include this message. 1162 1163 1164 .. method:: remove_sequence(sequence) 1165 1166 Remove *sequence* from the list of sequences that include this message. 1167 1168When an :class:`MHMessage` instance is created based upon a 1169:class:`MaildirMessage` instance, the following conversions take place: 1170 1171+--------------------+-------------------------------+ 1172| Resulting state | :class:`MaildirMessage` state | 1173+====================+===============================+ 1174| "unseen" sequence | no S flag | 1175+--------------------+-------------------------------+ 1176| "replied" sequence | R flag | 1177+--------------------+-------------------------------+ 1178| "flagged" sequence | F flag | 1179+--------------------+-------------------------------+ 1180 1181When an :class:`MHMessage` instance is created based upon an 1182:class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status` 1183and :mailheader:`X-Status` headers are omitted and the following conversions 1184take place: 1185 1186+--------------------+----------------------------------------------+ 1187| Resulting state | :class:`mboxMessage` or :class:`MMDFMessage` | 1188| | state | 1189+====================+==============================================+ 1190| "unseen" sequence | no R flag | 1191+--------------------+----------------------------------------------+ 1192| "replied" sequence | A flag | 1193+--------------------+----------------------------------------------+ 1194| "flagged" sequence | F flag | 1195+--------------------+----------------------------------------------+ 1196 1197When an :class:`MHMessage` instance is created based upon a 1198:class:`BabylMessage` instance, the following conversions take place: 1199 1200+--------------------+-----------------------------+ 1201| Resulting state | :class:`BabylMessage` state | 1202+====================+=============================+ 1203| "unseen" sequence | "unseen" label | 1204+--------------------+-----------------------------+ 1205| "replied" sequence | "answered" label | 1206+--------------------+-----------------------------+ 1207 1208 1209.. _mailbox-babylmessage: 1210 1211:class:`BabylMessage` 1212^^^^^^^^^^^^^^^^^^^^^ 1213 1214 1215.. class:: BabylMessage(message=None) 1216 1217 A message with Babyl-specific behaviors. Parameter *message* has the same 1218 meaning as with the :class:`Message` constructor. 1219 1220 Certain message labels, called :dfn:`attributes`, are defined by convention 1221 to have special meanings. The attributes are as follows: 1222 1223 +-----------+------------------------------------------+ 1224 | Label | Explanation | 1225 +===========+==========================================+ 1226 | unseen | Not read, but previously detected by MUA | 1227 +-----------+------------------------------------------+ 1228 | deleted | Marked for subsequent deletion | 1229 +-----------+------------------------------------------+ 1230 | filed | Copied to another file or mailbox | 1231 +-----------+------------------------------------------+ 1232 | answered | Replied to | 1233 +-----------+------------------------------------------+ 1234 | forwarded | Forwarded | 1235 +-----------+------------------------------------------+ 1236 | edited | Modified by the user | 1237 +-----------+------------------------------------------+ 1238 | resent | Resent | 1239 +-----------+------------------------------------------+ 1240 1241 By default, Rmail displays only visible headers. The :class:`BabylMessage` 1242 class, though, uses the original headers because they are more 1243 complete. Visible headers may be accessed explicitly if desired. 1244 1245 :class:`BabylMessage` instances offer the following methods: 1246 1247 1248 .. method:: get_labels() 1249 1250 Return a list of labels on the message. 1251 1252 1253 .. method:: set_labels(labels) 1254 1255 Set the list of labels on the message to *labels*. 1256 1257 1258 .. method:: add_label(label) 1259 1260 Add *label* to the list of labels on the message. 1261 1262 1263 .. method:: remove_label(label) 1264 1265 Remove *label* from the list of labels on the message. 1266 1267 1268 .. method:: get_visible() 1269 1270 Return an :class:`Message` instance whose headers are the message's 1271 visible headers and whose body is empty. 1272 1273 1274 .. method:: set_visible(visible) 1275 1276 Set the message's visible headers to be the same as the headers in 1277 *message*. Parameter *visible* should be a :class:`Message` instance, an 1278 :class:`email.message.Message` instance, a string, or a file-like object 1279 (which should be open in text mode). 1280 1281 1282 .. method:: update_visible() 1283 1284 When a :class:`BabylMessage` instance's original headers are modified, the 1285 visible headers are not automatically modified to correspond. This method 1286 updates the visible headers as follows: each visible header with a 1287 corresponding original header is set to the value of the original header, 1288 each visible header without a corresponding original header is removed, 1289 and any of :mailheader:`Date`, :mailheader:`From`, :mailheader:`Reply-To`, 1290 :mailheader:`To`, :mailheader:`CC`, and :mailheader:`Subject` that are 1291 present in the original headers but not the visible headers are added to 1292 the visible headers. 1293 1294When a :class:`BabylMessage` instance is created based upon a 1295:class:`MaildirMessage` instance, the following conversions take place: 1296 1297+-------------------+-------------------------------+ 1298| Resulting state | :class:`MaildirMessage` state | 1299+===================+===============================+ 1300| "unseen" label | no S flag | 1301+-------------------+-------------------------------+ 1302| "deleted" label | T flag | 1303+-------------------+-------------------------------+ 1304| "answered" label | R flag | 1305+-------------------+-------------------------------+ 1306| "forwarded" label | P flag | 1307+-------------------+-------------------------------+ 1308 1309When a :class:`BabylMessage` instance is created based upon an 1310:class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status` 1311and :mailheader:`X-Status` headers are omitted and the following conversions 1312take place: 1313 1314+------------------+----------------------------------------------+ 1315| Resulting state | :class:`mboxMessage` or :class:`MMDFMessage` | 1316| | state | 1317+==================+==============================================+ 1318| "unseen" label | no R flag | 1319+------------------+----------------------------------------------+ 1320| "deleted" label | D flag | 1321+------------------+----------------------------------------------+ 1322| "answered" label | A flag | 1323+------------------+----------------------------------------------+ 1324 1325When a :class:`BabylMessage` instance is created based upon an 1326:class:`MHMessage` instance, the following conversions take place: 1327 1328+------------------+--------------------------+ 1329| Resulting state | :class:`MHMessage` state | 1330+==================+==========================+ 1331| "unseen" label | "unseen" sequence | 1332+------------------+--------------------------+ 1333| "answered" label | "replied" sequence | 1334+------------------+--------------------------+ 1335 1336 1337.. _mailbox-mmdfmessage: 1338 1339:class:`MMDFMessage` 1340^^^^^^^^^^^^^^^^^^^^ 1341 1342 1343.. class:: MMDFMessage(message=None) 1344 1345 A message with MMDF-specific behaviors. Parameter *message* has the same meaning 1346 as with the :class:`Message` constructor. 1347 1348 As with message in an mbox mailbox, MMDF messages are stored with the 1349 sender's address and the delivery date in an initial line beginning with 1350 "From ". Likewise, flags that indicate the state of the message are 1351 typically stored in :mailheader:`Status` and :mailheader:`X-Status` headers. 1352 1353 Conventional flags for MMDF messages are identical to those of mbox message 1354 and are as follows: 1355 1356 +------+----------+--------------------------------+ 1357 | Flag | Meaning | Explanation | 1358 +======+==========+================================+ 1359 | R | Read | Read | 1360 +------+----------+--------------------------------+ 1361 | O | Old | Previously detected by MUA | 1362 +------+----------+--------------------------------+ 1363 | D | Deleted | Marked for subsequent deletion | 1364 +------+----------+--------------------------------+ 1365 | F | Flagged | Marked as important | 1366 +------+----------+--------------------------------+ 1367 | A | Answered | Replied to | 1368 +------+----------+--------------------------------+ 1369 1370 The "R" and "O" flags are stored in the :mailheader:`Status` header, and the 1371 "D", "F", and "A" flags are stored in the :mailheader:`X-Status` header. The 1372 flags and headers typically appear in the order mentioned. 1373 1374 :class:`MMDFMessage` instances offer the following methods, which are 1375 identical to those offered by :class:`mboxMessage`: 1376 1377 1378 .. method:: get_from() 1379 1380 Return a string representing the "From " line that marks the start of the 1381 message in an mbox mailbox. The leading "From " and the trailing newline 1382 are excluded. 1383 1384 1385 .. method:: set_from(from_, time_=None) 1386 1387 Set the "From " line to *from_*, which should be specified without a 1388 leading "From " or trailing newline. For convenience, *time_* may be 1389 specified and will be formatted appropriately and appended to *from_*. If 1390 *time_* is specified, it should be a :class:`time.struct_time` instance, a 1391 tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use 1392 :meth:`time.gmtime`). 1393 1394 1395 .. method:: get_flags() 1396 1397 Return a string specifying the flags that are currently set. If the 1398 message complies with the conventional format, the result is the 1399 concatenation in the following order of zero or one occurrence of each of 1400 ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``. 1401 1402 1403 .. method:: set_flags(flags) 1404 1405 Set the flags specified by *flags* and unset all others. Parameter *flags* 1406 should be the concatenation in any order of zero or more occurrences of 1407 each of ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``. 1408 1409 1410 .. method:: add_flag(flag) 1411 1412 Set the flag(s) specified by *flag* without changing other flags. To add 1413 more than one flag at a time, *flag* may be a string of more than one 1414 character. 1415 1416 1417 .. method:: remove_flag(flag) 1418 1419 Unset the flag(s) specified by *flag* without changing other flags. To 1420 remove more than one flag at a time, *flag* maybe a string of more than 1421 one character. 1422 1423When an :class:`MMDFMessage` instance is created based upon a 1424:class:`MaildirMessage` instance, a "From " line is generated based upon the 1425:class:`MaildirMessage` instance's delivery date, and the following conversions 1426take place: 1427 1428+-----------------+-------------------------------+ 1429| Resulting state | :class:`MaildirMessage` state | 1430+=================+===============================+ 1431| R flag | S flag | 1432+-----------------+-------------------------------+ 1433| O flag | "cur" subdirectory | 1434+-----------------+-------------------------------+ 1435| D flag | T flag | 1436+-----------------+-------------------------------+ 1437| F flag | F flag | 1438+-----------------+-------------------------------+ 1439| A flag | R flag | 1440+-----------------+-------------------------------+ 1441 1442When an :class:`MMDFMessage` instance is created based upon an 1443:class:`MHMessage` instance, the following conversions take place: 1444 1445+-------------------+--------------------------+ 1446| Resulting state | :class:`MHMessage` state | 1447+===================+==========================+ 1448| R flag and O flag | no "unseen" sequence | 1449+-------------------+--------------------------+ 1450| O flag | "unseen" sequence | 1451+-------------------+--------------------------+ 1452| F flag | "flagged" sequence | 1453+-------------------+--------------------------+ 1454| A flag | "replied" sequence | 1455+-------------------+--------------------------+ 1456 1457When an :class:`MMDFMessage` instance is created based upon a 1458:class:`BabylMessage` instance, the following conversions take place: 1459 1460+-------------------+-----------------------------+ 1461| Resulting state | :class:`BabylMessage` state | 1462+===================+=============================+ 1463| R flag and O flag | no "unseen" label | 1464+-------------------+-----------------------------+ 1465| O flag | "unseen" label | 1466+-------------------+-----------------------------+ 1467| D flag | "deleted" label | 1468+-------------------+-----------------------------+ 1469| A flag | "answered" label | 1470+-------------------+-----------------------------+ 1471 1472When an :class:`MMDFMessage` instance is created based upon an 1473:class:`mboxMessage` instance, the "From " line is copied and all flags directly 1474correspond: 1475 1476+-----------------+----------------------------+ 1477| Resulting state | :class:`mboxMessage` state | 1478+=================+============================+ 1479| R flag | R flag | 1480+-----------------+----------------------------+ 1481| O flag | O flag | 1482+-----------------+----------------------------+ 1483| D flag | D flag | 1484+-----------------+----------------------------+ 1485| F flag | F flag | 1486+-----------------+----------------------------+ 1487| A flag | A flag | 1488+-----------------+----------------------------+ 1489 1490 1491Exceptions 1492---------- 1493 1494The following exception classes are defined in the :mod:`mailbox` module: 1495 1496 1497.. exception:: Error() 1498 1499 The based class for all other module-specific exceptions. 1500 1501 1502.. exception:: NoSuchMailboxError() 1503 1504 Raised when a mailbox is expected but is not found, such as when instantiating a 1505 :class:`Mailbox` subclass with a path that does not exist (and with the *create* 1506 parameter set to ``False``), or when opening a folder that does not exist. 1507 1508 1509.. exception:: NotEmptyError() 1510 1511 Raised when a mailbox is not empty but is expected to be, such as when deleting 1512 a folder that contains messages. 1513 1514 1515.. exception:: ExternalClashError() 1516 1517 Raised when some mailbox-related condition beyond the control of the program 1518 causes it to be unable to proceed, such as when failing to acquire a lock that 1519 another program already holds a lock, or when a uniquely-generated file name 1520 already exists. 1521 1522 1523.. exception:: FormatError() 1524 1525 Raised when the data in a file cannot be parsed, such as when an :class:`MH` 1526 instance attempts to read a corrupted :file:`.mh_sequences` file. 1527 1528 1529.. _mailbox-examples: 1530 1531Examples 1532-------- 1533 1534A simple example of printing the subjects of all messages in a mailbox that seem 1535interesting:: 1536 1537 import mailbox 1538 for message in mailbox.mbox('~/mbox'): 1539 subject = message['subject'] # Could possibly be None. 1540 if subject and 'python' in subject.lower(): 1541 print(subject) 1542 1543To copy all mail from a Babyl mailbox to an MH mailbox, converting all of the 1544format-specific information that can be converted:: 1545 1546 import mailbox 1547 destination = mailbox.MH('~/Mail') 1548 destination.lock() 1549 for message in mailbox.Babyl('~/RMAIL'): 1550 destination.add(mailbox.MHMessage(message)) 1551 destination.flush() 1552 destination.unlock() 1553 1554This example sorts mail from several mailing lists into different mailboxes, 1555being careful to avoid mail corruption due to concurrent modification by other 1556programs, mail loss due to interruption of the program, or premature termination 1557due to malformed messages in the mailbox:: 1558 1559 import mailbox 1560 import email.errors 1561 1562 list_names = ('python-list', 'python-dev', 'python-bugs') 1563 1564 boxes = {name: mailbox.mbox('~/email/%s' % name) for name in list_names} 1565 inbox = mailbox.Maildir('~/Maildir', factory=None) 1566 1567 for key in inbox.iterkeys(): 1568 try: 1569 message = inbox[key] 1570 except email.errors.MessageParseError: 1571 continue # The message is malformed. Just leave it. 1572 1573 for name in list_names: 1574 list_id = message['list-id'] 1575 if list_id and name in list_id: 1576 # Get mailbox to use 1577 box = boxes[name] 1578 1579 # Write copy to disk before removing original. 1580 # If there's a crash, you might duplicate a message, but 1581 # that's better than losing a message completely. 1582 box.lock() 1583 box.add(message) 1584 box.flush() 1585 box.unlock() 1586 1587 # Remove original message 1588 inbox.lock() 1589 inbox.discard(key) 1590 inbox.flush() 1591 inbox.unlock() 1592 break # Found destination, so stop looking. 1593 1594 for box in boxes.itervalues(): 1595 box.close() 1596 1597