17db96d56Sopenharmony_ci:mod:`mailbox` --- Manipulate mailboxes in various formats
27db96d56Sopenharmony_ci==========================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: mailbox
57db96d56Sopenharmony_ci   :synopsis: Manipulate mailboxes in various formats
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. moduleauthor:: Gregory K. Johnson <gkj@gregorykjohnson.com>
87db96d56Sopenharmony_ci.. sectionauthor:: Gregory K. Johnson <gkj@gregorykjohnson.com>
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci**Source code:** :source:`Lib/mailbox.py`
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci--------------
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciThis module defines two classes, :class:`Mailbox` and :class:`Message`, for
157db96d56Sopenharmony_ciaccessing and manipulating on-disk mailboxes and the messages they contain.
167db96d56Sopenharmony_ci:class:`Mailbox` offers a dictionary-like mapping from keys to messages.
177db96d56Sopenharmony_ci:class:`Message` extends the :mod:`email.message` module's
187db96d56Sopenharmony_ci:class:`~email.message.Message` class with format-specific state and behavior.
197db96d56Sopenharmony_ciSupported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF.
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci.. seealso::
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci   Module :mod:`email`
257db96d56Sopenharmony_ci      Represent and manipulate messages.
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci.. _mailbox-objects:
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci:class:`Mailbox` objects
317db96d56Sopenharmony_ci------------------------
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci.. class:: Mailbox
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci   A mailbox, which may be inspected and modified.
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci   The :class:`Mailbox` class defines an interface and is not intended to be
387db96d56Sopenharmony_ci   instantiated.  Instead, format-specific subclasses should inherit from
397db96d56Sopenharmony_ci   :class:`Mailbox` and your code should instantiate a particular subclass.
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci   The :class:`Mailbox` interface is dictionary-like, with small keys
427db96d56Sopenharmony_ci   corresponding to messages. Keys are issued by the :class:`Mailbox` instance
437db96d56Sopenharmony_ci   with which they will be used and are only meaningful to that :class:`Mailbox`
447db96d56Sopenharmony_ci   instance. A key continues to identify a message even if the corresponding
457db96d56Sopenharmony_ci   message is modified, such as by replacing it with another message.
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci   Messages may be added to a :class:`Mailbox` instance using the set-like
487db96d56Sopenharmony_ci   method :meth:`add` and removed using a ``del`` statement or the set-like
497db96d56Sopenharmony_ci   methods :meth:`remove` and :meth:`discard`.
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci   :class:`Mailbox` interface semantics differ from dictionary semantics in some
527db96d56Sopenharmony_ci   noteworthy ways. Each time a message is requested, a new representation
537db96d56Sopenharmony_ci   (typically a :class:`Message` instance) is generated based upon the current
547db96d56Sopenharmony_ci   state of the mailbox. Similarly, when a message is added to a
557db96d56Sopenharmony_ci   :class:`Mailbox` instance, the provided message representation's contents are
567db96d56Sopenharmony_ci   copied. In neither case is a reference to the message representation kept by
577db96d56Sopenharmony_ci   the :class:`Mailbox` instance.
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci   The default :class:`Mailbox` iterator iterates over message representations,
607db96d56Sopenharmony_ci   not keys as the default dictionary iterator does. Moreover, modification of a
617db96d56Sopenharmony_ci   mailbox during iteration is safe and well-defined. Messages added to the
627db96d56Sopenharmony_ci   mailbox after an iterator is created will not be seen by the
637db96d56Sopenharmony_ci   iterator. Messages removed from the mailbox before the iterator yields them
647db96d56Sopenharmony_ci   will be silently skipped, though using a key from an iterator may result in a
657db96d56Sopenharmony_ci   :exc:`KeyError` exception if the corresponding message is subsequently
667db96d56Sopenharmony_ci   removed.
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci   .. warning::
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci      Be very cautious when modifying mailboxes that might be simultaneously
717db96d56Sopenharmony_ci      changed by some other process.  The safest mailbox format to use for such
727db96d56Sopenharmony_ci      tasks is Maildir; try to avoid using single-file formats such as mbox for
737db96d56Sopenharmony_ci      concurrent writing.  If you're modifying a mailbox, you *must* lock it by
747db96d56Sopenharmony_ci      calling the :meth:`lock` and :meth:`unlock` methods *before* reading any
757db96d56Sopenharmony_ci      messages in the file or making any changes by adding or deleting a
767db96d56Sopenharmony_ci      message.  Failing to lock the mailbox runs the risk of losing messages or
777db96d56Sopenharmony_ci      corrupting the entire mailbox.
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci   :class:`Mailbox` instances have the following methods:
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci   .. method:: add(message)
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ci      Add *message* to the mailbox and return the key that has been assigned to
857db96d56Sopenharmony_ci      it.
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci      Parameter *message* may be a :class:`Message` instance, an
887db96d56Sopenharmony_ci      :class:`email.message.Message` instance, a string, a byte string, or a
897db96d56Sopenharmony_ci      file-like object (which should be open in binary mode). If *message* is
907db96d56Sopenharmony_ci      an instance of the
917db96d56Sopenharmony_ci      appropriate format-specific :class:`Message` subclass (e.g., if it's an
927db96d56Sopenharmony_ci      :class:`mboxMessage` instance and this is an :class:`mbox` instance), its
937db96d56Sopenharmony_ci      format-specific information is used. Otherwise, reasonable defaults for
947db96d56Sopenharmony_ci      format-specific information are used.
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci      .. versionchanged:: 3.2
977db96d56Sopenharmony_ci         Support for binary input was added.
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci   .. method:: remove(key)
1017db96d56Sopenharmony_ci               __delitem__(key)
1027db96d56Sopenharmony_ci               discard(key)
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ci      Delete the message corresponding to *key* from the mailbox.
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci      If no such message exists, a :exc:`KeyError` exception is raised if the
1077db96d56Sopenharmony_ci      method was called as :meth:`remove` or :meth:`__delitem__` but no
1087db96d56Sopenharmony_ci      exception is raised if the method was called as :meth:`discard`. The
1097db96d56Sopenharmony_ci      behavior of :meth:`discard` may be preferred if the underlying mailbox
1107db96d56Sopenharmony_ci      format supports concurrent modification by other processes.
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci   .. method:: __setitem__(key, message)
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci      Replace the message corresponding to *key* with *message*. Raise a
1167db96d56Sopenharmony_ci      :exc:`KeyError` exception if no message already corresponds to *key*.
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci      As with :meth:`add`, parameter *message* may be a :class:`Message`
1197db96d56Sopenharmony_ci      instance, an :class:`email.message.Message` instance, a string, a byte
1207db96d56Sopenharmony_ci      string, or a file-like object (which should be open in binary mode). If
1217db96d56Sopenharmony_ci      *message* is an
1227db96d56Sopenharmony_ci      instance of the appropriate format-specific :class:`Message` subclass
1237db96d56Sopenharmony_ci      (e.g., if it's an :class:`mboxMessage` instance and this is an
1247db96d56Sopenharmony_ci      :class:`mbox` instance), its format-specific information is
1257db96d56Sopenharmony_ci      used. Otherwise, the format-specific information of the message that
1267db96d56Sopenharmony_ci      currently corresponds to *key* is left unchanged.
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci   .. method:: iterkeys()
1307db96d56Sopenharmony_ci               keys()
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci      Return an iterator over all keys if called as :meth:`iterkeys` or return a
1337db96d56Sopenharmony_ci      list of keys if called as :meth:`keys`.
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci   .. method:: itervalues()
1377db96d56Sopenharmony_ci               __iter__()
1387db96d56Sopenharmony_ci               values()
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci      Return an iterator over representations of all messages if called as
1417db96d56Sopenharmony_ci      :meth:`itervalues` or :meth:`__iter__` or return a list of such
1427db96d56Sopenharmony_ci      representations if called as :meth:`values`. The messages are represented
1437db96d56Sopenharmony_ci      as instances of the appropriate format-specific :class:`Message` subclass
1447db96d56Sopenharmony_ci      unless a custom message factory was specified when the :class:`Mailbox`
1457db96d56Sopenharmony_ci      instance was initialized.
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci      .. note::
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci         The behavior of :meth:`__iter__` is unlike that of dictionaries, which
1507db96d56Sopenharmony_ci         iterate over keys.
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci   .. method:: iteritems()
1547db96d56Sopenharmony_ci               items()
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci      Return an iterator over (*key*, *message*) pairs, where *key* is a key and
1577db96d56Sopenharmony_ci      *message* is a message representation, if called as :meth:`iteritems` or
1587db96d56Sopenharmony_ci      return a list of such pairs if called as :meth:`items`. The messages are
1597db96d56Sopenharmony_ci      represented as instances of the appropriate format-specific
1607db96d56Sopenharmony_ci      :class:`Message` subclass unless a custom message factory was specified
1617db96d56Sopenharmony_ci      when the :class:`Mailbox` instance was initialized.
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci   .. method:: get(key, default=None)
1657db96d56Sopenharmony_ci               __getitem__(key)
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci      Return a representation of the message corresponding to *key*. If no such
1687db96d56Sopenharmony_ci      message exists, *default* is returned if the method was called as
1697db96d56Sopenharmony_ci      :meth:`get` and a :exc:`KeyError` exception is raised if the method was
1707db96d56Sopenharmony_ci      called as :meth:`__getitem__`. The message is represented as an instance
1717db96d56Sopenharmony_ci      of the appropriate format-specific :class:`Message` subclass unless a
1727db96d56Sopenharmony_ci      custom message factory was specified when the :class:`Mailbox` instance
1737db96d56Sopenharmony_ci      was initialized.
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci   .. method:: get_message(key)
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ci      Return a representation of the message corresponding to *key* as an
1797db96d56Sopenharmony_ci      instance of the appropriate format-specific :class:`Message` subclass, or
1807db96d56Sopenharmony_ci      raise a :exc:`KeyError` exception if no such message exists.
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ci   .. method:: get_bytes(key)
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci      Return a byte representation of the message corresponding to *key*, or
1867db96d56Sopenharmony_ci      raise a :exc:`KeyError` exception if no such message exists.
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci      .. versionadded:: 3.2
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci
1917db96d56Sopenharmony_ci   .. method:: get_string(key)
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci      Return a string representation of the message corresponding to *key*, or
1947db96d56Sopenharmony_ci      raise a :exc:`KeyError` exception if no such message exists.  The
1957db96d56Sopenharmony_ci      message is processed through :class:`email.message.Message` to
1967db96d56Sopenharmony_ci      convert it to a 7bit clean representation.
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci   .. method:: get_file(key)
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci      Return a file-like representation of the message corresponding to *key*,
2027db96d56Sopenharmony_ci      or raise a :exc:`KeyError` exception if no such message exists.  The
2037db96d56Sopenharmony_ci      file-like object behaves as if open in binary mode.  This file should be
2047db96d56Sopenharmony_ci      closed once it is no longer needed.
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci      .. versionchanged:: 3.2
2077db96d56Sopenharmony_ci         The file object really is a binary file; previously it was incorrectly
2087db96d56Sopenharmony_ci         returned in text mode.  Also, the file-like object now supports the
2097db96d56Sopenharmony_ci         context management protocol: you can use a :keyword:`with` statement to
2107db96d56Sopenharmony_ci         automatically close it.
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci      .. note::
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci         Unlike other representations of messages, file-like representations are
2157db96d56Sopenharmony_ci         not necessarily independent of the :class:`Mailbox` instance that
2167db96d56Sopenharmony_ci         created them or of the underlying mailbox.  More specific documentation
2177db96d56Sopenharmony_ci         is provided by each subclass.
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci   .. method:: __contains__(key)
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci      Return ``True`` if *key* corresponds to a message, ``False`` otherwise.
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci   .. method:: __len__()
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci      Return a count of messages in the mailbox.
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci   .. method:: clear()
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci      Delete all messages from the mailbox.
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci   .. method:: pop(key, default=None)
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci      Return a representation of the message corresponding to *key* and delete
2387db96d56Sopenharmony_ci      the message. If no such message exists, return *default*. The message is
2397db96d56Sopenharmony_ci      represented as an instance of the appropriate format-specific
2407db96d56Sopenharmony_ci      :class:`Message` subclass unless a custom message factory was specified
2417db96d56Sopenharmony_ci      when the :class:`Mailbox` instance was initialized.
2427db96d56Sopenharmony_ci
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci   .. method:: popitem()
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ci      Return an arbitrary (*key*, *message*) pair, where *key* is a key and
2477db96d56Sopenharmony_ci      *message* is a message representation, and delete the corresponding
2487db96d56Sopenharmony_ci      message. If the mailbox is empty, raise a :exc:`KeyError` exception. The
2497db96d56Sopenharmony_ci      message is represented as an instance of the appropriate format-specific
2507db96d56Sopenharmony_ci      :class:`Message` subclass unless a custom message factory was specified
2517db96d56Sopenharmony_ci      when the :class:`Mailbox` instance was initialized.
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci   .. method:: update(arg)
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci      Parameter *arg* should be a *key*-to-*message* mapping or an iterable of
2577db96d56Sopenharmony_ci      (*key*, *message*) pairs. Updates the mailbox so that, for each given
2587db96d56Sopenharmony_ci      *key* and *message*, the message corresponding to *key* is set to
2597db96d56Sopenharmony_ci      *message* as if by using :meth:`__setitem__`. As with :meth:`__setitem__`,
2607db96d56Sopenharmony_ci      each *key* must already correspond to a message in the mailbox or else a
2617db96d56Sopenharmony_ci      :exc:`KeyError` exception will be raised, so in general it is incorrect
2627db96d56Sopenharmony_ci      for *arg* to be a :class:`Mailbox` instance.
2637db96d56Sopenharmony_ci
2647db96d56Sopenharmony_ci      .. note::
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci         Unlike with dictionaries, keyword arguments are not supported.
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci
2697db96d56Sopenharmony_ci   .. method:: flush()
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci      Write any pending changes to the filesystem. For some :class:`Mailbox`
2727db96d56Sopenharmony_ci      subclasses, changes are always written immediately and :meth:`flush` does
2737db96d56Sopenharmony_ci      nothing, but you should still make a habit of calling this method.
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ci   .. method:: lock()
2777db96d56Sopenharmony_ci
2787db96d56Sopenharmony_ci      Acquire an exclusive advisory lock on the mailbox so that other processes
2797db96d56Sopenharmony_ci      know not to modify it. An :exc:`ExternalClashError` is raised if the lock
2807db96d56Sopenharmony_ci      is not available. The particular locking mechanisms used depend upon the
2817db96d56Sopenharmony_ci      mailbox format.  You should *always* lock the mailbox before making any
2827db96d56Sopenharmony_ci      modifications to its contents.
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci   .. method:: unlock()
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci      Release the lock on the mailbox, if any.
2887db96d56Sopenharmony_ci
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci   .. method:: close()
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci      Flush the mailbox, unlock it if necessary, and close any open files. For
2937db96d56Sopenharmony_ci      some :class:`Mailbox` subclasses, this method does nothing.
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci.. _mailbox-maildir:
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci:class:`Maildir`
2997db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ci.. class:: Maildir(dirname, factory=None, create=True)
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci   A subclass of :class:`Mailbox` for mailboxes in Maildir format. Parameter
3057db96d56Sopenharmony_ci   *factory* is a callable object that accepts a file-like message representation
3067db96d56Sopenharmony_ci   (which behaves as if opened in binary mode) and returns a custom representation.
3077db96d56Sopenharmony_ci   If *factory* is ``None``, :class:`MaildirMessage` is used as the default message
3087db96d56Sopenharmony_ci   representation. If *create* is ``True``, the mailbox is created if it does not
3097db96d56Sopenharmony_ci   exist.
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci   If *create* is ``True`` and the *dirname* path exists, it will be treated as
3127db96d56Sopenharmony_ci   an existing maildir without attempting to verify its directory layout.
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci   It is for historical reasons that *dirname* is named as such rather than *path*.
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci   Maildir is a directory-based mailbox format invented for the qmail mail
3177db96d56Sopenharmony_ci   transfer agent and now widely supported by other programs. Messages in a
3187db96d56Sopenharmony_ci   Maildir mailbox are stored in separate files within a common directory
3197db96d56Sopenharmony_ci   structure. This design allows Maildir mailboxes to be accessed and modified
3207db96d56Sopenharmony_ci   by multiple unrelated programs without data corruption, so file locking is
3217db96d56Sopenharmony_ci   unnecessary.
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci   Maildir mailboxes contain three subdirectories, namely: :file:`tmp`,
3247db96d56Sopenharmony_ci   :file:`new`, and :file:`cur`. Messages are created momentarily in the
3257db96d56Sopenharmony_ci   :file:`tmp` subdirectory and then moved to the :file:`new` subdirectory to
3267db96d56Sopenharmony_ci   finalize delivery. A mail user agent may subsequently move the message to the
3277db96d56Sopenharmony_ci   :file:`cur` subdirectory and store information about the state of the message
3287db96d56Sopenharmony_ci   in a special "info" section appended to its file name.
3297db96d56Sopenharmony_ci
3307db96d56Sopenharmony_ci   Folders of the style introduced by the Courier mail transfer agent are also
3317db96d56Sopenharmony_ci   supported. Any subdirectory of the main mailbox is considered a folder if
3327db96d56Sopenharmony_ci   ``'.'`` is the first character in its name. Folder names are represented by
3337db96d56Sopenharmony_ci   :class:`Maildir` without the leading ``'.'``. Each folder is itself a Maildir
3347db96d56Sopenharmony_ci   mailbox but should not contain other folders. Instead, a logical nesting is
3357db96d56Sopenharmony_ci   indicated using ``'.'`` to delimit levels, e.g., "Archived.2005.07".
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ci   .. note::
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci      The Maildir specification requires the use of a colon (``':'``) in certain
3407db96d56Sopenharmony_ci      message file names. However, some operating systems do not permit this
3417db96d56Sopenharmony_ci      character in file names, If you wish to use a Maildir-like format on such
3427db96d56Sopenharmony_ci      an operating system, you should specify another character to use
3437db96d56Sopenharmony_ci      instead. The exclamation point (``'!'``) is a popular choice. For
3447db96d56Sopenharmony_ci      example::
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci         import mailbox
3477db96d56Sopenharmony_ci         mailbox.Maildir.colon = '!'
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci      The :attr:`colon` attribute may also be set on a per-instance basis.
3507db96d56Sopenharmony_ci
3517db96d56Sopenharmony_ci   :class:`Maildir` instances have all of the methods of :class:`Mailbox` in
3527db96d56Sopenharmony_ci   addition to the following:
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci   .. method:: list_folders()
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_ci      Return a list of the names of all folders.
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci   .. method:: get_folder(folder)
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci      Return a :class:`Maildir` instance representing the folder whose name is
3637db96d56Sopenharmony_ci      *folder*. A :exc:`NoSuchMailboxError` exception is raised if the folder
3647db96d56Sopenharmony_ci      does not exist.
3657db96d56Sopenharmony_ci
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci   .. method:: add_folder(folder)
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci      Create a folder whose name is *folder* and return a :class:`Maildir`
3707db96d56Sopenharmony_ci      instance representing it.
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ci   .. method:: remove_folder(folder)
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ci      Delete the folder whose name is *folder*. If the folder contains any
3767db96d56Sopenharmony_ci      messages, a :exc:`NotEmptyError` exception will be raised and the folder
3777db96d56Sopenharmony_ci      will not be deleted.
3787db96d56Sopenharmony_ci
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_ci   .. method:: clean()
3817db96d56Sopenharmony_ci
3827db96d56Sopenharmony_ci      Delete temporary files from the mailbox that have not been accessed in the
3837db96d56Sopenharmony_ci      last 36 hours. The Maildir specification says that mail-reading programs
3847db96d56Sopenharmony_ci      should do this occasionally.
3857db96d56Sopenharmony_ci
3867db96d56Sopenharmony_ci   Some :class:`Mailbox` methods implemented by :class:`Maildir` deserve special
3877db96d56Sopenharmony_ci   remarks:
3887db96d56Sopenharmony_ci
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci   .. method:: add(message)
3917db96d56Sopenharmony_ci               __setitem__(key, message)
3927db96d56Sopenharmony_ci               update(arg)
3937db96d56Sopenharmony_ci
3947db96d56Sopenharmony_ci      .. warning::
3957db96d56Sopenharmony_ci
3967db96d56Sopenharmony_ci         These methods generate unique file names based upon the current process
3977db96d56Sopenharmony_ci         ID. When using multiple threads, undetected name clashes may occur and
3987db96d56Sopenharmony_ci         cause corruption of the mailbox unless threads are coordinated to avoid
3997db96d56Sopenharmony_ci         using these methods to manipulate the same mailbox simultaneously.
4007db96d56Sopenharmony_ci
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ci   .. method:: flush()
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci      All changes to Maildir mailboxes are immediately applied, so this method
4057db96d56Sopenharmony_ci      does nothing.
4067db96d56Sopenharmony_ci
4077db96d56Sopenharmony_ci
4087db96d56Sopenharmony_ci   .. method:: lock()
4097db96d56Sopenharmony_ci               unlock()
4107db96d56Sopenharmony_ci
4117db96d56Sopenharmony_ci      Maildir mailboxes do not support (or require) locking, so these methods do
4127db96d56Sopenharmony_ci      nothing.
4137db96d56Sopenharmony_ci
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci   .. method:: close()
4167db96d56Sopenharmony_ci
4177db96d56Sopenharmony_ci      :class:`Maildir` instances do not keep any open files and the underlying
4187db96d56Sopenharmony_ci      mailboxes do not support locking, so this method does nothing.
4197db96d56Sopenharmony_ci
4207db96d56Sopenharmony_ci
4217db96d56Sopenharmony_ci   .. method:: get_file(key)
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci      Depending upon the host platform, it may not be possible to modify or
4247db96d56Sopenharmony_ci      remove the underlying message while the returned file remains open.
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ci
4277db96d56Sopenharmony_ci.. seealso::
4287db96d56Sopenharmony_ci
4297db96d56Sopenharmony_ci   `maildir man page from Courier <https://www.courier-mta.org/maildir.html>`_
4307db96d56Sopenharmony_ci      A specification of the format. Describes a common extension for
4317db96d56Sopenharmony_ci      supporting folders.
4327db96d56Sopenharmony_ci
4337db96d56Sopenharmony_ci   `Using maildir format <https://cr.yp.to/proto/maildir.html>`_
4347db96d56Sopenharmony_ci      Notes on Maildir by its inventor. Includes an updated name-creation scheme and
4357db96d56Sopenharmony_ci      details on "info" semantics.
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ci
4387db96d56Sopenharmony_ci.. _mailbox-mbox:
4397db96d56Sopenharmony_ci
4407db96d56Sopenharmony_ci:class:`mbox`
4417db96d56Sopenharmony_ci^^^^^^^^^^^^^
4427db96d56Sopenharmony_ci
4437db96d56Sopenharmony_ci
4447db96d56Sopenharmony_ci.. class:: mbox(path, factory=None, create=True)
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ci   A subclass of :class:`Mailbox` for mailboxes in mbox format. Parameter *factory*
4477db96d56Sopenharmony_ci   is a callable object that accepts a file-like message representation (which
4487db96d56Sopenharmony_ci   behaves as if opened in binary mode) and returns a custom representation. If
4497db96d56Sopenharmony_ci   *factory* is ``None``, :class:`mboxMessage` is used as the default message
4507db96d56Sopenharmony_ci   representation. If *create* is ``True``, the mailbox is created if it does not
4517db96d56Sopenharmony_ci   exist.
4527db96d56Sopenharmony_ci
4537db96d56Sopenharmony_ci   The mbox format is the classic format for storing mail on Unix systems. All
4547db96d56Sopenharmony_ci   messages in an mbox mailbox are stored in a single file with the beginning of
4557db96d56Sopenharmony_ci   each message indicated by a line whose first five characters are "From ".
4567db96d56Sopenharmony_ci
4577db96d56Sopenharmony_ci   Several variations of the mbox format exist to address perceived shortcomings in
4587db96d56Sopenharmony_ci   the original. In the interest of compatibility, :class:`mbox` implements the
4597db96d56Sopenharmony_ci   original format, which is sometimes referred to as :dfn:`mboxo`. This means that
4607db96d56Sopenharmony_ci   the :mailheader:`Content-Length` header, if present, is ignored and that any
4617db96d56Sopenharmony_ci   occurrences of "From " at the beginning of a line in a message body are
4627db96d56Sopenharmony_ci   transformed to ">From " when storing the message, although occurrences of ">From
4637db96d56Sopenharmony_ci   " are not transformed to "From " when reading the message.
4647db96d56Sopenharmony_ci
4657db96d56Sopenharmony_ci   Some :class:`Mailbox` methods implemented by :class:`mbox` deserve special
4667db96d56Sopenharmony_ci   remarks:
4677db96d56Sopenharmony_ci
4687db96d56Sopenharmony_ci
4697db96d56Sopenharmony_ci   .. method:: get_file(key)
4707db96d56Sopenharmony_ci
4717db96d56Sopenharmony_ci      Using the file after calling :meth:`flush` or :meth:`close` on the
4727db96d56Sopenharmony_ci      :class:`mbox` instance may yield unpredictable results or raise an
4737db96d56Sopenharmony_ci      exception.
4747db96d56Sopenharmony_ci
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci   .. method:: lock()
4777db96d56Sopenharmony_ci               unlock()
4787db96d56Sopenharmony_ci
4797db96d56Sopenharmony_ci      Three locking mechanisms are used---dot locking and, if available, the
4807db96d56Sopenharmony_ci      :c:func:`flock` and :c:func:`lockf` system calls.
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci
4837db96d56Sopenharmony_ci.. seealso::
4847db96d56Sopenharmony_ci
4857db96d56Sopenharmony_ci   `mbox man page from tin <http://www.tin.org/bin/man.cgi?section=5&topic=mbox>`_
4867db96d56Sopenharmony_ci      A specification of the format, with details on locking.
4877db96d56Sopenharmony_ci
4887db96d56Sopenharmony_ci   `Configuring Netscape Mail on Unix: Why The Content-Length Format is Bad <https://www.jwz.org/doc/content-length.html>`_
4897db96d56Sopenharmony_ci      An argument for using the original mbox format rather than a variation.
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci   `"mbox" is a family of several mutually incompatible mailbox formats <https://www.loc.gov/preservation/digital/formats/fdd/fdd000383.shtml>`_
4927db96d56Sopenharmony_ci      A history of mbox variations.
4937db96d56Sopenharmony_ci
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci.. _mailbox-mh:
4967db96d56Sopenharmony_ci
4977db96d56Sopenharmony_ci:class:`MH`
4987db96d56Sopenharmony_ci^^^^^^^^^^^
4997db96d56Sopenharmony_ci
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci.. class:: MH(path, factory=None, create=True)
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ci   A subclass of :class:`Mailbox` for mailboxes in MH format. Parameter *factory*
5047db96d56Sopenharmony_ci   is a callable object that accepts a file-like message representation (which
5057db96d56Sopenharmony_ci   behaves as if opened in binary mode) and returns a custom representation. If
5067db96d56Sopenharmony_ci   *factory* is ``None``, :class:`MHMessage` is used as the default message
5077db96d56Sopenharmony_ci   representation. If *create* is ``True``, the mailbox is created if it does not
5087db96d56Sopenharmony_ci   exist.
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_ci   MH is a directory-based mailbox format invented for the MH Message Handling
5117db96d56Sopenharmony_ci   System, a mail user agent. Each message in an MH mailbox resides in its own
5127db96d56Sopenharmony_ci   file. An MH mailbox may contain other MH mailboxes (called :dfn:`folders`) in
5137db96d56Sopenharmony_ci   addition to messages. Folders may be nested indefinitely. MH mailboxes also
5147db96d56Sopenharmony_ci   support :dfn:`sequences`, which are named lists used to logically group
5157db96d56Sopenharmony_ci   messages without moving them to sub-folders. Sequences are defined in a file
5167db96d56Sopenharmony_ci   called :file:`.mh_sequences` in each folder.
5177db96d56Sopenharmony_ci
5187db96d56Sopenharmony_ci   The :class:`MH` class manipulates MH mailboxes, but it does not attempt to
5197db96d56Sopenharmony_ci   emulate all of :program:`mh`'s behaviors. In particular, it does not modify
5207db96d56Sopenharmony_ci   and is not affected by the :file:`context` or :file:`.mh_profile` files that
5217db96d56Sopenharmony_ci   are used by :program:`mh` to store its state and configuration.
5227db96d56Sopenharmony_ci
5237db96d56Sopenharmony_ci   :class:`MH` instances have all of the methods of :class:`Mailbox` in addition
5247db96d56Sopenharmony_ci   to the following:
5257db96d56Sopenharmony_ci
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_ci   .. method:: list_folders()
5287db96d56Sopenharmony_ci
5297db96d56Sopenharmony_ci      Return a list of the names of all folders.
5307db96d56Sopenharmony_ci
5317db96d56Sopenharmony_ci
5327db96d56Sopenharmony_ci   .. method:: get_folder(folder)
5337db96d56Sopenharmony_ci
5347db96d56Sopenharmony_ci      Return an :class:`MH` instance representing the folder whose name is
5357db96d56Sopenharmony_ci      *folder*. A :exc:`NoSuchMailboxError` exception is raised if the folder
5367db96d56Sopenharmony_ci      does not exist.
5377db96d56Sopenharmony_ci
5387db96d56Sopenharmony_ci
5397db96d56Sopenharmony_ci   .. method:: add_folder(folder)
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ci      Create a folder whose name is *folder* and return an :class:`MH` instance
5427db96d56Sopenharmony_ci      representing it.
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ci
5457db96d56Sopenharmony_ci   .. method:: remove_folder(folder)
5467db96d56Sopenharmony_ci
5477db96d56Sopenharmony_ci      Delete the folder whose name is *folder*. If the folder contains any
5487db96d56Sopenharmony_ci      messages, a :exc:`NotEmptyError` exception will be raised and the folder
5497db96d56Sopenharmony_ci      will not be deleted.
5507db96d56Sopenharmony_ci
5517db96d56Sopenharmony_ci
5527db96d56Sopenharmony_ci   .. method:: get_sequences()
5537db96d56Sopenharmony_ci
5547db96d56Sopenharmony_ci      Return a dictionary of sequence names mapped to key lists. If there are no
5557db96d56Sopenharmony_ci      sequences, the empty dictionary is returned.
5567db96d56Sopenharmony_ci
5577db96d56Sopenharmony_ci
5587db96d56Sopenharmony_ci   .. method:: set_sequences(sequences)
5597db96d56Sopenharmony_ci
5607db96d56Sopenharmony_ci      Re-define the sequences that exist in the mailbox based upon *sequences*,
5617db96d56Sopenharmony_ci      a dictionary of names mapped to key lists, like returned by
5627db96d56Sopenharmony_ci      :meth:`get_sequences`.
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci
5657db96d56Sopenharmony_ci   .. method:: pack()
5667db96d56Sopenharmony_ci
5677db96d56Sopenharmony_ci      Rename messages in the mailbox as necessary to eliminate gaps in
5687db96d56Sopenharmony_ci      numbering.  Entries in the sequences list are updated correspondingly.
5697db96d56Sopenharmony_ci
5707db96d56Sopenharmony_ci      .. note::
5717db96d56Sopenharmony_ci
5727db96d56Sopenharmony_ci         Already-issued keys are invalidated by this operation and should not be
5737db96d56Sopenharmony_ci         subsequently used.
5747db96d56Sopenharmony_ci
5757db96d56Sopenharmony_ci   Some :class:`Mailbox` methods implemented by :class:`MH` deserve special
5767db96d56Sopenharmony_ci   remarks:
5777db96d56Sopenharmony_ci
5787db96d56Sopenharmony_ci
5797db96d56Sopenharmony_ci   .. method:: remove(key)
5807db96d56Sopenharmony_ci               __delitem__(key)
5817db96d56Sopenharmony_ci               discard(key)
5827db96d56Sopenharmony_ci
5837db96d56Sopenharmony_ci      These methods immediately delete the message. The MH convention of marking
5847db96d56Sopenharmony_ci      a message for deletion by prepending a comma to its name is not used.
5857db96d56Sopenharmony_ci
5867db96d56Sopenharmony_ci
5877db96d56Sopenharmony_ci   .. method:: lock()
5887db96d56Sopenharmony_ci               unlock()
5897db96d56Sopenharmony_ci
5907db96d56Sopenharmony_ci      Three locking mechanisms are used---dot locking and, if available, the
5917db96d56Sopenharmony_ci      :c:func:`flock` and :c:func:`lockf` system calls. For MH mailboxes, locking
5927db96d56Sopenharmony_ci      the mailbox means locking the :file:`.mh_sequences` file and, only for the
5937db96d56Sopenharmony_ci      duration of any operations that affect them, locking individual message
5947db96d56Sopenharmony_ci      files.
5957db96d56Sopenharmony_ci
5967db96d56Sopenharmony_ci
5977db96d56Sopenharmony_ci   .. method:: get_file(key)
5987db96d56Sopenharmony_ci
5997db96d56Sopenharmony_ci      Depending upon the host platform, it may not be possible to remove the
6007db96d56Sopenharmony_ci      underlying message while the returned file remains open.
6017db96d56Sopenharmony_ci
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci   .. method:: flush()
6047db96d56Sopenharmony_ci
6057db96d56Sopenharmony_ci      All changes to MH mailboxes are immediately applied, so this method does
6067db96d56Sopenharmony_ci      nothing.
6077db96d56Sopenharmony_ci
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci   .. method:: close()
6107db96d56Sopenharmony_ci
6117db96d56Sopenharmony_ci      :class:`MH` instances do not keep any open files, so this method is
6127db96d56Sopenharmony_ci      equivalent to :meth:`unlock`.
6137db96d56Sopenharmony_ci
6147db96d56Sopenharmony_ci
6157db96d56Sopenharmony_ci.. seealso::
6167db96d56Sopenharmony_ci
6177db96d56Sopenharmony_ci   `nmh - Message Handling System <https://www.nongnu.org/nmh/>`_
6187db96d56Sopenharmony_ci      Home page of :program:`nmh`, an updated version of the original :program:`mh`.
6197db96d56Sopenharmony_ci
6207db96d56Sopenharmony_ci   `MH & nmh: Email for Users & Programmers <https://rand-mh.sourceforge.io/book/>`_
6217db96d56Sopenharmony_ci      A GPL-licensed book on :program:`mh` and :program:`nmh`, with some information
6227db96d56Sopenharmony_ci      on the mailbox format.
6237db96d56Sopenharmony_ci
6247db96d56Sopenharmony_ci
6257db96d56Sopenharmony_ci.. _mailbox-babyl:
6267db96d56Sopenharmony_ci
6277db96d56Sopenharmony_ci:class:`Babyl`
6287db96d56Sopenharmony_ci^^^^^^^^^^^^^^
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ci
6317db96d56Sopenharmony_ci.. class:: Babyl(path, factory=None, create=True)
6327db96d56Sopenharmony_ci
6337db96d56Sopenharmony_ci   A subclass of :class:`Mailbox` for mailboxes in Babyl format. Parameter
6347db96d56Sopenharmony_ci   *factory* is a callable object that accepts a file-like message representation
6357db96d56Sopenharmony_ci   (which behaves as if opened in binary mode) and returns a custom representation.
6367db96d56Sopenharmony_ci   If *factory* is ``None``, :class:`BabylMessage` is used as the default message
6377db96d56Sopenharmony_ci   representation. If *create* is ``True``, the mailbox is created if it does not
6387db96d56Sopenharmony_ci   exist.
6397db96d56Sopenharmony_ci
6407db96d56Sopenharmony_ci   Babyl is a single-file mailbox format used by the Rmail mail user agent
6417db96d56Sopenharmony_ci   included with Emacs. The beginning of a message is indicated by a line
6427db96d56Sopenharmony_ci   containing the two characters Control-Underscore (``'\037'``) and Control-L
6437db96d56Sopenharmony_ci   (``'\014'``). The end of a message is indicated by the start of the next
6447db96d56Sopenharmony_ci   message or, in the case of the last message, a line containing a
6457db96d56Sopenharmony_ci   Control-Underscore (``'\037'``) character.
6467db96d56Sopenharmony_ci
6477db96d56Sopenharmony_ci   Messages in a Babyl mailbox have two sets of headers, original headers and
6487db96d56Sopenharmony_ci   so-called visible headers. Visible headers are typically a subset of the
6497db96d56Sopenharmony_ci   original headers that have been reformatted or abridged to be more
6507db96d56Sopenharmony_ci   attractive. Each message in a Babyl mailbox also has an accompanying list of
6517db96d56Sopenharmony_ci   :dfn:`labels`, or short strings that record extra information about the
6527db96d56Sopenharmony_ci   message, and a list of all user-defined labels found in the mailbox is kept
6537db96d56Sopenharmony_ci   in the Babyl options section.
6547db96d56Sopenharmony_ci
6557db96d56Sopenharmony_ci   :class:`Babyl` instances have all of the methods of :class:`Mailbox` in
6567db96d56Sopenharmony_ci   addition to the following:
6577db96d56Sopenharmony_ci
6587db96d56Sopenharmony_ci
6597db96d56Sopenharmony_ci   .. method:: get_labels()
6607db96d56Sopenharmony_ci
6617db96d56Sopenharmony_ci      Return a list of the names of all user-defined labels used in the mailbox.
6627db96d56Sopenharmony_ci
6637db96d56Sopenharmony_ci      .. note::
6647db96d56Sopenharmony_ci
6657db96d56Sopenharmony_ci         The actual messages are inspected to determine which labels exist in
6667db96d56Sopenharmony_ci         the mailbox rather than consulting the list of labels in the Babyl
6677db96d56Sopenharmony_ci         options section, but the Babyl section is updated whenever the mailbox
6687db96d56Sopenharmony_ci         is modified.
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci   Some :class:`Mailbox` methods implemented by :class:`Babyl` deserve special
6717db96d56Sopenharmony_ci   remarks:
6727db96d56Sopenharmony_ci
6737db96d56Sopenharmony_ci
6747db96d56Sopenharmony_ci   .. method:: get_file(key)
6757db96d56Sopenharmony_ci
6767db96d56Sopenharmony_ci      In Babyl mailboxes, the headers of a message are not stored contiguously
6777db96d56Sopenharmony_ci      with the body of the message. To generate a file-like representation, the
6787db96d56Sopenharmony_ci      headers and body are copied together into an :class:`io.BytesIO` instance,
6797db96d56Sopenharmony_ci      which has an API identical to that of a
6807db96d56Sopenharmony_ci      file. As a result, the file-like object is truly independent of the
6817db96d56Sopenharmony_ci      underlying mailbox but does not save memory compared to a string
6827db96d56Sopenharmony_ci      representation.
6837db96d56Sopenharmony_ci
6847db96d56Sopenharmony_ci
6857db96d56Sopenharmony_ci   .. method:: lock()
6867db96d56Sopenharmony_ci               unlock()
6877db96d56Sopenharmony_ci
6887db96d56Sopenharmony_ci      Three locking mechanisms are used---dot locking and, if available, the
6897db96d56Sopenharmony_ci      :c:func:`flock` and :c:func:`lockf` system calls.
6907db96d56Sopenharmony_ci
6917db96d56Sopenharmony_ci
6927db96d56Sopenharmony_ci.. seealso::
6937db96d56Sopenharmony_ci
6947db96d56Sopenharmony_ci   `Format of Version 5 Babyl Files <https://quimby.gnus.org/notes/BABYL>`_
6957db96d56Sopenharmony_ci      A specification of the Babyl format.
6967db96d56Sopenharmony_ci
6977db96d56Sopenharmony_ci   `Reading Mail with Rmail <https://www.gnu.org/software/emacs/manual/html_node/emacs/Rmail.html>`_
6987db96d56Sopenharmony_ci      The Rmail manual, with some information on Babyl semantics.
6997db96d56Sopenharmony_ci
7007db96d56Sopenharmony_ci
7017db96d56Sopenharmony_ci.. _mailbox-mmdf:
7027db96d56Sopenharmony_ci
7037db96d56Sopenharmony_ci:class:`MMDF`
7047db96d56Sopenharmony_ci^^^^^^^^^^^^^
7057db96d56Sopenharmony_ci
7067db96d56Sopenharmony_ci
7077db96d56Sopenharmony_ci.. class:: MMDF(path, factory=None, create=True)
7087db96d56Sopenharmony_ci
7097db96d56Sopenharmony_ci   A subclass of :class:`Mailbox` for mailboxes in MMDF format. Parameter *factory*
7107db96d56Sopenharmony_ci   is a callable object that accepts a file-like message representation (which
7117db96d56Sopenharmony_ci   behaves as if opened in binary mode) and returns a custom representation. If
7127db96d56Sopenharmony_ci   *factory* is ``None``, :class:`MMDFMessage` is used as the default message
7137db96d56Sopenharmony_ci   representation. If *create* is ``True``, the mailbox is created if it does not
7147db96d56Sopenharmony_ci   exist.
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_ci   MMDF is a single-file mailbox format invented for the Multichannel Memorandum
7177db96d56Sopenharmony_ci   Distribution Facility, a mail transfer agent. Each message is in the same
7187db96d56Sopenharmony_ci   form as an mbox message but is bracketed before and after by lines containing
7197db96d56Sopenharmony_ci   four Control-A (``'\001'``) characters. As with the mbox format, the
7207db96d56Sopenharmony_ci   beginning of each message is indicated by a line whose first five characters
7217db96d56Sopenharmony_ci   are "From ", but additional occurrences of "From " are not transformed to
7227db96d56Sopenharmony_ci   ">From " when storing messages because the extra message separator lines
7237db96d56Sopenharmony_ci   prevent mistaking such occurrences for the starts of subsequent messages.
7247db96d56Sopenharmony_ci
7257db96d56Sopenharmony_ci   Some :class:`Mailbox` methods implemented by :class:`MMDF` deserve special
7267db96d56Sopenharmony_ci   remarks:
7277db96d56Sopenharmony_ci
7287db96d56Sopenharmony_ci
7297db96d56Sopenharmony_ci   .. method:: get_file(key)
7307db96d56Sopenharmony_ci
7317db96d56Sopenharmony_ci      Using the file after calling :meth:`flush` or :meth:`close` on the
7327db96d56Sopenharmony_ci      :class:`MMDF` instance may yield unpredictable results or raise an
7337db96d56Sopenharmony_ci      exception.
7347db96d56Sopenharmony_ci
7357db96d56Sopenharmony_ci
7367db96d56Sopenharmony_ci   .. method:: lock()
7377db96d56Sopenharmony_ci               unlock()
7387db96d56Sopenharmony_ci
7397db96d56Sopenharmony_ci      Three locking mechanisms are used---dot locking and, if available, the
7407db96d56Sopenharmony_ci      :c:func:`flock` and :c:func:`lockf` system calls.
7417db96d56Sopenharmony_ci
7427db96d56Sopenharmony_ci
7437db96d56Sopenharmony_ci.. seealso::
7447db96d56Sopenharmony_ci
7457db96d56Sopenharmony_ci   `mmdf man page from tin <http://www.tin.org/bin/man.cgi?section=5&topic=mmdf>`_
7467db96d56Sopenharmony_ci      A specification of MMDF format from the documentation of tin, a newsreader.
7477db96d56Sopenharmony_ci
7487db96d56Sopenharmony_ci   `MMDF <https://en.wikipedia.org/wiki/MMDF>`_
7497db96d56Sopenharmony_ci      A Wikipedia article describing the Multichannel Memorandum Distribution
7507db96d56Sopenharmony_ci      Facility.
7517db96d56Sopenharmony_ci
7527db96d56Sopenharmony_ci
7537db96d56Sopenharmony_ci.. _mailbox-message-objects:
7547db96d56Sopenharmony_ci
7557db96d56Sopenharmony_ci:class:`Message` objects
7567db96d56Sopenharmony_ci------------------------
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_ci
7597db96d56Sopenharmony_ci.. class:: Message(message=None)
7607db96d56Sopenharmony_ci
7617db96d56Sopenharmony_ci   A subclass of the :mod:`email.message` module's
7627db96d56Sopenharmony_ci   :class:`~email.message.Message`. Subclasses of :class:`mailbox.Message` add
7637db96d56Sopenharmony_ci   mailbox-format-specific state and behavior.
7647db96d56Sopenharmony_ci
7657db96d56Sopenharmony_ci   If *message* is omitted, the new instance is created in a default, empty state.
7667db96d56Sopenharmony_ci   If *message* is an :class:`email.message.Message` instance, its contents are
7677db96d56Sopenharmony_ci   copied; furthermore, any format-specific information is converted insofar as
7687db96d56Sopenharmony_ci   possible if *message* is a :class:`Message` instance. If *message* is a string,
7697db96d56Sopenharmony_ci   a byte string,
7707db96d56Sopenharmony_ci   or a file, it should contain an :rfc:`2822`\ -compliant message, which is read
7717db96d56Sopenharmony_ci   and parsed.  Files should be open in binary mode, but text mode files
7727db96d56Sopenharmony_ci   are accepted for backward compatibility.
7737db96d56Sopenharmony_ci
7747db96d56Sopenharmony_ci   The format-specific state and behaviors offered by subclasses vary, but in
7757db96d56Sopenharmony_ci   general it is only the properties that are not specific to a particular
7767db96d56Sopenharmony_ci   mailbox that are supported (although presumably the properties are specific
7777db96d56Sopenharmony_ci   to a particular mailbox format). For example, file offsets for single-file
7787db96d56Sopenharmony_ci   mailbox formats and file names for directory-based mailbox formats are not
7797db96d56Sopenharmony_ci   retained, because they are only applicable to the original mailbox. But state
7807db96d56Sopenharmony_ci   such as whether a message has been read by the user or marked as important is
7817db96d56Sopenharmony_ci   retained, because it applies to the message itself.
7827db96d56Sopenharmony_ci
7837db96d56Sopenharmony_ci   There is no requirement that :class:`Message` instances be used to represent
7847db96d56Sopenharmony_ci   messages retrieved using :class:`Mailbox` instances. In some situations, the
7857db96d56Sopenharmony_ci   time and memory required to generate :class:`Message` representations might
7867db96d56Sopenharmony_ci   not be acceptable. For such situations, :class:`Mailbox` instances also
7877db96d56Sopenharmony_ci   offer string and file-like representations, and a custom message factory may
7887db96d56Sopenharmony_ci   be specified when a :class:`Mailbox` instance is initialized.
7897db96d56Sopenharmony_ci
7907db96d56Sopenharmony_ci
7917db96d56Sopenharmony_ci.. _mailbox-maildirmessage:
7927db96d56Sopenharmony_ci
7937db96d56Sopenharmony_ci:class:`MaildirMessage`
7947db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^
7957db96d56Sopenharmony_ci
7967db96d56Sopenharmony_ci
7977db96d56Sopenharmony_ci.. class:: MaildirMessage(message=None)
7987db96d56Sopenharmony_ci
7997db96d56Sopenharmony_ci   A message with Maildir-specific behaviors. Parameter *message* has the same
8007db96d56Sopenharmony_ci   meaning as with the :class:`Message` constructor.
8017db96d56Sopenharmony_ci
8027db96d56Sopenharmony_ci   Typically, a mail user agent application moves all of the messages in the
8037db96d56Sopenharmony_ci   :file:`new` subdirectory to the :file:`cur` subdirectory after the first time
8047db96d56Sopenharmony_ci   the user opens and closes the mailbox, recording that the messages are old
8057db96d56Sopenharmony_ci   whether or not they've actually been read. Each message in :file:`cur` has an
8067db96d56Sopenharmony_ci   "info" section added to its file name to store information about its state.
8077db96d56Sopenharmony_ci   (Some mail readers may also add an "info" section to messages in
8087db96d56Sopenharmony_ci   :file:`new`.)  The "info" section may take one of two forms: it may contain
8097db96d56Sopenharmony_ci   "2," followed by a list of standardized flags (e.g., "2,FR") or it may
8107db96d56Sopenharmony_ci   contain "1," followed by so-called experimental information. Standard flags
8117db96d56Sopenharmony_ci   for Maildir messages are as follows:
8127db96d56Sopenharmony_ci
8137db96d56Sopenharmony_ci   +------+---------+--------------------------------+
8147db96d56Sopenharmony_ci   | Flag | Meaning | Explanation                    |
8157db96d56Sopenharmony_ci   +======+=========+================================+
8167db96d56Sopenharmony_ci   | D    | Draft   | Under composition              |
8177db96d56Sopenharmony_ci   +------+---------+--------------------------------+
8187db96d56Sopenharmony_ci   | F    | Flagged | Marked as important            |
8197db96d56Sopenharmony_ci   +------+---------+--------------------------------+
8207db96d56Sopenharmony_ci   | P    | Passed  | Forwarded, resent, or bounced  |
8217db96d56Sopenharmony_ci   +------+---------+--------------------------------+
8227db96d56Sopenharmony_ci   | R    | Replied | Replied to                     |
8237db96d56Sopenharmony_ci   +------+---------+--------------------------------+
8247db96d56Sopenharmony_ci   | S    | Seen    | Read                           |
8257db96d56Sopenharmony_ci   +------+---------+--------------------------------+
8267db96d56Sopenharmony_ci   | T    | Trashed | Marked for subsequent deletion |
8277db96d56Sopenharmony_ci   +------+---------+--------------------------------+
8287db96d56Sopenharmony_ci
8297db96d56Sopenharmony_ci   :class:`MaildirMessage` instances offer the following methods:
8307db96d56Sopenharmony_ci
8317db96d56Sopenharmony_ci
8327db96d56Sopenharmony_ci   .. method:: get_subdir()
8337db96d56Sopenharmony_ci
8347db96d56Sopenharmony_ci      Return either "new" (if the message should be stored in the :file:`new`
8357db96d56Sopenharmony_ci      subdirectory) or "cur" (if the message should be stored in the :file:`cur`
8367db96d56Sopenharmony_ci      subdirectory).
8377db96d56Sopenharmony_ci
8387db96d56Sopenharmony_ci      .. note::
8397db96d56Sopenharmony_ci
8407db96d56Sopenharmony_ci         A message is typically moved from :file:`new` to :file:`cur` after its
8417db96d56Sopenharmony_ci         mailbox has been accessed, whether or not the message is has been
8427db96d56Sopenharmony_ci         read. A message ``msg`` has been read if ``"S" in msg.get_flags()`` is
8437db96d56Sopenharmony_ci         ``True``.
8447db96d56Sopenharmony_ci
8457db96d56Sopenharmony_ci
8467db96d56Sopenharmony_ci   .. method:: set_subdir(subdir)
8477db96d56Sopenharmony_ci
8487db96d56Sopenharmony_ci      Set the subdirectory the message should be stored in. Parameter *subdir*
8497db96d56Sopenharmony_ci      must be either "new" or "cur".
8507db96d56Sopenharmony_ci
8517db96d56Sopenharmony_ci
8527db96d56Sopenharmony_ci   .. method:: get_flags()
8537db96d56Sopenharmony_ci
8547db96d56Sopenharmony_ci      Return a string specifying the flags that are currently set. If the
8557db96d56Sopenharmony_ci      message complies with the standard Maildir format, the result is the
8567db96d56Sopenharmony_ci      concatenation in alphabetical order of zero or one occurrence of each of
8577db96d56Sopenharmony_ci      ``'D'``, ``'F'``, ``'P'``, ``'R'``, ``'S'``, and ``'T'``. The empty string
8587db96d56Sopenharmony_ci      is returned if no flags are set or if "info" contains experimental
8597db96d56Sopenharmony_ci      semantics.
8607db96d56Sopenharmony_ci
8617db96d56Sopenharmony_ci
8627db96d56Sopenharmony_ci   .. method:: set_flags(flags)
8637db96d56Sopenharmony_ci
8647db96d56Sopenharmony_ci      Set the flags specified by *flags* and unset all others.
8657db96d56Sopenharmony_ci
8667db96d56Sopenharmony_ci
8677db96d56Sopenharmony_ci   .. method:: add_flag(flag)
8687db96d56Sopenharmony_ci
8697db96d56Sopenharmony_ci      Set the flag(s) specified by *flag* without changing other flags. To add
8707db96d56Sopenharmony_ci      more than one flag at a time, *flag* may be a string of more than one
8717db96d56Sopenharmony_ci      character. The current "info" is overwritten whether or not it contains
8727db96d56Sopenharmony_ci      experimental information rather than flags.
8737db96d56Sopenharmony_ci
8747db96d56Sopenharmony_ci
8757db96d56Sopenharmony_ci   .. method:: remove_flag(flag)
8767db96d56Sopenharmony_ci
8777db96d56Sopenharmony_ci      Unset the flag(s) specified by *flag* without changing other flags. To
8787db96d56Sopenharmony_ci      remove more than one flag at a time, *flag* maybe a string of more than
8797db96d56Sopenharmony_ci      one character.  If "info" contains experimental information rather than
8807db96d56Sopenharmony_ci      flags, the current "info" is not modified.
8817db96d56Sopenharmony_ci
8827db96d56Sopenharmony_ci
8837db96d56Sopenharmony_ci   .. method:: get_date()
8847db96d56Sopenharmony_ci
8857db96d56Sopenharmony_ci      Return the delivery date of the message as a floating-point number
8867db96d56Sopenharmony_ci      representing seconds since the epoch.
8877db96d56Sopenharmony_ci
8887db96d56Sopenharmony_ci
8897db96d56Sopenharmony_ci   .. method:: set_date(date)
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_ci      Set the delivery date of the message to *date*, a floating-point number
8927db96d56Sopenharmony_ci      representing seconds since the epoch.
8937db96d56Sopenharmony_ci
8947db96d56Sopenharmony_ci
8957db96d56Sopenharmony_ci   .. method:: get_info()
8967db96d56Sopenharmony_ci
8977db96d56Sopenharmony_ci      Return a string containing the "info" for a message. This is useful for
8987db96d56Sopenharmony_ci      accessing and modifying "info" that is experimental (i.e., not a list of
8997db96d56Sopenharmony_ci      flags).
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_ci
9027db96d56Sopenharmony_ci   .. method:: set_info(info)
9037db96d56Sopenharmony_ci
9047db96d56Sopenharmony_ci      Set "info" to *info*, which should be a string.
9057db96d56Sopenharmony_ci
9067db96d56Sopenharmony_ciWhen a :class:`MaildirMessage` instance is created based upon an
9077db96d56Sopenharmony_ci:class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status`
9087db96d56Sopenharmony_ciand :mailheader:`X-Status` headers are omitted and the following conversions
9097db96d56Sopenharmony_citake place:
9107db96d56Sopenharmony_ci
9117db96d56Sopenharmony_ci+--------------------+----------------------------------------------+
9127db96d56Sopenharmony_ci| Resulting state    | :class:`mboxMessage` or :class:`MMDFMessage` |
9137db96d56Sopenharmony_ci|                    | state                                        |
9147db96d56Sopenharmony_ci+====================+==============================================+
9157db96d56Sopenharmony_ci| "cur" subdirectory | O flag                                       |
9167db96d56Sopenharmony_ci+--------------------+----------------------------------------------+
9177db96d56Sopenharmony_ci| F flag             | F flag                                       |
9187db96d56Sopenharmony_ci+--------------------+----------------------------------------------+
9197db96d56Sopenharmony_ci| R flag             | A flag                                       |
9207db96d56Sopenharmony_ci+--------------------+----------------------------------------------+
9217db96d56Sopenharmony_ci| S flag             | R flag                                       |
9227db96d56Sopenharmony_ci+--------------------+----------------------------------------------+
9237db96d56Sopenharmony_ci| T flag             | D flag                                       |
9247db96d56Sopenharmony_ci+--------------------+----------------------------------------------+
9257db96d56Sopenharmony_ci
9267db96d56Sopenharmony_ciWhen a :class:`MaildirMessage` instance is created based upon an
9277db96d56Sopenharmony_ci:class:`MHMessage` instance, the following conversions take place:
9287db96d56Sopenharmony_ci
9297db96d56Sopenharmony_ci+-------------------------------+--------------------------+
9307db96d56Sopenharmony_ci| Resulting state               | :class:`MHMessage` state |
9317db96d56Sopenharmony_ci+===============================+==========================+
9327db96d56Sopenharmony_ci| "cur" subdirectory            | "unseen" sequence        |
9337db96d56Sopenharmony_ci+-------------------------------+--------------------------+
9347db96d56Sopenharmony_ci| "cur" subdirectory and S flag | no "unseen" sequence     |
9357db96d56Sopenharmony_ci+-------------------------------+--------------------------+
9367db96d56Sopenharmony_ci| F flag                        | "flagged" sequence       |
9377db96d56Sopenharmony_ci+-------------------------------+--------------------------+
9387db96d56Sopenharmony_ci| R flag                        | "replied" sequence       |
9397db96d56Sopenharmony_ci+-------------------------------+--------------------------+
9407db96d56Sopenharmony_ci
9417db96d56Sopenharmony_ciWhen a :class:`MaildirMessage` instance is created based upon a
9427db96d56Sopenharmony_ci:class:`BabylMessage` instance, the following conversions take place:
9437db96d56Sopenharmony_ci
9447db96d56Sopenharmony_ci+-------------------------------+-------------------------------+
9457db96d56Sopenharmony_ci| Resulting state               | :class:`BabylMessage` state   |
9467db96d56Sopenharmony_ci+===============================+===============================+
9477db96d56Sopenharmony_ci| "cur" subdirectory            | "unseen" label                |
9487db96d56Sopenharmony_ci+-------------------------------+-------------------------------+
9497db96d56Sopenharmony_ci| "cur" subdirectory and S flag | no "unseen" label             |
9507db96d56Sopenharmony_ci+-------------------------------+-------------------------------+
9517db96d56Sopenharmony_ci| P flag                        | "forwarded" or "resent" label |
9527db96d56Sopenharmony_ci+-------------------------------+-------------------------------+
9537db96d56Sopenharmony_ci| R flag                        | "answered" label              |
9547db96d56Sopenharmony_ci+-------------------------------+-------------------------------+
9557db96d56Sopenharmony_ci| T flag                        | "deleted" label               |
9567db96d56Sopenharmony_ci+-------------------------------+-------------------------------+
9577db96d56Sopenharmony_ci
9587db96d56Sopenharmony_ci
9597db96d56Sopenharmony_ci.. _mailbox-mboxmessage:
9607db96d56Sopenharmony_ci
9617db96d56Sopenharmony_ci:class:`mboxMessage`
9627db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^
9637db96d56Sopenharmony_ci
9647db96d56Sopenharmony_ci
9657db96d56Sopenharmony_ci.. class:: mboxMessage(message=None)
9667db96d56Sopenharmony_ci
9677db96d56Sopenharmony_ci   A message with mbox-specific behaviors. Parameter *message* has the same meaning
9687db96d56Sopenharmony_ci   as with the :class:`Message` constructor.
9697db96d56Sopenharmony_ci
9707db96d56Sopenharmony_ci   Messages in an mbox mailbox are stored together in a single file. The
9717db96d56Sopenharmony_ci   sender's envelope address and the time of delivery are typically stored in a
9727db96d56Sopenharmony_ci   line beginning with "From " that is used to indicate the start of a message,
9737db96d56Sopenharmony_ci   though there is considerable variation in the exact format of this data among
9747db96d56Sopenharmony_ci   mbox implementations. Flags that indicate the state of the message, such as
9757db96d56Sopenharmony_ci   whether it has been read or marked as important, are typically stored in
9767db96d56Sopenharmony_ci   :mailheader:`Status` and :mailheader:`X-Status` headers.
9777db96d56Sopenharmony_ci
9787db96d56Sopenharmony_ci   Conventional flags for mbox messages are as follows:
9797db96d56Sopenharmony_ci
9807db96d56Sopenharmony_ci   +------+----------+--------------------------------+
9817db96d56Sopenharmony_ci   | Flag | Meaning  | Explanation                    |
9827db96d56Sopenharmony_ci   +======+==========+================================+
9837db96d56Sopenharmony_ci   | R    | Read     | Read                           |
9847db96d56Sopenharmony_ci   +------+----------+--------------------------------+
9857db96d56Sopenharmony_ci   | O    | Old      | Previously detected by MUA     |
9867db96d56Sopenharmony_ci   +------+----------+--------------------------------+
9877db96d56Sopenharmony_ci   | D    | Deleted  | Marked for subsequent deletion |
9887db96d56Sopenharmony_ci   +------+----------+--------------------------------+
9897db96d56Sopenharmony_ci   | F    | Flagged  | Marked as important            |
9907db96d56Sopenharmony_ci   +------+----------+--------------------------------+
9917db96d56Sopenharmony_ci   | A    | Answered | Replied to                     |
9927db96d56Sopenharmony_ci   +------+----------+--------------------------------+
9937db96d56Sopenharmony_ci
9947db96d56Sopenharmony_ci   The "R" and "O" flags are stored in the :mailheader:`Status` header, and the
9957db96d56Sopenharmony_ci   "D", "F", and "A" flags are stored in the :mailheader:`X-Status` header. The
9967db96d56Sopenharmony_ci   flags and headers typically appear in the order mentioned.
9977db96d56Sopenharmony_ci
9987db96d56Sopenharmony_ci   :class:`mboxMessage` instances offer the following methods:
9997db96d56Sopenharmony_ci
10007db96d56Sopenharmony_ci
10017db96d56Sopenharmony_ci   .. method:: get_from()
10027db96d56Sopenharmony_ci
10037db96d56Sopenharmony_ci      Return a string representing the "From " line that marks the start of the
10047db96d56Sopenharmony_ci      message in an mbox mailbox. The leading "From " and the trailing newline
10057db96d56Sopenharmony_ci      are excluded.
10067db96d56Sopenharmony_ci
10077db96d56Sopenharmony_ci
10087db96d56Sopenharmony_ci   .. method:: set_from(from_, time_=None)
10097db96d56Sopenharmony_ci
10107db96d56Sopenharmony_ci      Set the "From " line to *from_*, which should be specified without a
10117db96d56Sopenharmony_ci      leading "From " or trailing newline. For convenience, *time_* may be
10127db96d56Sopenharmony_ci      specified and will be formatted appropriately and appended to *from_*. If
10137db96d56Sopenharmony_ci      *time_* is specified, it should be a :class:`time.struct_time` instance, a
10147db96d56Sopenharmony_ci      tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use
10157db96d56Sopenharmony_ci      :meth:`time.gmtime`).
10167db96d56Sopenharmony_ci
10177db96d56Sopenharmony_ci
10187db96d56Sopenharmony_ci   .. method:: get_flags()
10197db96d56Sopenharmony_ci
10207db96d56Sopenharmony_ci      Return a string specifying the flags that are currently set. If the
10217db96d56Sopenharmony_ci      message complies with the conventional format, the result is the
10227db96d56Sopenharmony_ci      concatenation in the following order of zero or one occurrence of each of
10237db96d56Sopenharmony_ci      ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``.
10247db96d56Sopenharmony_ci
10257db96d56Sopenharmony_ci
10267db96d56Sopenharmony_ci   .. method:: set_flags(flags)
10277db96d56Sopenharmony_ci
10287db96d56Sopenharmony_ci      Set the flags specified by *flags* and unset all others. Parameter *flags*
10297db96d56Sopenharmony_ci      should be the concatenation in any order of zero or more occurrences of
10307db96d56Sopenharmony_ci      each of ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``.
10317db96d56Sopenharmony_ci
10327db96d56Sopenharmony_ci
10337db96d56Sopenharmony_ci   .. method:: add_flag(flag)
10347db96d56Sopenharmony_ci
10357db96d56Sopenharmony_ci      Set the flag(s) specified by *flag* without changing other flags. To add
10367db96d56Sopenharmony_ci      more than one flag at a time, *flag* may be a string of more than one
10377db96d56Sopenharmony_ci      character.
10387db96d56Sopenharmony_ci
10397db96d56Sopenharmony_ci
10407db96d56Sopenharmony_ci   .. method:: remove_flag(flag)
10417db96d56Sopenharmony_ci
10427db96d56Sopenharmony_ci      Unset the flag(s) specified by *flag* without changing other flags. To
10437db96d56Sopenharmony_ci      remove more than one flag at a time, *flag* maybe a string of more than
10447db96d56Sopenharmony_ci      one character.
10457db96d56Sopenharmony_ci
10467db96d56Sopenharmony_ciWhen an :class:`mboxMessage` instance is created based upon a
10477db96d56Sopenharmony_ci:class:`MaildirMessage` instance, a "From " line is generated based upon the
10487db96d56Sopenharmony_ci:class:`MaildirMessage` instance's delivery date, and the following conversions
10497db96d56Sopenharmony_citake place:
10507db96d56Sopenharmony_ci
10517db96d56Sopenharmony_ci+-----------------+-------------------------------+
10527db96d56Sopenharmony_ci| Resulting state | :class:`MaildirMessage` state |
10537db96d56Sopenharmony_ci+=================+===============================+
10547db96d56Sopenharmony_ci| R flag          | S flag                        |
10557db96d56Sopenharmony_ci+-----------------+-------------------------------+
10567db96d56Sopenharmony_ci| O flag          | "cur" subdirectory            |
10577db96d56Sopenharmony_ci+-----------------+-------------------------------+
10587db96d56Sopenharmony_ci| D flag          | T flag                        |
10597db96d56Sopenharmony_ci+-----------------+-------------------------------+
10607db96d56Sopenharmony_ci| F flag          | F flag                        |
10617db96d56Sopenharmony_ci+-----------------+-------------------------------+
10627db96d56Sopenharmony_ci| A flag          | R flag                        |
10637db96d56Sopenharmony_ci+-----------------+-------------------------------+
10647db96d56Sopenharmony_ci
10657db96d56Sopenharmony_ciWhen an :class:`mboxMessage` instance is created based upon an
10667db96d56Sopenharmony_ci:class:`MHMessage` instance, the following conversions take place:
10677db96d56Sopenharmony_ci
10687db96d56Sopenharmony_ci+-------------------+--------------------------+
10697db96d56Sopenharmony_ci| Resulting state   | :class:`MHMessage` state |
10707db96d56Sopenharmony_ci+===================+==========================+
10717db96d56Sopenharmony_ci| R flag and O flag | no "unseen" sequence     |
10727db96d56Sopenharmony_ci+-------------------+--------------------------+
10737db96d56Sopenharmony_ci| O flag            | "unseen" sequence        |
10747db96d56Sopenharmony_ci+-------------------+--------------------------+
10757db96d56Sopenharmony_ci| F flag            | "flagged" sequence       |
10767db96d56Sopenharmony_ci+-------------------+--------------------------+
10777db96d56Sopenharmony_ci| A flag            | "replied" sequence       |
10787db96d56Sopenharmony_ci+-------------------+--------------------------+
10797db96d56Sopenharmony_ci
10807db96d56Sopenharmony_ciWhen an :class:`mboxMessage` instance is created based upon a
10817db96d56Sopenharmony_ci:class:`BabylMessage` instance, the following conversions take place:
10827db96d56Sopenharmony_ci
10837db96d56Sopenharmony_ci+-------------------+-----------------------------+
10847db96d56Sopenharmony_ci| Resulting state   | :class:`BabylMessage` state |
10857db96d56Sopenharmony_ci+===================+=============================+
10867db96d56Sopenharmony_ci| R flag and O flag | no "unseen" label           |
10877db96d56Sopenharmony_ci+-------------------+-----------------------------+
10887db96d56Sopenharmony_ci| O flag            | "unseen" label              |
10897db96d56Sopenharmony_ci+-------------------+-----------------------------+
10907db96d56Sopenharmony_ci| D flag            | "deleted" label             |
10917db96d56Sopenharmony_ci+-------------------+-----------------------------+
10927db96d56Sopenharmony_ci| A flag            | "answered" label            |
10937db96d56Sopenharmony_ci+-------------------+-----------------------------+
10947db96d56Sopenharmony_ci
10957db96d56Sopenharmony_ciWhen a :class:`Message` instance is created based upon an :class:`MMDFMessage`
10967db96d56Sopenharmony_ciinstance, the "From " line is copied and all flags directly correspond:
10977db96d56Sopenharmony_ci
10987db96d56Sopenharmony_ci+-----------------+----------------------------+
10997db96d56Sopenharmony_ci| Resulting state | :class:`MMDFMessage` state |
11007db96d56Sopenharmony_ci+=================+============================+
11017db96d56Sopenharmony_ci| R flag          | R flag                     |
11027db96d56Sopenharmony_ci+-----------------+----------------------------+
11037db96d56Sopenharmony_ci| O flag          | O flag                     |
11047db96d56Sopenharmony_ci+-----------------+----------------------------+
11057db96d56Sopenharmony_ci| D flag          | D flag                     |
11067db96d56Sopenharmony_ci+-----------------+----------------------------+
11077db96d56Sopenharmony_ci| F flag          | F flag                     |
11087db96d56Sopenharmony_ci+-----------------+----------------------------+
11097db96d56Sopenharmony_ci| A flag          | A flag                     |
11107db96d56Sopenharmony_ci+-----------------+----------------------------+
11117db96d56Sopenharmony_ci
11127db96d56Sopenharmony_ci
11137db96d56Sopenharmony_ci.. _mailbox-mhmessage:
11147db96d56Sopenharmony_ci
11157db96d56Sopenharmony_ci:class:`MHMessage`
11167db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^
11177db96d56Sopenharmony_ci
11187db96d56Sopenharmony_ci
11197db96d56Sopenharmony_ci.. class:: MHMessage(message=None)
11207db96d56Sopenharmony_ci
11217db96d56Sopenharmony_ci   A message with MH-specific behaviors. Parameter *message* has the same meaning
11227db96d56Sopenharmony_ci   as with the :class:`Message` constructor.
11237db96d56Sopenharmony_ci
11247db96d56Sopenharmony_ci   MH messages do not support marks or flags in the traditional sense, but they
11257db96d56Sopenharmony_ci   do support sequences, which are logical groupings of arbitrary messages. Some
11267db96d56Sopenharmony_ci   mail reading programs (although not the standard :program:`mh` and
11277db96d56Sopenharmony_ci   :program:`nmh`) use sequences in much the same way flags are used with other
11287db96d56Sopenharmony_ci   formats, as follows:
11297db96d56Sopenharmony_ci
11307db96d56Sopenharmony_ci   +----------+------------------------------------------+
11317db96d56Sopenharmony_ci   | Sequence | Explanation                              |
11327db96d56Sopenharmony_ci   +==========+==========================================+
11337db96d56Sopenharmony_ci   | unseen   | Not read, but previously detected by MUA |
11347db96d56Sopenharmony_ci   +----------+------------------------------------------+
11357db96d56Sopenharmony_ci   | replied  | Replied to                               |
11367db96d56Sopenharmony_ci   +----------+------------------------------------------+
11377db96d56Sopenharmony_ci   | flagged  | Marked as important                      |
11387db96d56Sopenharmony_ci   +----------+------------------------------------------+
11397db96d56Sopenharmony_ci
11407db96d56Sopenharmony_ci   :class:`MHMessage` instances offer the following methods:
11417db96d56Sopenharmony_ci
11427db96d56Sopenharmony_ci
11437db96d56Sopenharmony_ci   .. method:: get_sequences()
11447db96d56Sopenharmony_ci
11457db96d56Sopenharmony_ci      Return a list of the names of sequences that include this message.
11467db96d56Sopenharmony_ci
11477db96d56Sopenharmony_ci
11487db96d56Sopenharmony_ci   .. method:: set_sequences(sequences)
11497db96d56Sopenharmony_ci
11507db96d56Sopenharmony_ci      Set the list of sequences that include this message.
11517db96d56Sopenharmony_ci
11527db96d56Sopenharmony_ci
11537db96d56Sopenharmony_ci   .. method:: add_sequence(sequence)
11547db96d56Sopenharmony_ci
11557db96d56Sopenharmony_ci      Add *sequence* to the list of sequences that include this message.
11567db96d56Sopenharmony_ci
11577db96d56Sopenharmony_ci
11587db96d56Sopenharmony_ci   .. method:: remove_sequence(sequence)
11597db96d56Sopenharmony_ci
11607db96d56Sopenharmony_ci      Remove *sequence* from the list of sequences that include this message.
11617db96d56Sopenharmony_ci
11627db96d56Sopenharmony_ciWhen an :class:`MHMessage` instance is created based upon a
11637db96d56Sopenharmony_ci:class:`MaildirMessage` instance, the following conversions take place:
11647db96d56Sopenharmony_ci
11657db96d56Sopenharmony_ci+--------------------+-------------------------------+
11667db96d56Sopenharmony_ci| Resulting state    | :class:`MaildirMessage` state |
11677db96d56Sopenharmony_ci+====================+===============================+
11687db96d56Sopenharmony_ci| "unseen" sequence  | no S flag                     |
11697db96d56Sopenharmony_ci+--------------------+-------------------------------+
11707db96d56Sopenharmony_ci| "replied" sequence | R flag                        |
11717db96d56Sopenharmony_ci+--------------------+-------------------------------+
11727db96d56Sopenharmony_ci| "flagged" sequence | F flag                        |
11737db96d56Sopenharmony_ci+--------------------+-------------------------------+
11747db96d56Sopenharmony_ci
11757db96d56Sopenharmony_ciWhen an :class:`MHMessage` instance is created based upon an
11767db96d56Sopenharmony_ci:class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status`
11777db96d56Sopenharmony_ciand :mailheader:`X-Status` headers are omitted and the following conversions
11787db96d56Sopenharmony_citake place:
11797db96d56Sopenharmony_ci
11807db96d56Sopenharmony_ci+--------------------+----------------------------------------------+
11817db96d56Sopenharmony_ci| Resulting state    | :class:`mboxMessage` or :class:`MMDFMessage` |
11827db96d56Sopenharmony_ci|                    | state                                        |
11837db96d56Sopenharmony_ci+====================+==============================================+
11847db96d56Sopenharmony_ci| "unseen" sequence  | no R flag                                    |
11857db96d56Sopenharmony_ci+--------------------+----------------------------------------------+
11867db96d56Sopenharmony_ci| "replied" sequence | A flag                                       |
11877db96d56Sopenharmony_ci+--------------------+----------------------------------------------+
11887db96d56Sopenharmony_ci| "flagged" sequence | F flag                                       |
11897db96d56Sopenharmony_ci+--------------------+----------------------------------------------+
11907db96d56Sopenharmony_ci
11917db96d56Sopenharmony_ciWhen an :class:`MHMessage` instance is created based upon a
11927db96d56Sopenharmony_ci:class:`BabylMessage` instance, the following conversions take place:
11937db96d56Sopenharmony_ci
11947db96d56Sopenharmony_ci+--------------------+-----------------------------+
11957db96d56Sopenharmony_ci| Resulting state    | :class:`BabylMessage` state |
11967db96d56Sopenharmony_ci+====================+=============================+
11977db96d56Sopenharmony_ci| "unseen" sequence  | "unseen" label              |
11987db96d56Sopenharmony_ci+--------------------+-----------------------------+
11997db96d56Sopenharmony_ci| "replied" sequence | "answered" label            |
12007db96d56Sopenharmony_ci+--------------------+-----------------------------+
12017db96d56Sopenharmony_ci
12027db96d56Sopenharmony_ci
12037db96d56Sopenharmony_ci.. _mailbox-babylmessage:
12047db96d56Sopenharmony_ci
12057db96d56Sopenharmony_ci:class:`BabylMessage`
12067db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^
12077db96d56Sopenharmony_ci
12087db96d56Sopenharmony_ci
12097db96d56Sopenharmony_ci.. class:: BabylMessage(message=None)
12107db96d56Sopenharmony_ci
12117db96d56Sopenharmony_ci   A message with Babyl-specific behaviors. Parameter *message* has the same
12127db96d56Sopenharmony_ci   meaning as with the :class:`Message` constructor.
12137db96d56Sopenharmony_ci
12147db96d56Sopenharmony_ci   Certain message labels, called :dfn:`attributes`, are defined by convention
12157db96d56Sopenharmony_ci   to have special meanings. The attributes are as follows:
12167db96d56Sopenharmony_ci
12177db96d56Sopenharmony_ci   +-----------+------------------------------------------+
12187db96d56Sopenharmony_ci   | Label     | Explanation                              |
12197db96d56Sopenharmony_ci   +===========+==========================================+
12207db96d56Sopenharmony_ci   | unseen    | Not read, but previously detected by MUA |
12217db96d56Sopenharmony_ci   +-----------+------------------------------------------+
12227db96d56Sopenharmony_ci   | deleted   | Marked for subsequent deletion           |
12237db96d56Sopenharmony_ci   +-----------+------------------------------------------+
12247db96d56Sopenharmony_ci   | filed     | Copied to another file or mailbox        |
12257db96d56Sopenharmony_ci   +-----------+------------------------------------------+
12267db96d56Sopenharmony_ci   | answered  | Replied to                               |
12277db96d56Sopenharmony_ci   +-----------+------------------------------------------+
12287db96d56Sopenharmony_ci   | forwarded | Forwarded                                |
12297db96d56Sopenharmony_ci   +-----------+------------------------------------------+
12307db96d56Sopenharmony_ci   | edited    | Modified by the user                     |
12317db96d56Sopenharmony_ci   +-----------+------------------------------------------+
12327db96d56Sopenharmony_ci   | resent    | Resent                                   |
12337db96d56Sopenharmony_ci   +-----------+------------------------------------------+
12347db96d56Sopenharmony_ci
12357db96d56Sopenharmony_ci   By default, Rmail displays only visible headers. The :class:`BabylMessage`
12367db96d56Sopenharmony_ci   class, though, uses the original headers because they are more
12377db96d56Sopenharmony_ci   complete. Visible headers may be accessed explicitly if desired.
12387db96d56Sopenharmony_ci
12397db96d56Sopenharmony_ci   :class:`BabylMessage` instances offer the following methods:
12407db96d56Sopenharmony_ci
12417db96d56Sopenharmony_ci
12427db96d56Sopenharmony_ci   .. method:: get_labels()
12437db96d56Sopenharmony_ci
12447db96d56Sopenharmony_ci      Return a list of labels on the message.
12457db96d56Sopenharmony_ci
12467db96d56Sopenharmony_ci
12477db96d56Sopenharmony_ci   .. method:: set_labels(labels)
12487db96d56Sopenharmony_ci
12497db96d56Sopenharmony_ci      Set the list of labels on the message to *labels*.
12507db96d56Sopenharmony_ci
12517db96d56Sopenharmony_ci
12527db96d56Sopenharmony_ci   .. method:: add_label(label)
12537db96d56Sopenharmony_ci
12547db96d56Sopenharmony_ci      Add *label* to the list of labels on the message.
12557db96d56Sopenharmony_ci
12567db96d56Sopenharmony_ci
12577db96d56Sopenharmony_ci   .. method:: remove_label(label)
12587db96d56Sopenharmony_ci
12597db96d56Sopenharmony_ci      Remove *label* from the list of labels on the message.
12607db96d56Sopenharmony_ci
12617db96d56Sopenharmony_ci
12627db96d56Sopenharmony_ci   .. method:: get_visible()
12637db96d56Sopenharmony_ci
12647db96d56Sopenharmony_ci      Return an :class:`Message` instance whose headers are the message's
12657db96d56Sopenharmony_ci      visible headers and whose body is empty.
12667db96d56Sopenharmony_ci
12677db96d56Sopenharmony_ci
12687db96d56Sopenharmony_ci   .. method:: set_visible(visible)
12697db96d56Sopenharmony_ci
12707db96d56Sopenharmony_ci      Set the message's visible headers to be the same as the headers in
12717db96d56Sopenharmony_ci      *message*.  Parameter *visible* should be a :class:`Message` instance, an
12727db96d56Sopenharmony_ci      :class:`email.message.Message` instance, a string, or a file-like object
12737db96d56Sopenharmony_ci      (which should be open in text mode).
12747db96d56Sopenharmony_ci
12757db96d56Sopenharmony_ci
12767db96d56Sopenharmony_ci   .. method:: update_visible()
12777db96d56Sopenharmony_ci
12787db96d56Sopenharmony_ci      When a :class:`BabylMessage` instance's original headers are modified, the
12797db96d56Sopenharmony_ci      visible headers are not automatically modified to correspond. This method
12807db96d56Sopenharmony_ci      updates the visible headers as follows: each visible header with a
12817db96d56Sopenharmony_ci      corresponding original header is set to the value of the original header,
12827db96d56Sopenharmony_ci      each visible header without a corresponding original header is removed,
12837db96d56Sopenharmony_ci      and any of :mailheader:`Date`, :mailheader:`From`, :mailheader:`Reply-To`,
12847db96d56Sopenharmony_ci      :mailheader:`To`, :mailheader:`CC`, and :mailheader:`Subject` that are
12857db96d56Sopenharmony_ci      present in the original headers but not the visible headers are added to
12867db96d56Sopenharmony_ci      the visible headers.
12877db96d56Sopenharmony_ci
12887db96d56Sopenharmony_ciWhen a :class:`BabylMessage` instance is created based upon a
12897db96d56Sopenharmony_ci:class:`MaildirMessage` instance, the following conversions take place:
12907db96d56Sopenharmony_ci
12917db96d56Sopenharmony_ci+-------------------+-------------------------------+
12927db96d56Sopenharmony_ci| Resulting state   | :class:`MaildirMessage` state |
12937db96d56Sopenharmony_ci+===================+===============================+
12947db96d56Sopenharmony_ci| "unseen" label    | no S flag                     |
12957db96d56Sopenharmony_ci+-------------------+-------------------------------+
12967db96d56Sopenharmony_ci| "deleted" label   | T flag                        |
12977db96d56Sopenharmony_ci+-------------------+-------------------------------+
12987db96d56Sopenharmony_ci| "answered" label  | R flag                        |
12997db96d56Sopenharmony_ci+-------------------+-------------------------------+
13007db96d56Sopenharmony_ci| "forwarded" label | P flag                        |
13017db96d56Sopenharmony_ci+-------------------+-------------------------------+
13027db96d56Sopenharmony_ci
13037db96d56Sopenharmony_ciWhen a :class:`BabylMessage` instance is created based upon an
13047db96d56Sopenharmony_ci:class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status`
13057db96d56Sopenharmony_ciand :mailheader:`X-Status` headers are omitted and the following conversions
13067db96d56Sopenharmony_citake place:
13077db96d56Sopenharmony_ci
13087db96d56Sopenharmony_ci+------------------+----------------------------------------------+
13097db96d56Sopenharmony_ci| Resulting state  | :class:`mboxMessage` or :class:`MMDFMessage` |
13107db96d56Sopenharmony_ci|                  | state                                        |
13117db96d56Sopenharmony_ci+==================+==============================================+
13127db96d56Sopenharmony_ci| "unseen" label   | no R flag                                    |
13137db96d56Sopenharmony_ci+------------------+----------------------------------------------+
13147db96d56Sopenharmony_ci| "deleted" label  | D flag                                       |
13157db96d56Sopenharmony_ci+------------------+----------------------------------------------+
13167db96d56Sopenharmony_ci| "answered" label | A flag                                       |
13177db96d56Sopenharmony_ci+------------------+----------------------------------------------+
13187db96d56Sopenharmony_ci
13197db96d56Sopenharmony_ciWhen a :class:`BabylMessage` instance is created based upon an
13207db96d56Sopenharmony_ci:class:`MHMessage` instance, the following conversions take place:
13217db96d56Sopenharmony_ci
13227db96d56Sopenharmony_ci+------------------+--------------------------+
13237db96d56Sopenharmony_ci| Resulting state  | :class:`MHMessage` state |
13247db96d56Sopenharmony_ci+==================+==========================+
13257db96d56Sopenharmony_ci| "unseen" label   | "unseen" sequence        |
13267db96d56Sopenharmony_ci+------------------+--------------------------+
13277db96d56Sopenharmony_ci| "answered" label | "replied" sequence       |
13287db96d56Sopenharmony_ci+------------------+--------------------------+
13297db96d56Sopenharmony_ci
13307db96d56Sopenharmony_ci
13317db96d56Sopenharmony_ci.. _mailbox-mmdfmessage:
13327db96d56Sopenharmony_ci
13337db96d56Sopenharmony_ci:class:`MMDFMessage`
13347db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^
13357db96d56Sopenharmony_ci
13367db96d56Sopenharmony_ci
13377db96d56Sopenharmony_ci.. class:: MMDFMessage(message=None)
13387db96d56Sopenharmony_ci
13397db96d56Sopenharmony_ci   A message with MMDF-specific behaviors. Parameter *message* has the same meaning
13407db96d56Sopenharmony_ci   as with the :class:`Message` constructor.
13417db96d56Sopenharmony_ci
13427db96d56Sopenharmony_ci   As with message in an mbox mailbox, MMDF messages are stored with the
13437db96d56Sopenharmony_ci   sender's address and the delivery date in an initial line beginning with
13447db96d56Sopenharmony_ci   "From ".  Likewise, flags that indicate the state of the message are
13457db96d56Sopenharmony_ci   typically stored in :mailheader:`Status` and :mailheader:`X-Status` headers.
13467db96d56Sopenharmony_ci
13477db96d56Sopenharmony_ci   Conventional flags for MMDF messages are identical to those of mbox message
13487db96d56Sopenharmony_ci   and are as follows:
13497db96d56Sopenharmony_ci
13507db96d56Sopenharmony_ci   +------+----------+--------------------------------+
13517db96d56Sopenharmony_ci   | Flag | Meaning  | Explanation                    |
13527db96d56Sopenharmony_ci   +======+==========+================================+
13537db96d56Sopenharmony_ci   | R    | Read     | Read                           |
13547db96d56Sopenharmony_ci   +------+----------+--------------------------------+
13557db96d56Sopenharmony_ci   | O    | Old      | Previously detected by MUA     |
13567db96d56Sopenharmony_ci   +------+----------+--------------------------------+
13577db96d56Sopenharmony_ci   | D    | Deleted  | Marked for subsequent deletion |
13587db96d56Sopenharmony_ci   +------+----------+--------------------------------+
13597db96d56Sopenharmony_ci   | F    | Flagged  | Marked as important            |
13607db96d56Sopenharmony_ci   +------+----------+--------------------------------+
13617db96d56Sopenharmony_ci   | A    | Answered | Replied to                     |
13627db96d56Sopenharmony_ci   +------+----------+--------------------------------+
13637db96d56Sopenharmony_ci
13647db96d56Sopenharmony_ci   The "R" and "O" flags are stored in the :mailheader:`Status` header, and the
13657db96d56Sopenharmony_ci   "D", "F", and "A" flags are stored in the :mailheader:`X-Status` header. The
13667db96d56Sopenharmony_ci   flags and headers typically appear in the order mentioned.
13677db96d56Sopenharmony_ci
13687db96d56Sopenharmony_ci   :class:`MMDFMessage` instances offer the following methods, which are
13697db96d56Sopenharmony_ci   identical to those offered by :class:`mboxMessage`:
13707db96d56Sopenharmony_ci
13717db96d56Sopenharmony_ci
13727db96d56Sopenharmony_ci   .. method:: get_from()
13737db96d56Sopenharmony_ci
13747db96d56Sopenharmony_ci      Return a string representing the "From " line that marks the start of the
13757db96d56Sopenharmony_ci      message in an mbox mailbox. The leading "From " and the trailing newline
13767db96d56Sopenharmony_ci      are excluded.
13777db96d56Sopenharmony_ci
13787db96d56Sopenharmony_ci
13797db96d56Sopenharmony_ci   .. method:: set_from(from_, time_=None)
13807db96d56Sopenharmony_ci
13817db96d56Sopenharmony_ci      Set the "From " line to *from_*, which should be specified without a
13827db96d56Sopenharmony_ci      leading "From " or trailing newline. For convenience, *time_* may be
13837db96d56Sopenharmony_ci      specified and will be formatted appropriately and appended to *from_*. If
13847db96d56Sopenharmony_ci      *time_* is specified, it should be a :class:`time.struct_time` instance, a
13857db96d56Sopenharmony_ci      tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use
13867db96d56Sopenharmony_ci      :meth:`time.gmtime`).
13877db96d56Sopenharmony_ci
13887db96d56Sopenharmony_ci
13897db96d56Sopenharmony_ci   .. method:: get_flags()
13907db96d56Sopenharmony_ci
13917db96d56Sopenharmony_ci      Return a string specifying the flags that are currently set. If the
13927db96d56Sopenharmony_ci      message complies with the conventional format, the result is the
13937db96d56Sopenharmony_ci      concatenation in the following order of zero or one occurrence of each of
13947db96d56Sopenharmony_ci      ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``.
13957db96d56Sopenharmony_ci
13967db96d56Sopenharmony_ci
13977db96d56Sopenharmony_ci   .. method:: set_flags(flags)
13987db96d56Sopenharmony_ci
13997db96d56Sopenharmony_ci      Set the flags specified by *flags* and unset all others. Parameter *flags*
14007db96d56Sopenharmony_ci      should be the concatenation in any order of zero or more occurrences of
14017db96d56Sopenharmony_ci      each of ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``.
14027db96d56Sopenharmony_ci
14037db96d56Sopenharmony_ci
14047db96d56Sopenharmony_ci   .. method:: add_flag(flag)
14057db96d56Sopenharmony_ci
14067db96d56Sopenharmony_ci      Set the flag(s) specified by *flag* without changing other flags. To add
14077db96d56Sopenharmony_ci      more than one flag at a time, *flag* may be a string of more than one
14087db96d56Sopenharmony_ci      character.
14097db96d56Sopenharmony_ci
14107db96d56Sopenharmony_ci
14117db96d56Sopenharmony_ci   .. method:: remove_flag(flag)
14127db96d56Sopenharmony_ci
14137db96d56Sopenharmony_ci      Unset the flag(s) specified by *flag* without changing other flags. To
14147db96d56Sopenharmony_ci      remove more than one flag at a time, *flag* maybe a string of more than
14157db96d56Sopenharmony_ci      one character.
14167db96d56Sopenharmony_ci
14177db96d56Sopenharmony_ciWhen an :class:`MMDFMessage` instance is created based upon a
14187db96d56Sopenharmony_ci:class:`MaildirMessage` instance, a "From " line is generated based upon the
14197db96d56Sopenharmony_ci:class:`MaildirMessage` instance's delivery date, and the following conversions
14207db96d56Sopenharmony_citake place:
14217db96d56Sopenharmony_ci
14227db96d56Sopenharmony_ci+-----------------+-------------------------------+
14237db96d56Sopenharmony_ci| Resulting state | :class:`MaildirMessage` state |
14247db96d56Sopenharmony_ci+=================+===============================+
14257db96d56Sopenharmony_ci| R flag          | S flag                        |
14267db96d56Sopenharmony_ci+-----------------+-------------------------------+
14277db96d56Sopenharmony_ci| O flag          | "cur" subdirectory            |
14287db96d56Sopenharmony_ci+-----------------+-------------------------------+
14297db96d56Sopenharmony_ci| D flag          | T flag                        |
14307db96d56Sopenharmony_ci+-----------------+-------------------------------+
14317db96d56Sopenharmony_ci| F flag          | F flag                        |
14327db96d56Sopenharmony_ci+-----------------+-------------------------------+
14337db96d56Sopenharmony_ci| A flag          | R flag                        |
14347db96d56Sopenharmony_ci+-----------------+-------------------------------+
14357db96d56Sopenharmony_ci
14367db96d56Sopenharmony_ciWhen an :class:`MMDFMessage` instance is created based upon an
14377db96d56Sopenharmony_ci:class:`MHMessage` instance, the following conversions take place:
14387db96d56Sopenharmony_ci
14397db96d56Sopenharmony_ci+-------------------+--------------------------+
14407db96d56Sopenharmony_ci| Resulting state   | :class:`MHMessage` state |
14417db96d56Sopenharmony_ci+===================+==========================+
14427db96d56Sopenharmony_ci| R flag and O flag | no "unseen" sequence     |
14437db96d56Sopenharmony_ci+-------------------+--------------------------+
14447db96d56Sopenharmony_ci| O flag            | "unseen" sequence        |
14457db96d56Sopenharmony_ci+-------------------+--------------------------+
14467db96d56Sopenharmony_ci| F flag            | "flagged" sequence       |
14477db96d56Sopenharmony_ci+-------------------+--------------------------+
14487db96d56Sopenharmony_ci| A flag            | "replied" sequence       |
14497db96d56Sopenharmony_ci+-------------------+--------------------------+
14507db96d56Sopenharmony_ci
14517db96d56Sopenharmony_ciWhen an :class:`MMDFMessage` instance is created based upon a
14527db96d56Sopenharmony_ci:class:`BabylMessage` instance, the following conversions take place:
14537db96d56Sopenharmony_ci
14547db96d56Sopenharmony_ci+-------------------+-----------------------------+
14557db96d56Sopenharmony_ci| Resulting state   | :class:`BabylMessage` state |
14567db96d56Sopenharmony_ci+===================+=============================+
14577db96d56Sopenharmony_ci| R flag and O flag | no "unseen" label           |
14587db96d56Sopenharmony_ci+-------------------+-----------------------------+
14597db96d56Sopenharmony_ci| O flag            | "unseen" label              |
14607db96d56Sopenharmony_ci+-------------------+-----------------------------+
14617db96d56Sopenharmony_ci| D flag            | "deleted" label             |
14627db96d56Sopenharmony_ci+-------------------+-----------------------------+
14637db96d56Sopenharmony_ci| A flag            | "answered" label            |
14647db96d56Sopenharmony_ci+-------------------+-----------------------------+
14657db96d56Sopenharmony_ci
14667db96d56Sopenharmony_ciWhen an :class:`MMDFMessage` instance is created based upon an
14677db96d56Sopenharmony_ci:class:`mboxMessage` instance, the "From " line is copied and all flags directly
14687db96d56Sopenharmony_cicorrespond:
14697db96d56Sopenharmony_ci
14707db96d56Sopenharmony_ci+-----------------+----------------------------+
14717db96d56Sopenharmony_ci| Resulting state | :class:`mboxMessage` state |
14727db96d56Sopenharmony_ci+=================+============================+
14737db96d56Sopenharmony_ci| R flag          | R flag                     |
14747db96d56Sopenharmony_ci+-----------------+----------------------------+
14757db96d56Sopenharmony_ci| O flag          | O flag                     |
14767db96d56Sopenharmony_ci+-----------------+----------------------------+
14777db96d56Sopenharmony_ci| D flag          | D flag                     |
14787db96d56Sopenharmony_ci+-----------------+----------------------------+
14797db96d56Sopenharmony_ci| F flag          | F flag                     |
14807db96d56Sopenharmony_ci+-----------------+----------------------------+
14817db96d56Sopenharmony_ci| A flag          | A flag                     |
14827db96d56Sopenharmony_ci+-----------------+----------------------------+
14837db96d56Sopenharmony_ci
14847db96d56Sopenharmony_ci
14857db96d56Sopenharmony_ciExceptions
14867db96d56Sopenharmony_ci----------
14877db96d56Sopenharmony_ci
14887db96d56Sopenharmony_ciThe following exception classes are defined in the :mod:`mailbox` module:
14897db96d56Sopenharmony_ci
14907db96d56Sopenharmony_ci
14917db96d56Sopenharmony_ci.. exception:: Error()
14927db96d56Sopenharmony_ci
14937db96d56Sopenharmony_ci   The based class for all other module-specific exceptions.
14947db96d56Sopenharmony_ci
14957db96d56Sopenharmony_ci
14967db96d56Sopenharmony_ci.. exception:: NoSuchMailboxError()
14977db96d56Sopenharmony_ci
14987db96d56Sopenharmony_ci   Raised when a mailbox is expected but is not found, such as when instantiating a
14997db96d56Sopenharmony_ci   :class:`Mailbox` subclass with a path that does not exist (and with the *create*
15007db96d56Sopenharmony_ci   parameter set to ``False``), or when opening a folder that does not exist.
15017db96d56Sopenharmony_ci
15027db96d56Sopenharmony_ci
15037db96d56Sopenharmony_ci.. exception:: NotEmptyError()
15047db96d56Sopenharmony_ci
15057db96d56Sopenharmony_ci   Raised when a mailbox is not empty but is expected to be, such as when deleting
15067db96d56Sopenharmony_ci   a folder that contains messages.
15077db96d56Sopenharmony_ci
15087db96d56Sopenharmony_ci
15097db96d56Sopenharmony_ci.. exception:: ExternalClashError()
15107db96d56Sopenharmony_ci
15117db96d56Sopenharmony_ci   Raised when some mailbox-related condition beyond the control of the program
15127db96d56Sopenharmony_ci   causes it to be unable to proceed, such as when failing to acquire a lock that
15137db96d56Sopenharmony_ci   another program already holds a lock, or when a uniquely generated file name
15147db96d56Sopenharmony_ci   already exists.
15157db96d56Sopenharmony_ci
15167db96d56Sopenharmony_ci
15177db96d56Sopenharmony_ci.. exception:: FormatError()
15187db96d56Sopenharmony_ci
15197db96d56Sopenharmony_ci   Raised when the data in a file cannot be parsed, such as when an :class:`MH`
15207db96d56Sopenharmony_ci   instance attempts to read a corrupted :file:`.mh_sequences` file.
15217db96d56Sopenharmony_ci
15227db96d56Sopenharmony_ci
15237db96d56Sopenharmony_ci.. _mailbox-examples:
15247db96d56Sopenharmony_ci
15257db96d56Sopenharmony_ciExamples
15267db96d56Sopenharmony_ci--------
15277db96d56Sopenharmony_ci
15287db96d56Sopenharmony_ciA simple example of printing the subjects of all messages in a mailbox that seem
15297db96d56Sopenharmony_ciinteresting::
15307db96d56Sopenharmony_ci
15317db96d56Sopenharmony_ci   import mailbox
15327db96d56Sopenharmony_ci   for message in mailbox.mbox('~/mbox'):
15337db96d56Sopenharmony_ci       subject = message['subject']       # Could possibly be None.
15347db96d56Sopenharmony_ci       if subject and 'python' in subject.lower():
15357db96d56Sopenharmony_ci           print(subject)
15367db96d56Sopenharmony_ci
15377db96d56Sopenharmony_ciTo copy all mail from a Babyl mailbox to an MH mailbox, converting all of the
15387db96d56Sopenharmony_ciformat-specific information that can be converted::
15397db96d56Sopenharmony_ci
15407db96d56Sopenharmony_ci   import mailbox
15417db96d56Sopenharmony_ci   destination = mailbox.MH('~/Mail')
15427db96d56Sopenharmony_ci   destination.lock()
15437db96d56Sopenharmony_ci   for message in mailbox.Babyl('~/RMAIL'):
15447db96d56Sopenharmony_ci       destination.add(mailbox.MHMessage(message))
15457db96d56Sopenharmony_ci   destination.flush()
15467db96d56Sopenharmony_ci   destination.unlock()
15477db96d56Sopenharmony_ci
15487db96d56Sopenharmony_ciThis example sorts mail from several mailing lists into different mailboxes,
15497db96d56Sopenharmony_cibeing careful to avoid mail corruption due to concurrent modification by other
15507db96d56Sopenharmony_ciprograms, mail loss due to interruption of the program, or premature termination
15517db96d56Sopenharmony_cidue to malformed messages in the mailbox::
15527db96d56Sopenharmony_ci
15537db96d56Sopenharmony_ci   import mailbox
15547db96d56Sopenharmony_ci   import email.errors
15557db96d56Sopenharmony_ci
15567db96d56Sopenharmony_ci   list_names = ('python-list', 'python-dev', 'python-bugs')
15577db96d56Sopenharmony_ci
15587db96d56Sopenharmony_ci   boxes = {name: mailbox.mbox('~/email/%s' % name) for name in list_names}
15597db96d56Sopenharmony_ci   inbox = mailbox.Maildir('~/Maildir', factory=None)
15607db96d56Sopenharmony_ci
15617db96d56Sopenharmony_ci   for key in inbox.iterkeys():
15627db96d56Sopenharmony_ci       try:
15637db96d56Sopenharmony_ci           message = inbox[key]
15647db96d56Sopenharmony_ci       except email.errors.MessageParseError:
15657db96d56Sopenharmony_ci           continue                # The message is malformed. Just leave it.
15667db96d56Sopenharmony_ci
15677db96d56Sopenharmony_ci       for name in list_names:
15687db96d56Sopenharmony_ci           list_id = message['list-id']
15697db96d56Sopenharmony_ci           if list_id and name in list_id:
15707db96d56Sopenharmony_ci               # Get mailbox to use
15717db96d56Sopenharmony_ci               box = boxes[name]
15727db96d56Sopenharmony_ci
15737db96d56Sopenharmony_ci               # Write copy to disk before removing original.
15747db96d56Sopenharmony_ci               # If there's a crash, you might duplicate a message, but
15757db96d56Sopenharmony_ci               # that's better than losing a message completely.
15767db96d56Sopenharmony_ci               box.lock()
15777db96d56Sopenharmony_ci               box.add(message)
15787db96d56Sopenharmony_ci               box.flush()
15797db96d56Sopenharmony_ci               box.unlock()
15807db96d56Sopenharmony_ci
15817db96d56Sopenharmony_ci               # Remove original message
15827db96d56Sopenharmony_ci               inbox.lock()
15837db96d56Sopenharmony_ci               inbox.discard(key)
15847db96d56Sopenharmony_ci               inbox.flush()
15857db96d56Sopenharmony_ci               inbox.unlock()
15867db96d56Sopenharmony_ci               break               # Found destination, so stop looking.
15877db96d56Sopenharmony_ci
15887db96d56Sopenharmony_ci   for box in boxes.itervalues():
15897db96d56Sopenharmony_ci       box.close()
15907db96d56Sopenharmony_ci
1591