~malept/ubuntu/lucid/python2.6/dev-dependency-fix

« back to all changes in this revision

Viewing changes to Doc/library/mailbox.rst

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2009-02-13 12:51:00 UTC
  • Revision ID: james.westby@ubuntu.com-20090213125100-uufgcb9yeqzujpqw
Tags: upstream-2.6.1
ImportĀ upstreamĀ versionĀ 2.6.1

Show diffs side-by-side

added added

removed removed

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