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