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