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